将PHP名称空间添加到现有ZF1应用程序中

时间:2012-12-24 18:14:13

标签: php zend-framework namespaces

我正在尝试将PHP命名空间集成到现有的Zend Framework项目(v1.12)中。当我在工作控制器的顶部添加命名空间时,它不再起作用,应用程序抛出Invalid controller class错误。这是我的控制器定义:

namespace MyProject\Controller;

use MyProject\Controller\MyRestController;

class MyFooController extends MyRestController
{
}

Bootstrap.php中的init方法:

protected function _initAutoload()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace('MyProject');
    return $autoloader;
}

2 个答案:

答案 0 :(得分:0)

只是一个猜测(很长一段时间没有使用过ZF):Zend不接受任何类作为控制器,只是那些从框架的基本控制器类扩展的类。由于您没有从框架基本控制器类扩展,因此您会看到错误。

如果这是原因,请注意您最初从基础框架控制器类扩展,或者实现了所需的接口。

namespace MyProject\Controller;

class MyRestController extendes Zend_Framework_Base_Controller_Class_Name_Here
{
    ...

P.S。 use MyProject\Controller\MyRestController;看起来多余,因为该类已在该命名空间中。我们来看看您的代码:

namespace MyProject\Controller;

这将设置文件的命名空间。这意味着,非FQCN将解决它。例如:

new MyRestController();

解析为以下FQCN:

new MyProject\Controller\MyRestController

哪个 - 啊哈! - 正是你在使用中写的:

use MyProject\Controller\MyRestController;

这意味着,这个use子句是多余的,扩展名为:

class MyFooController extends MyRestController

一开始还会去。因为它是相同的命名空间。

答案 1 :(得分:0)

我现在面临类似的问题。对我来说,这看起来像Zend无法正确解析命名空间的控制器名称。因此,当我将IndexController放入namespace \ Basic \ Controller时,它将不会被加载,因为Zend想要加载\ IndexController类,它不存在。

我正在考虑扩展标准的zend路由器类,它有方法getControllerName。

然后我可以通过以下方式在引导程序中设置它:

$router = new \My\Namespaced\Router();

$front = Zend_Controller_Front::getInstance();
$front->setRouter($router);

我还没有尝试过该代码,但这应该可行。