PHP Écouteur d'Événement de meilleures pratiques de mise en œuvre

j'essaie de créer un système de type CMS en PHP. la rendre aussi modulaire et extensible que possible.

Quelqu'un pourrait-il m'offrir le scénario de la meilleure pratique de créer un système d'écoute d'événements en PHP (une version très simplifiée du système Drupal par exemple), créer des crochets et les mettre en œuvre dans un exemple court serait également agréable.

46
demandé sur H.Josef 2010-12-17 17:06:18

5 réponses

1. Modèle De L'Observateur

vous pouvez implémenter le Modèle Observateur. En gros, vous auriez chaque chose qui peut soulever des événements être un sujet. Puis les classes/code que vous voulez écouter se lient à ce qu'il veut écouter spécifiquement. Donc, disons que vous avez un contrôleur appelé Foo. Si vous voulais l'écouter, on pourrait appeler $fooController->attach($observer);. Ensuite, chaque fois que le contrôleur voulait dire quelque chose, elle distribue l'événement à tous les observateurs.

ceci est vraiment bien adapté pour un système de notification (pour étendre ce que les classes font). Il n'est pas aussi bien adapté pour modifier le comportement du code en temps réel.

2. Motif Décorateur Vous pouvez également mettre en œuvre Motif Décorateur. Fondamentalement, vous prenez l'objet que vous souhaitez modifier, et "enveloppe" dans un nouvel objet qui fait ce que vous voulez changer. Ceci est vraiment bien adapté pour modifier et étendre le comportement (puisque vous pouvez sélectivement outrepasser les fonctionnalités de la classe wrapped).

cela fonctionne très bien si vous avez des interfaces définies et vous attendez à ce que les objets s'y conforment. Si vous n'avez pas d'interfaces (ou ne les utilisez pas correctement), la plupart de ce que le décorateur motif peut faire pour vous sera perdu.

notez aussi que ce n'est pas vraiment une façon de faire des événements, c'est une façon de modifier le comportement d'un objet.

3. Modèle De Médiateur

Vous pouvez également utiliser un Médiateur. Fondamentalement, vous auriez un médiateur qui conserve la trace de vos auditeurs. Lorsque vous voulez déclencher un événement, vous pouvez envoyer l'événement pour le médiateur. Le Médiateur peut alors garder une trace de ce que les objets d'écoute veulent recevez cet événement, et passez le message correctement.

Cela a l'avantage d'être central. Ce qui signifie que plusieurs expéditeurs peuvent envoyer le même événement, et pour les auditeurs, cela ne fait pas de différence qui l'a envoyé...

j'ai développé ce sujet dans un billet de blog.

122
répondu ircmaxell 2012-11-04 18:15:58
/*
 Example 1: 
 event::bind('blog.post.create', function($args = array())
 {
    mail('myself@me.com', 'Blog Post Published', $args['name'] . ' has been published');
});

 Example 2: 
 event::trigger('blog.post.create', $postInfo);
*/

class event
{
    public static $events = array();

    public static function trigger($event, $args = array())
    {
        if(isset(self::$events[$event]))
        {
            foreach(self::$events[$event] as $func)
            {
                call_user_func($func, $args);
            }
        }

    }

    public static function bind($event, Closure $func)
    {
        self::$events[$event][] = $func;
    }
}
31
répondu Codebeat 2018-04-24 22:25:57

C'est comme ça que je l'ai fait dans quelques projets

Tous les objets sont créés avec une fonction constructeur au lieu de new opérateur.

 $obj = _new('SomeClass', $x, $y); // instead of $obj = new SomeClass($x, $y);

cela présente de nombreux avantages par rapport à raw _new() maintient une liste de tous les objets créés.

Il y a aussi une fonction globale send($message, $params) qui itère dans cette liste et, si un objet expose une méthode "on_$message", appelle cette méthode, passage de paramètres:

function send() {
    $_ = func_get_args();
    $m = "on_" . array_shift($_);
    foreach($_all_objects as $obj)
        if(method_exists($obj, $m))
            call_user_func_array(array($obj, $m), $_);
}

Si, par exemple, send('load') appel on_load méthode pour chaque objet qui l'a défini.

11
répondu user187291 2010-12-17 15:42:01

si vous utilisez PHP 5.3 (et avez donc accès à des fermetures riches), le système event/filters en Lithium est ce que j'utiliserais comme base pour AOP design en PHP.

4
répondu scoates 2010-12-17 14:17:25

Je ne sais pas pourquoi les gens en PHP pensent qu'ils gagnent quelque chose des auditeurs. Question Simple: si je cherche des développeurs PHP, je pose simplement une question: Quels sont les problèmes et les limites de MVC?

si vous ne pouvez pas répondre à cela, vous ne devriez pas envisager de mettre en œuvre listeners ou d'ailleurs implémenter un framework.

ensuite, connaissez votre langue. PHP est un thread simple, une construction simple. Ce qui signifie que la mémoire et les objets sont spécifiques du fil. En conséquence, les auditeurs et d'autres objets stay alive en Java/C# ne devraient jamais être utilisés en php, car ils ont tendance à être coûteux à construire et compliquer l'application sans gagner assez de valeur pour les justifier.

les cadres ne sont pas soutenus, et il y a deux ans, le responsable du PPH a déclaré qu'il n'avait pas l'intention de soutenir les cadres du PPH. Cela signifie que pour obtenir un cadre pour fonctionner à moitié aussi bien que PHP natif avec PEAR, vous devez mettre en œuvre des douzaines d'addons qui prennent la mémoire, compliquent le développement et brouillent le code sans aucun avantage.

Développement PHP Standard est plus rapide et plus facile à utiliser que la plupart des cadres pour PHP. Il y a plusieurs bibliothèques de poires qui peuvent grandement vous aider dans votre tâche. N'essayez pas d'être un multithread développeur sur un seul thread système, serveur pas de valeur réelle.

si vous avez besoin de communication inter thread, laissez tomber PHP et développez dans un langage multi-thread.

N'utilisez pas la technologie à cause d'un mot à la mode. MVC est trop utilisé et 99% de la de temps à mauvais escient. Le résultat varie de systèmes lents à des structures/validation de données inadéquates. Les auditeurs sont les mêmes, à savoir ce que c'est avant de l'utiliser.

La première question avant comment puis-je? Devrait être pourquoi devrais-je? Connaître votre technologie, les tendances enseignent les mauvaises habitudes et les développeurs merdiques.

Désolé, soapbox est plus, juste fatigué de courir dans la course de l'usine de développeurs PHP qui parrot en conserve des réponses et des idéologies sans réfléchir. C'est pourquoi les développeurs Java se moquer des développeurs PHP, parce qu'ils essaient d'utiliser la technologie leur langage n'a pas été conçu pour, et le créateur a dit qu'il n'avait aucune intention de soutenir.

il y a de grands développeurs PHP là-bas, mais pas ceux qui essaient d'utiliser des cadres serrés comme Zend Framework, ou des technologies comme les contrôleurs de domaine ou les auditeurs.

-12
répondu user3225313 2014-03-27 17:46:32