Приложения командной строки
Приложения CLI выполняются из командной строки. Они полезны для создания задач cron, скриптов, утилит командной строки и многого другого.
Структура
Минимальная структура приложения CLI будет выглядеть так:
- app/config/config.php
- app/tasks/MainTask.php
- app/cli.php <– основной файл загрузки
Создание загрузчика
Как и в обычных приложениях MVC, используется файл загрузчика для инициализации приложения. Вместо файла index.php для веб-приложений, мы используем файл cli.php для загрузки приложения.
Ниже приведен пример загрузчика, используемого в этом примере.
use Phalcon\DI\FactoryDefault\CLI as CliDI,
Phalcon\CLI\Console as ConsoleApp;
define('VERSION', '1.0.0');
//Using the CLI factory default services container
$di = new CliDI();
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__)));
/**
* Register the autoloader and tell it to register the tasks directory
*/
$loader = new \Phalcon\Loader();
$loader->registerDirs(
array(
APPLICATION_PATH . '/tasks'
)
);
$loader->register();
// Load the configuration file (if any)
if(is_readable(APPLICATION_PATH . '/config/config.php')) {
$config = include APPLICATION_PATH . '/config/config.php';
$di->set('config', $config);
}
//Create a console application
$console = new ConsoleApp();
$console->setDI($di);
/**
* Process the console arguments
*/
$arguments = array();
foreach($argv as $k => $arg) {
if($k == 1) {
$arguments['task'] = $arg;
} elseif($k == 2) {
$arguments['action'] = $arg;
} elseif($k >= 3) {
$arguments['params'][] = $arg;
}
}
// define global constants for the current task and action
define('CURRENT_TASK', (isset($argv[1]) ? $argv[1] : null));
define('CURRENT_ACTION', (isset($argv[2]) ? $argv[2] : null));
try {
// handle incoming arguments
$console->handle($arguments);
}
catch (\Phalcon\Exception $e) {
echo $e->getMessage();
exit(255);
}
Этот код можно запустить, используя:
$ php app/cli.php This is the default task and the default action
Задачи
Задачи работают аналогично контроллерам. Любое приложение CLI должно иметь по крайней мере главную задачу (mainTask) и главное действие (mainAction), и каждая задача должна иметь главное действие, которое будет выполняться, если явно не указано другое действие.
Ниже приведен пример файла app/tasks/MainTask.php
class MainTask extends \Phalcon\CLI\Task
{
public function mainAction() {
echo "\nThis is the default task and the default action \n";
}
}
Обработка параметров действия
Можно передавать параметры в действия. Код для этого уже есть в примере загрузчика.
Если вы запустите приложение со следующими параметрами и действием:
class MainTask extends \Phalcon\CLI\Task
{
public function mainAction() {
echo "\nThis is the default task and the default action \n";
}
/**
* @param array $params
*/
public function testAction(array $params) {
echo sprintf('hello %s', $params[0]) . PHP_EOL;
echo sprintf('best regards, %s', $params[1]) . PHP_EOL;
}
}
$ php app/cli.php main test world universe hello world best regards, universe
Запуск задач в цепочке
Также можно запускать задачи в цепочке, если это необходимо. Для этого необходимо добавить консоль в DI:
$di->setShared('console', $console);
try {
// handle incoming arguments
$console->handle($arguments);
}
Затем вы можете использовать консоль внутри любой задачи. Ниже приведен пример измененного файла MainTask.php:
class MainTask extends \Phalcon\CLI\Task
{
public function mainAction() {
echo "\nThis is the default task and the default action \n";
$this->console->handle(array(
'task' => 'main',
'action' => 'test'
));
}
public function testAction() {
echo '\nI will get printed too!\n';
}
}
Однако, лучше расширять \Phalcon\CLI\Task и реализовывать этот тип логики там.
© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/cli.html