0

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

namespace MyProject\Controller;

use MyProject\Controller\MyRestController;

class MyFooController extends MyRestController
{
}

和 init 中的方法Bootstrap.php

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

2 回答 2

0

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

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

namespace MyProject\Controller;

class MyRestController extendes Zend_Framework_Base_Controller_Class_Name_Here
{
    ...

psuse MyProject\Controller\MyRestController;看起来是多余的,因为该类已经在该命名空间中。让我们回顾一下您的代码:

namespace MyProject\Controller;

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

new MyRestController();

解析为以下 FQCN:

new MyProject\Controller\MyRestController

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

use MyProject\Controller\MyRestController;

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

class MyFooController extends MyRestController

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

于 2012-12-24T18:51:47.567 回答
0

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

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

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

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

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

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

于 2013-06-27T11:56:04.597 回答