Zend Framework - 扩展控制器

时间:2009-10-04 21:29:36

标签: zend-framework

我想让我的控制器 - 即Page_IndexController - 扩展一个基本控制器。

例如;

class Page_IndexController extends Content_IndexController {
}

然而,似乎自动加载器在任何时候都没有发现它是一个控制器类 - 我得到了错误Fatal error: Class 'Content_IndexController' not found

第一个问题:我该如何解决这个问题?

我可以通过require_once'通用的“内容”控制器暂时解决这个问题,但这并不理想。

下一个问题是,如果我的页面控制器拥有自己的操作视图脚本,那么它没有问题。

但是如果我正在扩展控制器,并且我在页面控制器上调用了例如'listAction',但是这个动作在Content_IndexController中实现,它仍然在页面控制器中查找列表视图脚本“脚本“目录。

第二个问题:如果控制器没有自己的父级视图脚本,如何配置我的控制器呢?

4 个答案:

答案 0 :(得分:3)

如果您的应用程序可以找到Page_IndexController,那么您可能有一个Page模块。如果你没有在你的应用程序中使用模块,你必须命名你的控制器PageController和ContentController,而不是Page_IndexController,...所以解决方案是使用自动加载器注册“Content_”命名空间。

至于第二个问题。您可以扩展提供的ViewRenderer控制器操作助手,并覆盖查找视图脚本的方法,以便在需要时可以查看其他位置。您只需将viewrenderer传递给前端控制器即可。要将您自己的ViewRenderer传递给控制器​​,请查看Advanced Usage Examples

答案 1 :(得分:2)

自动加载程序无法找到您的控制器,因为您还没有告诉它在哪里搜索。 Content_IndexController不在您的“库”文件夹中(我假设它位于内容模块中)

我建议在您的库文件夹中创建一个My_Controller_IndexBase类,Content_IndexControllerPage_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(){}
....
}