gpt4 book ai didi

php - 无法在 Controller 操作中获得 Bootstrap

转载 作者:行者123 更新时间:2023-12-02 05:33:21 25 4
gpt4 key购买 nike

我有一个为与 Zend Framework 一起使用而制作的库。在其中,我有所有应用程序 Controller 扩展的 Company/Controller/Action.php。它非常简单,只是将一些东西注入(inject)到 Controller 中(比如 Doctrine 的实体管理器)。

我正在尝试让单元测试正常工作,但偶然发现了一个问题,我无法从 Company_Controller_Action 类(扩展 Zend_Controller_Action):

function preDispatch() 
{
$bootstrap = $this->getInvokeArg('bootstrap');
}

$bootstrap 此时为空。任何人有任何想法为什么?我已验证我的 Bootstrap 正在被调用并且我可以获取前端 Controller ,但我无法获取 Bootstrap (通过 getInvokeArg 或前端 Controller )。

这适用于正常的生产和开发环境。我的 application.ini 的测试部分只是继承自生产部分,所以应该是一样的。

这就是我在 setUp() 中所做的:

public function setUp()
{
$this->bootstrap = new Zend_Application(
'testing',
APPLICATION_PATH . '/configs/application.ini'
);
parent::setUp();
}

我的 Bootstrap.php:

<?php

// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

我的 phpunit.xml:

<phpunit bootstrap="./Bootstrap.php" colors="true">
<testsuite name="Application Test Suite">
<directory>./application</directory>
</testsuite>
<filter>
<whitelist>
<directory suffix=".php">../application/</directory>
<exclude>
<directory suffix=".php">../application/Entities</directory>
<directory suffix=".php">../application/modules/default/views</directory>
<file>../application/Bootstrap.php</file>
<file>../application/modules/default/controllers/ErrorController.php</file>
</exclude>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./log/report" title="PrintConcept" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
<log type="testdox" target="./log/testdox.html" />
</logging>
</phpunit>

更新:使用上述配置,我的$bootstrap 不再为空。

最佳答案

如果我记得几周前我在 Zend bug 跟踪器中看到的,这是一个 bug。

这是对许多人都有效的修复方法:

在您的 Bootstrap.php 中初始化前端 Controller :

protected function _initFrontController()
{

$frontControllerInstance = Zend_Controller_Front::getInstance();

//If bootstrap is NULL or set to null then, set it.
if(is_null($frontControllerInstance->getParam('bootstrap'))) {
$frontControllerInstance->setParam('bootstrap', $this);
}
return $frontControllerInstance;
}

编辑:

我快速谷歌了一下这个问题。我有一个类似的 workaround (几乎和我上面提到的一样)根据this answer,这个关于 stackoverflow 的答案可能对你有帮助。它可以通过 Action 助手调用。

关于php - 无法在 Controller 操作中获得 Bootstrap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12063337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com