2009-08-15 63 views
0

我使用Zend Framework 1.8/1.9的Zend_Application和資源系統來初始化一堆資源。我只想根據請求的模塊加載某些.ini文件 - 例如,如果(並且僅當)請求CMS模塊(「/ cms」)時加載「help.ini」。麻煩的是,我不確定如何訪問Zend_Application_Resource_ResourceAbstract子類中的請求對象。初始化基於路由和/或模塊的資源

在我的一個資源(用於初始化CMS的自定義路由)中,我使用hacky小util來獲取模塊(如下),然後添加自定義路由(如果它匹配「cms」模塊名稱:

/** 
* Grab the module name without a request instance 
* 
* @return string The module name 
*/ 
public static function getModuleName() 
{ 
    $uri = ltrim($_SERVER["REQUEST_URI"], "/"); 
    $module = substr($uri, 0, strpos($uri, "/")); 
    return $module; 
} 

$module = Typeoneerror_Util_Strings::getModuleName(); 

// -- only attach certain routes if using cms module 
if ($module == Typeoneerror_Constants::CMS_MODULE) 
{ 
    ... 

我想這是更 「的Zend-Y」,即象一控制器插件,其中一個請求對象被傳遞給類:

public function preDispatch(Zend_Controller_Request_Abstract $request) 
{ 
    $router = $this->__front->getRouter(); 
    ... 

有什麼想法?

回答

2

直接回答你的問題:從你ResourceAbstract子類,你可以檢索前端控制器,像這樣:

$bootstrap = $this->getBootstrap(); 
$bootstrap->bootstrap('frontController'); // make sure it's initialized 
$fc = $bootstrap->getResource('frontController'); 
// Then I'm sure you know how to get the request from there. 

然而,請求對象通常不構成直到Zend_Controller_Frontdispatch()方法被調用。因此,簡而言之,您正在查找的請求對象不存在。所以,你可以手動構建一個Zend_Controller_Request_Http的實例,然後傳遞給你的前端控制器。

但是,也沒有任何路由,所以沒有你習慣看到請求對象的參數已被填充。

基本上,Zend_Application中發生的任何事情都是方式太早在您的應用程序的生命週期中做你想做的事。

我強烈建議在前端控制器插件的routeShutdown鉤子中進行模塊特定的加載。

+0

「routeShutdown()在路由器完成路由請求後調用。」 - 正是我在找的東西!猜猜我應該對控制器插件事件的「生命週期」做更多的研究。做得好! – typeoneerror 2009-08-15 05:24:27