Zend框架引导问题

3

我一直在为Zend框架应用程序的新安装工作而努力,但是我无法弄清楚发生了什么。我有两个自定义操作助手想要使用,并且想要在引导程序中初始化它们。但似乎我的_init函数根本没有被调用。在启动应用程序的index.php文件中,我有以下代码:

require('Zend/Application.php');

$app = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH 
.'/configs/application.ini');

$app->bootstrap()->run();

这是我在application.ini文件中的内容:

[production]

appnamespace = "Application_Name"

includePaths.library = APPLICATION_PATH "/../library"

bootstrap.path = "/home/user/website/includes/library/Application_Name/Resource/Bootstrap.php"

bootstrap.class = "Bootstrap"

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

resources.view[] =

autoloaderNamespaces[] = "Application_Name"

pluginPaths.Application_Name_Resource = "Application_Name/Resource"

我知道这个应用程序在某种程度上是工作的,因为它使用了我拥有的布局,我可以在控制器和视图中进行操作,并将其输出到页面。我还知道它至少正在查看Bootstrap文件,因为当我省略一个结束大括号时,我可以让PHP出现错误。

以下是我的Bootstrap文件的一部分:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

        public function _init()
        {
                Zend_Controller_Action_HelperBroker::addPrefix(new Application_Name_Controller_Action_Helper_ResourceInjector());
                Zend_Controller_Action_HelperBroker::addPrefix(new Application_Name_Controller_Action_Helper_Em());
        }

有什么想法是为什么会这样,或者我在配置中弄错了什么?我看了几十个关于如何配置Zend的教程,但似乎没有人遇到这个问题。


默认的 Bootstrap.php 位置是 APPLICATION_PATH "/Bootstrap.php"。您更改了它的原因是什么? - Phil
不是真的。我只是把它放在库里了。我可以把它放回去,但我不认为这会改变什么。 - nwalke
1个回答

3
您没有正确使用助手代理。 addPrefix() 用于添加插件加载器前缀路径,而不是实际的类。
如果您想添加具体的助手(以使用它们的调度钩子为例),则请在您的 Bootstrap 类中放置以下内容。
protected function _initActionHelpers()
{
    $helper = new My_Helper;
    Zend_Controller_Action_HelperBroker::addHelper($helper);
}

对于通用的运行时助手,您可以在配置中轻松添加前缀路径,例如:

resources.frontController.actionHelperPaths.ProEquipTrack_Controller_Action_Helper = "ProEquipTrack/Controller/Action/Helper"

这些将会在调用时由代理自动加载,例如(控制器上下文)。
$resourceInjector = $this->getHelper('ResourceInjector');
$em = $this->getHelper('Em');

或者使用策略模式(direct() 方法)

$this->_helper->resourceInjector($arg1, $arg2 /*, etc */);

Doctrine实体管理器

在你的Bootstrap类中可以这样做:

protected function _initDoctrine()
{
    // initialise and create entity manager
    $em = // whatever

    return $em;
}

现在您可以使用此方法在控制器中访问实体管理器

$em = $this->getInvokeArg('bootstrap')
           ->getResource('doctrine');

那么我如何调用Em.php文件呢?或者说它是自动加载的吗? - nwalke
所以那些_init函数被调用了,但你不能在它们里面挂掉... 嗯。谢谢! - nwalke
@Phil,有没有办法从引导程序将某些内容传递给控制器? - nwalke
@tubaguy 比如说什么?您可以使用 $res = $this->getInvokeArg('bootstrap')->getResource('resource_name') 访问应用程序资源。 - Phil
@Phil Doctrine实体管理器?我在我的引导程序中初始化Doctrine,我想通过调用$this->em在控制器中允许访问em对象来运行查询等操作。 - nwalke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接