2012-02-22 70 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功能將變得非常簡單,因爲它很簡單,只需添加一些更多的控制器和動作,並且(可能)有一條到那個點的路線。