/** * @covers addSubscriber */ public function testSuscriber() { $this->dispatcher->addSubscriber(new Sample2Listener()); $expected = 'executed Sample2Listener::onBeforeLogin(1, 2, 3)'; $expected .= 'executed Sample2Listener::onBeforeLogin2(1, 2, 3)'; $expected .= 'executed Sample2Listener::onAfterLogin(1, 2, 3)'; $this->expectOutputString($expected); $this->dispatcher->dispatch('system.before_login', new Event(array(1, 2, 3))); $this->dispatcher->dispatch('system.after_login', new Event(array(1, 2, 3))); }
/** * Construct application object * @param array $conf * @throws \Exception * @internal param \Alchemy\Contains $config all app configuration */ public function init($conf = array()) { defined('DS') || define('DS', DIRECTORY_SEPARATOR); $app = $this; $this['logger'] = null; $this['config'] = function () use($conf, $app) { $config = new Config(); $config->load($conf); if (!$config->exists('phpalchemy.root_dir')) { $config->set('phpalchemy.root_dir', realpath(__DIR__ . '/../')); } if (!empty($app->appDir)) { $config->set('app.root_dir', $app->getAppDir()); } return $config; }; // load configuration ini files $this->loadAppConfigurationFiles(); // apply configurated php settings $this->applyPhpSettings(); $this['autoloader'] = function () { return new ClassLoader(); }; $this['yaml'] = function () { return new Yaml(); }; $this['annotation'] = function () use($app) { return new NotojReader(); //return new Annotations($app['config']); }; $this['mapper'] = function () use($app) { $config = $app['config']; $routesDir = $config->get('app.root_dir') . DS . 'config' . DS; if (file_exists($routesDir . 'routes.php')) { $mapper = (include $routesDir . 'routes.php'); } elseif (file_exists($routesDir . 'routes.yaml')) { $mapper = new Mapper($app['yaml']); $mapper->setCacheDir($config->get('app.cache_dir')); $mapper->loadFrom($routesDir . 'routes.yaml'); } else { throw new \Exception("Application Error: No routes found for this app.\n" . "You need create & configure 'config/routes.yaml'"); } return $mapper; }; //TODO $this['exception_handler'] = $this->share(function () { // return new ExceptionHandler(); // }); $this['dispatcher'] = function () use($app) { $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber($app); // subscribing events $dispatcher->addSubscriber(new EventListener\ResponseListener($app['config']->get('templating.charset'))); //TODO $dispatcher->addSubscriber(new LocaleListener($app['locale'], $urlMatcher)); return $dispatcher; }; $this['resolver'] = function () use($app) { return new ControllerResolver($app, $app['logger']); }; $this['ui_reader_factory'] = function () use($app) { return new ReaderFactory(); }; $this['ui_parser'] = function () use($app) { return new Parser(); }; /** @var \Alchemy\Component\UI\Engine */ $this['ui_engine'] = function () use($app) { return new Engine($app['ui_reader_factory'], $app['ui_parser']); }; $this['assetsHandler'] = function () use($app) { return new WebAssets\Bundle(); }; /** @var \Alchemy\Kernel\Kernel */ $this['kernel'] = function () use($app) { return new Kernel($app['dispatcher'], $app['mapper'], $app['resolver'], $app['config'], $app['annotation'], $app['ui_engine'], $app['assetsHandler']); }; // registering the aplication namespace to SPL ClassLoader $this['autoloader']->register($this['config']->get('app.name'), $this['config']->get('app.app_root_dir')); // registering the aplication Extend folder to SPL ClassLoader (if folder was created) if (is_dir($this['config']->get('app.root_dir') . DIRECTORY_SEPARATOR . 'Extend')) { $this['autoloader']->register($this['config']->get('app.name') . '/Extend', $this['config']->get('app.root_dir') . DIRECTORY_SEPARATOR . 'Extend'); } $this['exception_handler'] = function () use($app) { return new ExceptionHandler(); }; }