Zend Framework 2命令行脚本

时间:2012-02-22 05:04:10

标签: zend-framework2

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

作为参考,这是我的入口点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();

1 个答案:

答案 0 :(得分:2)

模块有多种配置资源的选项,例如数据库连接。对于ZF2,DoctrineModuleDoctrineORMModule由Doctrine自己维护,而实体管理器仅在 创建时才能使用它。这些模块不是在引导程序期间创建数据库连接的ZF1方法,而是在实际需要之前创建实例。

所以:你需要在模块中配置连接和实体管理器,该模块使用Dependency Injection容器完成。该配置由模块完成,因此您应该注意模块配置正确。然后,在您的脚本中,您从DIC中拉出实体管理器,并实例化EM,这正是您所需要的。

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

这意味着如果您复制index.php脚本,但删除最后一行($application->run()->send()),则会加载模块,配置DI容器并引导应用程序。现在您可以获取DI定位器并抓取实体管理器:

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

请注意zf2的CLI功能,该功能将在下一个测试版中发布。此时RFC is ready准备好进行实验时,它将合并到zf2 master中。这使得CLI应用程序的构建更容易 。你有一个入口点(例如app.php),“实际工作”就像控制器完成的http MVC应用程序一样。一旦你有了这个app.php,就可以非常容易地添加更多的CLI功能,因为它就像添加一些带有动作的控制器和(可能)到这一点的路径一样简单。