4

如何通过 Zend Framework 2 中的命令行运行一个绕过所有 MVC 功能的 php 脚本,但这样脚本才能访问由模块创建的资源,例如数据库连接或 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();
4

1 回答 1

3

模块有几个选项来配置资源,例如数据库连接。对于 ZF2,DoctrineModuleDoctrineORMModule由 Doctrine 自己维护,Entity Manager在您要使用时创建。与在引导期间创建数据库连接的 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 已准备就绪,当准备好进行实验时,它将被合并到 zf2 master 中。这使得 CLI 应用程序的构建更加容易。您有一个入口点(例如 app.php),“真正的工作”就像控制器完成的 http MVC 应用程序一样。一旦你有了这个 app.php,添加更多 CLI 功能将非常容易,因为它就像添加更多带有操作的控制器和(可能)到该点的路由一样简单。

于 2012-02-24T14:46:35.067 回答