我想让我的控制器 - 即Page_IndexController - 扩展一个基本控制器。
例如;
class Page_IndexController extends Content_IndexController {
}
然而,似乎自动加载器在任何时候都没有发现它是一个控制器类 - 我得到了错误Fatal error: Class 'Content_IndexController' not found
第一个问题:我该如何解决这个问题?
我可以通过require_once'通用的“内容”控制器暂时解决这个问题,但这并不理想。
下一个问题是,如果我的页面控制器拥有自己的操作视图脚本,那么它没有问题。
但是如果我正在扩展控制器,并且我在页面控制器上调用了例如'listAction',但是这个动作在Content_IndexController
中实现,它仍然在页面控制器中查找列表视图脚本“脚本“目录。
第二个问题:如果控制器没有自己的父级视图脚本,如何配置我的控制器呢?
答案 0 :(得分:3)
如果您的应用程序可以找到Page_IndexController,那么您可能有一个Page模块。如果你没有在你的应用程序中使用模块,你必须命名你的控制器PageController和ContentController,而不是Page_IndexController,...所以解决方案是使用自动加载器注册“Content_”命名空间。
至于第二个问题。您可以扩展提供的ViewRenderer控制器操作助手,并覆盖查找视图脚本的方法,以便在需要时可以查看其他位置。您只需将viewrenderer传递给前端控制器即可。要将您自己的ViewRenderer传递给控制器,请查看Advanced Usage Examples。
答案 1 :(得分:2)
自动加载程序无法找到您的控制器,因为您还没有告诉它在哪里搜索。 Content_IndexController
不在您的“库”文件夹中(我假设它位于内容模块中)
我建议在您的库文件夹中创建一个My_Controller_IndexBase
类,Content_IndexController
和Page_IndexController
都会继承。
对视图脚本的主题进行了一些研究。您可以在init()
某处更改视图的脚本路径。我很确定这可能需要在ViewRenderer中完成 - 但也可能在控制器的init / action代码中工作。
$this->view->setScriptPath(
array(
realpath(APPLICATION_PATH+'/../path/to/other/module/views'),
) + $this->view->getScriptPath());
根据Zend_View_Abstract
答案 2 :(得分:0)
关于第二个问题:
如果您不想编写自己的ViewRenderer,可以使用$ this-> renderScript('parent / index.phtml')来呈现特定的视图脚本。您可以在子控制器中调用它,而不是让视图自动呈现给您,或者如果您的子控制器依赖父控制器来执行脚本的渲染,您可以将它放在父控制器中。
答案 3 :(得分:0)
我做那种模式。
Frist我将index.php中插件的新名称注册到公共文件夹中:
/public/index.php
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('modelo_');
Secound我创建了一个新文件夹来放置我的控制器
/library/modelo/
第三,我创建了我的控制器模型并将其放入创建的文件夹中并重命名。
class Modelo_ModeloController extends Zend_Controller_Action
{
protected $_db = null;
protected $_menu = null;
protected $_util = null;
protected $_path = null;
... actions to my model
public function inicial(){}
}
我在我的应用程序中扩展了这个类
class Sispromo_PedidoController extends Modelo_ModeloController
{
public function init(){}
....
}