扩展控制器zend的正确方法

时间:2013-05-16 09:34:04

标签: php zend-framework inheritance

我正在尝试扩展控制器,所以我的IndexController看起来像

class IndexController extends Zend_Controller_Action
{
   public function IndexAction()
   {
       //Add a few css files
       //Add a few js files
   }

   public function LoginAction()
   {
       //Login stuff
   }
}

现在,当我尝试做的时候:

require_once("IndexController.php");
class DerivedController extends IndexController
{
    public function IndexAction()
    {
         //Override index stuff, and use the dervied/index.phtml
    } 
}

然后致电derived/login

`Fatal error: Uncaught exception 'Zend_View_Exception' \
 with message 'script 'derived/login.phtml' not found in path`

所以为了解决这个问题,我说哦,好吧我可以强制登录使用自己的视图。然后我想,这很容易我在IndexController::LoginAction里面做的就是添加:

$this->view->render('index/login.phtml');

但它仍然试图寻找derived/login.phtml

为了进一步扩展这一点,我只希望DerivedController中定义的操作使用derived/<action>.phtml,但LoginAction之类的所有其他操作都使用<originalcontroller>/<action>.phtml

我应该以不同的方式做事吗?或者我错过了一小步?

注意如果我从derived/login.phtml添加index/login.phtml或符号链接,则可以正常工作。

3 个答案:

答案 0 :(得分:2)

一个类如何扩展一个Action它应该是

class DerivedController extends IndexController

而不是

class DerivedController extends IndexAction

答案 1 :(得分:2)

如果要重用IndexController中的所有视图(* .phtml)文件,可以覆盖cunstructor中的ScriptPath并将其指向正确的(indexcontroller)文件夹:

class DerivedController extends IndexController
{

    public function __construct()
    {
        $this->_view = new Zend_View(); 
        $this->_view->setScriptPath($yourpath);
    }

[...]

    public function IndexAction()
    {
         //Override inherited IndexAction from IndexController
    }

[...]

}

编辑:

尝试在predispatch中使用简单的条件:

class DerivedController extends IndexController
{

    public function preDispatch()
    {
        if (!$path = $this->getScriptPath('...')) { 
            //not found ... set scriptpath to index folder 
        }

        [...]

    }

[...]

}

通过这种方式,您可以检查derived/<action>.phtml是否存在,其他人将脚本路径设置为使用index/<action>.phtml

答案 2 :(得分:1)

DerivedController应该扩展CLASS IndexController而不是一个函数(IndexAction)。这样您就不需要任何require_once()

正确的方式:

class DerivedController extends IndexController
{
    public function IndexAction()
    {
         //Override inherited IndexAction from IndexController
    } 
}