2012-02-22 46 views
3

如何通过Zend Framework 2中的命令行执行php脚本,绕过所有的MVC功能,但这样脚本就可以访问由模块创建的资源,例如数据库连接或Doctrine EntityManager?Zend Framework 2命令行脚本

供参考,这是我的入口点的index.php样子

<?php 
chdir(dirname(__DIR__)); 
require_once (getenv('ZF2_PATH') ?: 'vendor/ZendFramework/library') . '/Zend/Loader /AutoloaderFactory.php'; 
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array())); 

$appConfig = include 'config/application.config.php'; 

$listenerOptions = new Zend\Module\Listener\ListenerOptions($appConfig['module_listener_options']); 
$defaultListeners = new Zend\Module\Listener\DefaultListenerAggregate($listenerOptions); 
$defaultListeners->getConfigListener()->addConfigGlobPath('config/autoload/*.config.php'); 

$moduleManager = new Zend\Module\Manager($appConfig['modules']); 
$moduleManager->events()->attachAggregate($defaultListeners); 
$moduleManager->loadModules(); 

// Create application, bootstrap, and run 
$bootstrap = new Zend\Mvc\Bootstrap($defaultListeners->getConfigListener()->getMergedConfig()); 
$application = new Zend\Mvc\Application; 
$bootstrap->bootstrap($application); 
$application->run()->send(); 

回答

2

有几种选择的模块来配置资源,例如数据库连接。对于ZF2,DoctrineModuleDoctrineORMModule由Doctrine自己维护,实体管理器为,只有当您要使用它时创建。这些模块不是在引导期间创建数据库连接的ZF1方法,而是具有即时分类的方式:在您需要之前创建实例。

所以:你需要配置连接和实体管理器在一个模块中完成一个依赖注入容器。该配置由模块完成,因此您应该小心模块配置正确。然后,在你的脚本中,你从DIC中取出实体管理器,并且EM被实例化,正是你需要的。

如何配置模块?首先,模块是加载,然后启动。这是因为有几个监听器正在监听负载事件,因此在呼叫$moduleManager->loadModules()中完成,因此实例化这些模块并为这些模块运行init()方法。还有一个监听器来获取模块配置,因此DI可以正确设置。此时,模块已经建立,但并不总是准备好运行。准备好的最后一步是自举这是由Zend\Mvc\Bootstrap完成的,引导Zend\Mvc\Application

这意味着如果复制的index.php脚本,但仅删除最后一行($application->run()->send()),该模块被加载时,DI容器配置和应用程序自举。现在,你可以得到DI定位和虎视眈眈的实体管理器:

$em = $application->getLocator()->get('doctrine_em'); 

注意ZF2的CLI功能的,在某些下一beta版的到来。在这个时候RFC is ready准备好进行实验时,它将被合并到zf2主机中。这使得CLI应用的构建更容易得到。你有一个入口点(例如app.php),“真正的工作”就像控制器完成的http MVC应用程序一样。一旦你有了这个app.php,添加更多的CLI功能将变得非常简单,因为它很简单,只需添加一些更多的控制器和动作,并且(可能)有一条到那个点的路线。