/** * @param array $config * @return CliDispatcher */ public static function createCliFrom(array $config) : CliDispatcher { $dispatcher = new CliDispatcher(); $dispatcher->setEventsManager(new EventManager()); $dispatcher->setTaskSuffix(null); $dispatcher->setDefaultNamespace($config['taskDefaultNamespace']); return $dispatcher; }
/** * CLI 模式下的 DI 配置 * * @param CLI $di */ protected function cliDI(CLI $di) { global $argv; $di->set('router', function () use($di, $argv) { $router = new CLIRouter(); $router->setDI($di); return $router; }); $di->set('output', function () { return new ConsoleOutput(); }); $di->set('dispatcher', function () use($di, $argv) { $dispatcher = new CLIDispatcher(); $dispatcher->setDI($di); $moduleName = array_shift($argv); $taskName = array_shift($argv); $actionName = 'main'; if (strpos($taskName, ':') > 0) { @(list($taskName, $actionName) = preg_split("/:/", $taskName)); } if ($moduleName) { $dispatcher->setTaskName(ucwords($taskName)); $dispatcher->setActionName($actionName); $dispatcher->setParams($argv); if ($moduleName == '_current') { $_appName = ucwords($this->getAppName()); $dispatcher->setNamespaceName("{$_appName}\\Tasks"); } else { $dispatcher->setNamespaceName("Eva\\{$moduleName}\\Tasks"); } } else { $dispatcher->setTaskName('Main'); $dispatcher->setParams($argv); $dispatcher->setNamespaceName("Eva\\EvaEngine\\Tasks"); } return $dispatcher; }); }
<?php use Phalcon\Cli\Dispatcher; /** * Set the default namespace for dispatcher */ $di->setShared('dispatcher', function () { $dispatcher = new Dispatcher(); $dispatcher->setDefaultNamespace('@@namespace@@\\Modules\\Cli\\Tasks'); return $dispatcher; });
public function testDispatcher() { $this->specify("CLI Dispatcher doesn't work with typical parameters", function () { $di = new CliFactoryDefault(); $di->set('data', function () { return "data"; }); $dispatcher = new Dispatcher(); $dispatcher->setDI($di); $dispatcher->dispatch(); expect($dispatcher->getTaskName())->equals('main'); expect($dispatcher->getActionName())->equals('main'); expect($dispatcher->getParams())->equals([]); expect($dispatcher->getReturnedValue())->equals('mainAction'); $dispatcher->setTaskName('echo'); $dispatcher->dispatch(); expect($dispatcher->getTaskName())->equals('echo'); expect($dispatcher->getActionName())->equals('main'); expect($dispatcher->getParams())->equals([]); expect($dispatcher->getReturnedValue())->equals('echoMainAction'); $dispatcher->setTaskName('main'); $dispatcher->setActionName('hello'); $dispatcher->dispatch(); expect($dispatcher->getTaskName())->equals('main'); expect($dispatcher->getActionName())->equals('hello'); expect($dispatcher->getParams())->equals([]); expect($dispatcher->getReturnedValue())->equals('Hello !'); $dispatcher->setActionName('hello'); $dispatcher->setParams(array('World', '######')); $dispatcher->dispatch(); expect($dispatcher->getTaskName())->equals('main'); expect($dispatcher->getActionName())->equals('hello'); expect($dispatcher->getParams())->equals(array('World', '######')); expect($dispatcher->getReturnedValue())->equals('Hello World######'); $dispatcher->setActionName('hello'); $dispatcher->setParams(array('hello' => 'World', 'goodbye' => 'Everybody')); $dispatcher->dispatch(); expect($dispatcher->hasParam('hello'))->true(); expect($dispatcher->hasParam('goodbye'))->true(); expect($dispatcher->hasParam('salutations'))->false(); // testing namespace try { $dispatcher->setDefaultNamespace('Dummy\\'); $dispatcher->setTaskName('main'); $dispatcher->setActionName('hello'); $dispatcher->setParams(array('World')); $dispatcher->dispatch(); expect($dispatcher->getTaskName())->equals('main'); expect($dispatcher->getActionName())->equals('hello'); expect($dispatcher->getParams())->equals(array('World')); expect($dispatcher->getReturnedValue())->equals('Hello World!'); } catch (\Exception $e) { expect($e->getMessage())->equals('Dummy\\MainTask handler class cannot be loaded'); } }); }
public function testIssue787() { $this->specify("Initializer isn't invoked if has been dispatcher call before", function () { $di = new CliFactoryDefault(); $di->setShared('dispatcher', function () use($di) { $dispatcher = new Dispatcher(); $dispatcher->setDI($di); return $dispatcher; }); $console = new Console(); $console->setDI($di); $console->handle(array('task' => 'issue787', 'action' => 'main')); expect(class_exists('Issue787Task'))->true(); $actual = \Issue787Task::$output; $expected = "beforeExecuteRoute" . PHP_EOL . "initialize" . PHP_EOL; expect($actual)->equals($expected); }); }
$this->fileName = sprintf('%s%s-%s-%s-dump.json', $this->folderName, $this->indexName, $this->typeName ? $this->typeName : 'all-types', date('Y-m-d-H-i-s', time())); } protected function checkBackupFolder() { if (!is_dir($this->folderName) && mkdir($this->folderName, 0777, true)) { $this->log->info('Каталог бэкапа {folder} отсутствовал, создали его.', ['folder' => $this->folderName]); } elseif (is_dir($this->folderName) && is_writable($this->folderName)) { $this->log->info('Каталог бэкапа {folder} уже существует и доступен для записи', ['folder' => $this->folderName]); } else { $this->log->error('Каталог бэкапа {folder} отсутствует или недоступен для создания', ['folder' => $this->folderName]); } } } $di = new CLI(); $di['dispatcher'] = function () { $dispatcher = new Dispatcher(); $dispatcher->setDefaultTask('Backup'); $dispatcher->setDefaultAction('backup'); return $dispatcher; }; $di['log'] = function () { return new Phalcon\Logger\Adapter\Stream('php://stdout'); }; try { $console = new Console($di); $handleParams = []; array_shift($argv); foreach ($argv as $param) { list($name, $value) = explode('=', $param); $handleParams[$name] = $value; }
public function run(DiInterface $diContainer, array $options = []) { $memoryUsage = memory_get_usage(); $currentTime = microtime(true); $this->diContainer = $diContainer; /** * The app path */ if (!defined('K_PATH')) { define('K_PATH', dirname(dirname(dirname(__FILE__)))); } /** * We will need the Utils class */ require_once K_PATH . '/library/Kitsune/Utils.php'; /** * Utils class */ $utils = new Utils(); $this->diContainer->set('utils', $utils, true); /** * Check if this is a CLI app or not */ $cli = $utils->fetch($options, 'cli', false); if (!defined('K_CLI')) { define('K_CLI', $cli); } $tests = $utils->fetch($options, 'tests', false); if (!defined('K_TESTS')) { define('K_TESTS', $tests); } /********************************************************************** * CONFIG **********************************************************************/ /** * The configuration is split into two different files. The first one * is the base configuration. The second one is machine/installation * specific. */ if (!file_exists(K_PATH . '/var/config/base.php')) { throw new \Exception('Base configuration files are missing'); } if (!file_exists(K_PATH . '/var/config/config.php')) { throw new \Exception('Configuration files are missing'); } /** * Get the config files and merge them */ $base = (require K_PATH . '/var/config/base.php'); $specific = (require K_PATH . '/var/config/config.php'); $combined = array_replace_recursive($base, $specific); $config = new Config($combined); $this->diContainer->set('config', $config, true); /** * Check if we are in debug/dev mode */ if (!defined('K_DEBUG')) { $debugMode = boolval($utils->fetch($config, 'debugMode', false)); define('K_DEBUG', $debugMode); } /** * Access to the debug/dev helper functions */ if (K_DEBUG) { require_once K_PATH . '/library/Kitsune/Debug.php'; } /********************************************************************** * LOADER **********************************************************************/ /** * We're a registering a set of directories taken from the * configuration file */ $loader = new Loader(); $loader->registerNamespaces($config->namespaces->toArray()); $loader->register(); require K_PATH . '/vendor/autoload.php'; /********************************************************************** * LOGGER **********************************************************************/ /** * The essential logging service */ $format = '[%date%][%type%] %message%'; $name = K_PATH . '/var/log/' . date('Y-m-d') . '-kitsune.log'; $logger = new LoggerFile($name); $formatter = new LoggerFormatter($format); $logger->setFormatter($formatter); $this->diContainer->set('logger', $logger, true); /********************************************************************** * ERROR HANDLING **********************************************************************/ ini_set('display_errors', boolval(K_DEBUG)); error_reporting(E_ALL); set_error_handler(function ($exception) use($logger) { if ($exception instanceof \Exception) { $logger->error($exception->__toString()); } else { $logger->error(json_encode(debug_backtrace())); } }); set_exception_handler(function (\Exception $exception) use($logger) { $logger->error($exception->getMessage()); }); register_shutdown_function(function () use($logger, $utils, $memoryUsage, $currentTime) { $memoryUsed = memory_get_usage() - $memoryUsage; $executionTime = microtime(true) - $currentTime; if (K_DEBUG) { $logger->info(sprintf('Shutdown completed [%s]s - [%s]', round($executionTime, 3), $utils->bytesToHuman($memoryUsed))); } }); $timezone = $config->get('app_timezone', 'US/Eastern'); date_default_timezone_set($timezone); /********************************************************************** * ROUTES **********************************************************************/ if (false === K_CLI) { $router = new Router(false); $router->removeExtraSlashes(true); $routes = $config->routes->toArray(); foreach ($routes as $pattern => $options) { $router->add($pattern, $options); } $this->diContainer->set('router', $router, true); } /********************************************************************** * DISPATCHER **********************************************************************/ if (false === K_CLI) { /** * We register the events manager */ $eventsManager = new EventsManager(); /** * Handle exceptions and not-found exceptions using NotFoundPlugin */ $eventsManager->attach('dispatch:beforeException', new NotFoundPlugin()); $dispatcher = new Dispatcher(); $dispatcher->setEventsManager($eventsManager); $dispatcher->setDefaultNamespace('Kitsune\\Controllers'); } else { $dispatcher = new PhCliDispatcher(); $dispatcher->setDefaultNamespace('Kitsune\\Cli\\Tasks'); } $this->diContainer->set('dispatcher', $dispatcher); /********************************************************************** * URL **********************************************************************/ /** * The URL component is used to generate all kind of urls in the application */ $url = new UrlProvider(); $url->setBaseUri($config->baseUri); $this->diContainer->set('url', $url); /********************************************************************** * VIEW **********************************************************************/ $view = new View(); $view->setViewsDir(K_PATH . '/app/views/'); $view->registerEngines([".volt" => function ($view) { return $this->setVoltOptions($view); }]); $this->diContainer->set('view', $view); /********************************************************************** * VIEW SIMPLE **********************************************************************/ $viewSimple = new ViewSimple(); $viewSimple->setViewsDir(K_PATH . '/app/views/'); $viewSimple->registerEngines([".volt" => function ($view) { return $this->setVoltOptions($view); }]); $this->diContainer->set('viewSimple', $viewSimple); /********************************************************************** * CACHE **********************************************************************/ $frontConfig = $config->cache_data->front->toArray(); $backConfig = $config->cache_data->back->toArray(); $class = '\\Phalcon\\Cache\\Frontend\\' . $frontConfig['adapter']; $frontCache = new $class($frontConfig['params']); $class = '\\Phalcon\\Cache\\Backend\\' . $backConfig['adapter']; $cache = new $class($frontCache, $backConfig['params']); $this->diContainer->set('cache', $cache, true); /********************************************************************** * POSTS FINDER **********************************************************************/ $this->diContainer->set('finder', new PostFinder(), true); /********************************************************************** * DISPATCH 17.5s **********************************************************************/ if (K_CLI) { return new PhCliConsole($this->diContainer); } else { $application = new Application($this->diContainer); if (K_TESTS) { return $application; } else { return $application->handle()->getContent(); } } }
use Phalcon\DI\FactoryDefault\CLI as CliDI; use Phalcon\CLI\Console as ConsoleApp; use Phalcon\Config; use Phalcon\Db\Adapter\Pdo\Mysql; use Phalcon\CLI\Dispatcher; include __DIR__ . '/../../../autoload.php'; $di = new CliDI(); $di['phadConfig'] = function () { $config = (require __DIR__ . '/../../../../phad-config.php'); return new Config($config); }; $di['db'] = function () use($di) { return new Mysql($di['phadConfig']->database->toArray()); }; $di['dispatcher'] = function () { $dispatcher = new Dispatcher(); $dispatcher->setDefaultNamespace('Argentum88\\Phad\\Tasks'); return $dispatcher; }; $console = new ConsoleApp(); $console->setDI($di); $arguments = array(); $params = array(); foreach ($argv as $k => $arg) { if ($k == 1) { $arguments['task'] = $arg; } elseif ($k == 2) { $arguments['action'] = $arg; } elseif ($k >= 3) { $params[] = $arg; }