litvinenko / app
本包的最新版本(v0.0.4)没有可用的许可证信息。
通用 Litvinenko\Common\App 类,可在 Magento 风格中分发事件并创建单例
v0.0.4
2015-09-16 14:09 UTC
Requires
- php: >=5.4.0
- litvinenko/object: *
This package is not auto-updated.
Last update: 2024-09-28 16:25:54 UTC
README
##通用 App 类
它可以
- 在 Magento 风格中分发事件(参见 http://www.solvingmagento.com/event-driven-architecture-in-magento-observer-pattern/ 或 http://codegento.com/2011/04/observers-and-dispatching-events/)
- 在 Magento 风格中创建单例(参见 http://inchoo.net/magento/making-use-of-magento-getsingleton-method/)
此类使用类似 Magento 的 XML 配置文件(参见 http://www.solvingmagento.com/event-driven-architecture-in-magento-observer-pattern/)。
##安装 只需通过 composer 安装。在你的应用目录中创建 composer.json 文件,填入
{ "require": { "litvinenko/app": "*" } }
并运行
composer install
##初始化 App 只需运行 \Litvinenko\Common\App::init() 方法,并传递配置文件的路径(默认路径是 'config.xml')。这将注册所有事件和观察者。
此应用的 XML 配置文件与 Magento XML 配置文件非常相似(参见 http://www.solvingmagento.com/event-driven-architecture-in-magento-observer-pattern/)。
它应该看起来像
<?xml version="1.0"?> <config> <!-- root element. don't care about it--> <events> <!-- (optional) element containing all event info --> <some_event_name> <!-- event name. first param for App:dispatchEvent method --> <observers> <!-- all observers for current event --> <some_observer_unique_identifier> <!-- unique observer name --> <class>MyClass</class> <!-- observer class --> <method>myMethod</method> <!-- observer method to be called --> </some_observer_unique_identifier> <second_observer> <!-- second observer --> <class>MyOtherClass</class> <method>myOtherMethod</method> <singleton>1</singleton> <!-- (optional) this param (0 or 1, true or false) tells app that observer object should be obtained with getSingleton method --> </second_observer> </observers> </some_event_name> </events> <developer_mode>0</developer_mode> <!-- (optional) this param (0 or 1, true or false) tells app that we are in developer mode--> </config>
##使用 App 分发事件:首先,初始化应用
\Litvinenko\Common\App::init()
然后,在任何需要的地方粘贴
App::dispatchEvent('event_name', array('param1' => $value1, 'param2' => $value2, ...));
例如,
App::dispatchEvent('language_learned', array('language' => $language, 'learner' => $this));
##工作示例
XML 文件 ('example_config.xml')
<?xml version="1.0"?> <config> <!-- root element. don't care about it--> <events> <!-- element containing all event info --> <language_learned> <!-- event name. first param for App:dispatchEvent method --> <observers> <!-- all observers for current event --> <logger_observer> <!-- unique observer name --> <class>Logger</class> <!-- observer class --> <method>logLearnedLanguage</method> <!-- observer method to be called --> </logger_observer> <learner_observer> <!-- seconde observer --> <class>Learner</class> <method>printLearnedLanguages</method> <singleton>1</singleton> <!-- this param (0 or 1, true or false) tells app that observer object should be obtained with getSingleton method --> </learner_observer> </observers> </language_learned> </events> <developer_mode>0</developer_mode> <!-- this param (0 or 1, true or false) tells app that we are in developer mode--> </config>
PHP 文件
<?php require 'vendor/autoload.php'; use Litvinenko\Common\App; /** * Demo class 'Learner'. * When learner learns languages, he tells App 'hey, I learned new language' (App::dispatchEvent('language_learned'...) * * Then, app dispatches this event to all registered observers */ class Learner { protected $learnedLanguages = []; public function __construct($nativeLanguage) { echo "Learner says: I know {$nativeLanguage}\n\n"; $this->learnedLanguages[] = $nativeLanguage; } public function learnLanguages(array $languages) { foreach ($languages as $language) { // .... // learning language ... $this->learnedLanguages[] = $language; // .... App::dispatchEvent('language_learned', ['language' => $language, 'learner' => $this]); } } /** * If this method is declared as SINGLETON observer for 'language_learned' event * and Learner was created with getSingleton app method, * then app will NOT initiate new Learner but will dispatch event to already existing learner, i.e. the same object will fire and handle event * * @param \Litvinenko\Common\App\Event $event */ public function printLearnedLanguages($event) { echo "Learner says: I know " . implode(', ', $this->learnedLanguages) . "\n\n"; } } class Logger { /** * Function for demonstrating event dispatching mechanism * * @param \Litvinenko\Common\App\Event $event */ public function logLearnedLanguage($event) { echo "Logger says: Hey, someone learned ". $event->getLanguage() . " language!\n"; } } try { // init app with custom config file App::init('example_config.xml'); // creating new learner with ukrainian native language $learner = App::getSingleton('Learner', ['ukrainian']); $learner->learnLanguages(['english', 'german', 'russian']); } catch (\Litvinenko\Common\App\Exception $e) { echo "App exception: " . $e->getMessage(); }