Ankündigung

Einklappen
Keine Ankündigung bisher.

Hook Design

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Hook Design

    Hallo zusammen

    Hooks finde ich manchmal ganz nützlich, deshalb habe ich mir mal überlegt und ein Beispiel gemacht wie es etwa ausschauen könnte so im groben.

    Ich habe mich mal vor kurzer Zeit mit Wordpress rumgeschlagen, aber mit diesem Spagthi Code machte es einfach keinen Spass, aber wenigstens fand ich die Actions und Filters gut, aber irgendwie schlecht umgesetzt.
    Es war nämlich echt mühsam, immer wieder Doku schauen was reinkommt und was raus muss.

    Deshalb habe ich mir überlegt ein Hook sollte eine Klasse sein, damit man genau nachvollziehen kann was abgeht. Und man kann eben auch die "response" daten auf deren Richtigkeit prüfen.

    Doch was meint Ihr zu Hooks? Hier mal meinen groben Ansatz:

    PHP-Code:
    // interfaces
    interface HookInterface { public function response(); }
    interface 
    HooksInterface { } // todo

    // hooks manager
    class Hooks implements HooksInterface
    {
        
    /**
         * @var array The registered hook handlers.
         */
        
    private $handlers = [];

        
    /**
         * Register a hook handler.
         *
         * @param string The hook class name.
         * @param callable|string Any callable or a class name, which gets resolved by the DIC.
         * @param int The priority. Highest get called last.
         * @return void
         */    
        
    public function listen(string $hook$handlerint $priority 0): void
        
    {
            
    $this->handlers[$hook][$priority][] = $handler;
        }

        
    /**
         * Fire a hook and call the handlers.
         *
         * @param HookInterface
         * @return mixed The hook response.
         */    
        
    public function fire(HookInterface $hook)
        {
            
    $hookClass get_class($hook);

            
    // Just return the hook response if no hook handler is set.
            
    if (!isset($this->handlers[$hookClass])) {
                return 
    $hook->response();
            }

            
    // Sort handlers by its priority. Highest last.
            
    ksort($this->handlers[$hookClass]);

            
    // Merge into one array depth.
            
    $handlers call_user_func_array('array_merge'$this->handlers[$hookClass]);    

            
    // Call each handler
            
    foreach($handlers as $handler) {
                
    call_user_func_array($handler, [$hook]);
            }

            return 
    $hook->response();
        }
    }

    // hooks manager
    $hooks = new Hooks();

    // register hook listeners
    $hooks->listen(ArticleTitleHook::class, function(ArticleTitleHook $hook) {
        
    // do something.
        
    $hook->title 'Yellow Flower';
        return 
    $hook;
    });

    // hook example
    class ArticleTitleHook implements HookInterface
    {
        public 
    $title;
        private 
    $fallbackTitle;

        public function 
    __construct(string $titlestring $fallbackTitle '')
        {
            
    $this->title $title;
            
    $this->fallbackTitle $fallbackTitle;
        }

        public function 
    response()
        {
            return 
    is_string($this->title) ? $this->title $this->fallbackTitle;
        }    
    }

    // fire hook example.
    class Article
    {
        private 
    $hooks;
        private 
    $title '';

        public function 
    setHooks(HooksInterface $hooks): void
        
    {
            
    $this->hooks $hooks;
        }

        public function 
    setTitle(string $title): void
        
    {
            
    $this->title $title;
        }

        public function 
    getTitle(): string
        
    {
            return 
    $this->hooks->fire(new ArticleTitleHook($this->title));
        }        
    }

    $article = new Article();
    $article->setHooks($hooks);
    $article->setTitle('Flower');
    echo 
    $article->getTitle(); 


  • #2
    Zitat von strub Beitrag anzeigen
    Deshalb habe ich mir überlegt ein Hook sollte eine Klasse sein, damit man genau nachvollziehen kann was abgeht. Und man kann eben auch die "response" daten auf deren Richtigkeit prüfen.
    Guter Ansatz. Aber inwiefern unterscheidet sich das Ganze von einem Event Disptacher, mal abgesehen von der Namenswahl?

    Die Properties der Hook Klassen sollten nicht öffentlich zugänglich sein. Implementiere lieber setters und getters und führe in den setters sanitizing der übergebenen Werte durch. Ist natürlich Geschmackssache, aber ich persönlich würde das Interface Suffix (und im übrigen auch abstract und trait appendix) weglassen und mir stattdessen mehr Gedanken über die Namenswahl der konkreten Implementierungen machen.

    Kommentar


    • #3
      Hey danke dir Nipec.

      Aber inwiefern unterscheidet sich das Ganze von einem Event Disptacher,
      Ich habe mir auch schon ein Event Manager erstellt. Der Unterschied ist jedoch, dass bei einem Event keine Rückgabe erfolgt.

      Die Properties der Hook Klassen sollten nicht öffentlich zugänglich sein. Implementiere lieber setters und getters und führe in den setters santizing der übergebenen Werte durch.
      Habe ich mir auch schon überlegt. Stimmt hast du recht, dies wäre besser. Danke

      aber ich persönlich würde das Interface Suffix (und im übrigen auch abstract und trait appendix) weglassen und mir stattdessen mehr Gedanken über die Namenswahl der konkreten Implementierungen machen.
      Stimmt, schlechte Namenswahl im Beispiel Code.

      Kommentar


      • #4
        Ich habe mir auch schon ein Event Manager erstellt. Der Unterschied ist jedoch, dass bei einem Event keine Rückgabe erfolgt
        Das ist aber nur ein marginaler Unterschied. Die Stelle, die von der Hooks Instanz Gebrauch macht (in deinem Fall die Artikel Klasse) kann doch nach dem Aufruf von fire() genau so gut auf die jeweiligen Getters der konkreten Hook Implementierung zurückgreifen und sich so die etwaigen modifizierten Werte beschaffen.

        Kommentar


        • #5
          Stimmt da hast Du vollkommen recht. Habe ich auf den ersten Blick gar nicht erkannt. Danke vielmal für deine Hinweise.

          Kommentar


          • #6
            Zitat von strub Beitrag anzeigen
            Doch was meint Ihr zu Hooks? Hier mal meinen groben Ansatz:
            Welches Problem löst du damit? Du hast eine Lösung präsentiert, aber kein Problem dazu.

            Kommentar


            • #7
              Manchmal erst nachdenken dann schreiben, deswegen Post gelöscht.

              Kommentar

              Lädt...
              X