Running a Zend Framework action from command line

后端 未结 10 1329
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-29 17:01

I would like to run a Zend Framework action to generate some files, from command line. Is this possible and how much change would I need to make to my existing Web project t

10条回答
  •  孤独总比滥情好
    2020-11-29 17:10

    akond's solution above is on the best track, but there are some subtleties that may may his script not work in your environment. Consider these tweaks to his answer:

    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 error would probably barf as written above, the error handler is probably not yet instantiated unless you've changed the default config.

    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');
        }
    }
    

    You probably, also, want to munge more than one parameter from the command line, here's a basic example:

    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;
        }
    }
    

    Lastly, in your controller, the action that you invoke make use of the params that were orphaned by the removal of the controller and action by the CLI router:

    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 );
    }
    

    You could then invoke your CLI command with:

    php index.php Controller Action ....
    

    For example, as above:

    php index.php Controller echo database123 this,becomes,an,array
    

    You'll want to implement a more robust filtering/escaping, but, it's a quick building block. Hope this helps!

提交回复
热议问题