我正在尝试将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;
}
答案 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);
我还没有尝试过该代码,但这应该可行。