我正在尝试用 PHP 创建一个类似 CMS 的系统。使其尽可能模块化和可扩展。
有人可以为我提供在 PHP 中创建事件侦听器系统(例如 Drupal 系统的非常简化版本)的最佳实践方案,创建挂钩并在一个简短的示例中实现它们也很好。
嗯,从实现的角度来看,确实有三种不同的方法可以做到这一点(请注意,这些是面向对象的设计模式,但如果您愿意,您可以按功能或程序实现它们)。
1.观察者模式
您可以实施观察者模式 http://sourcemaking.com/design_patterns/observer。基本上,您可以将所有可以引发事件的事物作为主题。然后你想要监听的类/代码绑定到它想要专门监听的内容。假设你有一个名为Foo
。如果你想听可以拨打电话$fooController->attach($observer);
。然后,每当控制器想要说些什么时,它就会将事件分派给所有观察者。
这确实非常适合通知系统(以扩展类正在执行的操作)。它不太适合实时修改代码的行为。
2. 装饰器模式您还可以实施装饰模式 http://sourcemaking.com/design_patterns/decorator。基本上,您获取想要修改的对象,并将其“包装”在一个新对象中,该新对象可以执行您想要更改的操作。这非常适合修改和扩展行为(因为您可以有选择地覆盖包装类的功能)。
如果您已经定义了接口并希望对象符合它们,那么这种方法非常有效。如果您没有接口(或者没有正确使用它们),装饰器模式可以为您做的大部分事情都将丢失。
另请注意,这实际上不是一种执行事件的方法,而是一种修改对象行为的方法。
3. 中介者模式
您还可以使用Mediator http://sourcemaking.com/design_patterns/mediator。基本上,您将拥有一名全球调解员来跟踪您的听众。当您想要触发一个事件时,您可以将该事件发送给中介者。然后,中介器可以跟踪哪些侦听对象想要接收该事件,并正确地传递消息。
这样做的好处是处于中心位置。这意味着多个发送者可以发送相同的事件,对于监听者来说,谁发送的并没有什么区别......
我在一篇博客文章中详细阐述了这个主题。 http://blog.ircmaxell.com/2012/03/handling-plugins-in-php.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)