Я хотел бы выполнить действие Платформы Зенда для генерации некоторых файлов из командной строки. Действительно ли это возможно и сколько изменения я должен был бы внести в свой существующий веб-проект, который использует ZF?
Спасибо!
Просто видел, что этот был отмечен на моем CP. Если Вы споткнулись на это сообщение и используете ZF2, это стало НАМНОГО легче. Просто отредактируйте маршруты своего module.config.php как так:
/**
* Router
*/
'router' => array(
'routes' => array(
// .. these are your normal web routes, look further down
),
),
/**
* Console Routes
*/
'console' => array(
'router' => array(
'routes' => array(
/* Sample Route */
'do-cli' => array(
'options' => array(
'route' => 'do cli',
'defaults' => array(
'controller' => 'Application\Controller\Index',
'action' => 'do-cli',
),
),
),
),
),
),
Используя конфигурацию выше, Вы определили бы doCliAction в своем IndexController.php под Вашим Модулем приложения. Выполнение его является пирогом из командной строки:
php index.php делают Сделанный cli
! Более гладкий путь.
решение akond выше находится на лучшей дорожке, но существует некоторая тонкость, которая может, может его сценарий не работать в Вашей среде. Рассмотрите эти тонкие настройки к его ответу:
ошибка Bootstrap.php
protected function _initRouter()
{
if( PHP_SAPI == 'cli' )
{
$this->bootstrap( 'FrontController' );
$front = $this->getResource( 'FrontController' );
$front->setParam('disableOutputBuffering', true);
$front->setRouter( new Application_Router_Cli() );
$front->setRequest( new Zend_Controller_Request_Simple() );
}
}
Init, вероятно, блевала бы, как записано выше, обработчик ошибок, вероятно, еще не инстанцируют, если Вы не изменили конфигурацию по умолчанию.
protected function _initError ()
{
$this->bootstrap( 'FrontController' );
$front = $this->getResource( 'FrontController' );
$front->registerPlugin( new Zend_Controller_Plugin_ErrorHandler() );
$error = $front->getPlugin ('Zend_Controller_Plugin_ErrorHandler');
$error->setErrorHandlerController('index');
if (PHP_SAPI == 'cli')
{
$error->setErrorHandlerController ('error');
$error->setErrorHandlerAction ('cli');
}
}
Вы, вероятно, также, хотите к munge больше чем один параметр из командной строки, вот основной пример:
class Application_Router_Cli extends Zend_Controller_Router_Abstract
{
public function route (Zend_Controller_Request_Abstract $dispatcher)
{
$getopt = new Zend_Console_Getopt (array ());
$arguments = $getopt->getRemainingArgs();
if ($arguments)
{
$command = array_shift( $arguments );
$action = array_shift( $arguments );
if(!preg_match ('~\W~', $command) )
{
$dispatcher->setControllerName( $command );
$dispatcher->setActionName( $action );
$dispatcher->setParams( $arguments );
return $dispatcher;
}
echo "Invalid command.\n", exit;
}
echo "No command given.\n", exit;
}
public function assemble ($userParams, $name = null, $reset = false, $encode = true)
{
echo "Not implemented\n", exit;
}
}
Наконец, в Вашем контроллере, действие, которое Вы вызываете, использует параметрические усилители, которые были осиротевшими демонтажем контроллера и действием маршрутизатором CLI:
public function echoAction()
{
// disable rendering as required
$database_name = $this->getRequest()->getParam(0);
$udata = array();
if( ($udata = $this->getRequest()->getParam( 1 )) )
$udata = explode( ",", $udata );
echo $database_name;
var_dump( $udata );
}
Вы могли затем вызвать свою команду CLI с:
php index.php Controller Action ....
, Например, как выше:
php index.php Controller echo database123 this,becomes,an,array
Вы захотите реализовать более устойчивую фильтрацию/выход, но, это - быстрый стандартный блок.Надеюсь, это поможет!
идея akond работает отлично, кроме исключения ошибки не представляется ошибочным контроллером.
public function cliAction() {
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
foreach ($this->_getParam('error_handler') as $error) {
if ($error instanceof Exception) {
print "cli-error: " . $error->getMessage() . "\n";
}
}
}
и В Application_Router_Cli, прокомментируйте от эха и умрите оператор
public function assemble($userParams, $name = null, $reset = false, $encode = true) {
//echo "Not implemented\n";
}