Выполнение действия Платформы Зенда из командной строки

Я хотел бы выполнить действие Платформы Зенда для генерации некоторых файлов из командной строки. Действительно ли это возможно и сколько изменения я должен был бы внести в свой существующий веб-проект, который использует ZF?

Спасибо!

62
задан 24 February 2010 в 23:56

3 ответа

Просто видел, что этот был отмечен на моем 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

! Более гладкий путь.

8
ответ дан 31 October 2019 в 13:37

решение 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

Вы захотите реализовать более устойчивую фильтрацию/выход, но, это - быстрый стандартный блок.Надеюсь, это поможет!

6
ответ дан 31 October 2019 в 13:37

идея 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";
}
0
ответ дан 31 October 2019 в 13:37

Другие вопросы по тегам:

Похожие вопросы: