根据路由和/或模块初始化资源

时间:2009-08-15 04:28:08

标签: php zend-framework resources request

我正在使用Zend Framework 1.8 / 1.9的Zend_Application和资源系统来初始化一堆资源。我想只根据所请求的模块加载某些.ini文件 - 例如,如果(并且仅当)请求CMS模块时加载“help.ini”(“/ cms”)。麻烦的是,我不确定如何访问Zend_Application_Resource_ResourceAbstract子类中的请求对象。

在我的一个资源中(用于初始化CMS的自定义路由),我使用hacky little 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();
    ...

有什么想法吗?

1 个答案:

答案 0 :(得分: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.

但是,在调用dispatch()的{​​{1}}方法之前,通常不会构建请求对象。因此,简而言之,您正在寻找的请求对象尚不存在。因此,可以手动构建Zend_Controller_Front的实例,然后将其传递给前端控制器。

但是,也没有任何路由,所以你用来查看请求对象的所有参数都没有被填充。

基本上,Zend_Controller_Request_Http中发生的任何事情都是在应用程序生命周期中过早的方式来做你想做的事情。

我强烈建议在前端控制器插件的Zend_Application挂钩中进行特定于模块的加载。