Php 如何执行另一个模块内的模块引导资源';Zend Framework 1中的s引导?

Php 如何执行另一个模块内的模块引导资源';Zend Framework 1中的s引导?,php,zend-framework,module,bootstrapping,Php,Zend Framework,Module,Bootstrapping,我正在使用各种模块目录中的Zend\u application\u Module\u Bootstrap引导我的应用程序。如何要求先执行另一个模块引导程序中的资源 // app/modules/user/Bootstrap.php class User_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initUser() { } } // app/modules/auth

我正在使用各种模块目录中的
Zend\u application\u Module\u Bootstrap
引导我的应用程序。如何要求先执行另一个模块引导程序中的资源

// app/modules/user/Bootstrap.php
class User_Bootstrap extends Zend_Application_Module_Bootstrap
{
    protected function _initUser()
    {
    }
}

// app/modules/author/Bootstrap.php
class Author_Bootstrap extends Zend_Application_Module_Bootstrap
{
    protected function _initAuthor()
    {
        $this->bootstrap('user'); // Fatal:  Resource matching 'user' not found
    }
}

我决定使用插件来实现这种细粒度的功能,因为无法正确管理执行顺序,因此在放置具有依赖关系的代码时,模块引导是一个糟糕的选择

使用以下参考答案作为我决策的基础:

根据ZF1邮件列表,您可以通过应用程序引导的模块资源访问模块引导

老兄,真是一口。我的意思是:

// app/modules/user/Bootstrap.php
class User_Bootstrap extends Zend_Application_Module_Bootstrap
{
    protected function _initUser()
    {
    }
}

// app/modules/author/Bootstrap.php
class Author_Bootstrap extends Zend_Application_Module_Bootstrap
{
    protected function _initAuthor()
    {
        $app = $this->getApplication(); // it's actually the application *bootstrap*
        $app->bootstrap('modules');
        $modulesResource = $app->getResource('modules'); 
        $userBootstrap = $modulesResource->user;
        $userBootstrap->bootstrap('user'); // should be cool
    }
}

根据我自己的经验,只要我的一个模块级资源需要在多个模块中引用(特别是在引导过程中),我就将该资源的引导推到应用程序级引导中。

我觉得这太接近了。我在
$app->bootstrap('modules')
中遇到了一个“循环资源依赖项”错误,因为它正在启动过程中,尚未完全运行(我想我正在尝试再次启动它)。如果我将其注释掉,则无法获取模块资源(返回null)。如果我的脚本正在引导我的模块,我如何获得它的资源?除了
应用程序/configs/application.ini
中的
frontController.resources.modules[]=
声明之外,您在任何引导中都有
\u initModules()
方法吗?这可以解释您的循环依赖项错误。我有
resources.modules=[]
,并且在任何引导中都没有_initModules方法。我不认为这会对我的问题产生任何影响,但我正在子类化
Zend_Application\u Module_Bootstrap
,并让我的模块引导从该子类扩展。在程序中,我看到应用程序引导的
$数组中的
'modules'=>true
,就在引发异常之前启动了
数组。很抱歉,我在上面的输入错误中建议了不正确的语法
frontController.resources.modules[]=
。最后一件事:尝试
resources.modules[]=
而不是
resources.modules=[]
。如果做不到这一点,我们是否可以廉价地将任何公共资源推送到应用程序级引导?然后,我们永远不必手动引导“模块”资源;它由
application.ini
中的条目处理。我在配置中使用了一个数组,我尝试将资源['modules']设置为数组和空字符串,但没有这样的运气(同样的循环依赖性问题)。我想我可能会将公共资源提升到应用程序级别,但我的引导程序已经变得足够庞大和笨拙了。谢谢你的帮助。你知道你所有的引导文件中的所有东西都被混合在一起,并在每个请求中执行吗?使用ZF1时,明智的做法是只将每个请求都需要执行的资源放在引导中。我们在引导过程中投入的很多东西作为一个或另一个条带的插件或助手可能会更好。很抱歉没有足够的向下滚动:)@RockyFord是的,我想我会继续使用插件,并收听routeStartup。我希望尽快正确地识别用户,因为我会根据他们的角色添加样式表/脚本。你觉得引导中的任何条件逻辑(除了检测环境)是个坏主意吗?如果你需要引导中的东西,那么你需要它。只是要知道潜在的成本。对于基于用户角色加载资源,您可能能够将该特定逻辑合并到ACL插件中(取决于您执行ACL的方式)。如果要加载用户资源,可能需要等待
routeShutdown
preDispatch
以确定用户,不要担心在整个调度循环完成之前不会显示任何内容。