Example #1
0
 /**
  * @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;
 }
Example #2
0
 /**
  * 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;
});
Example #4
0
 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');
         }
     });
 }
Example #5
0
 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;
    }
Example #7
0
 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();
         }
     }
 }
Example #8
0
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;
    }