0

我想通过ParentController为每个模块分别指定的不同 s 来扩展我的所有控制器。

而且我不知道,在哪里放置扩展控制器,以及在顶级控制器中写什么。

我想做这样的事情:

module/Application/src/Application/Controller/IndexController.php

namespace Application\Controller;

use Application\Controller\ApplicationHeadController;

class IndexController extends ApplicationHeadController {

    public function indexAction() {

    }

}

module/Application/src/Application/ApplicationHeadController

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class ApplicationHeadController extends AbstractActionController {

    public function init() {
        parent::init();

        // some common code for every controller in this module
    }

}
4

4 回答 4

1

我同意亚历克斯的观点:尽量不要对这类任务使用重载。重载(即使用(抽象)类并用您的特定控制器扩展它们)会在以后产生困难。

例如,如果将来一个控制器不应该执行该公共代码怎么办?您需要使用构造函数中的标志或更丑陋的东西创建逻辑来禁用该公共代码的执行。或者,如果您想创建一个 REST 接口并且一个控制器必须扩展AbstractRestfulController而不是AbstractActionController?

Zend Framework 2 提供了钩子,您可以在其中更灵活地完成此类工作。“监听器”就是触发“事件”的钩子。控制器发出几个事件,您可以在模块类中收听这些事件。其中之一是“dispatch”,它在您的fooAction()方法运行时调用。

namespace MyModule;

class Module
{
    public function onBootstrap($e)
    {
        $app = $e->getApplication();
        $em  = $app->getEventManager()->getSharedManager();

        $em->attach('MyModule', 'dispatch', function($e) {
            $controller = $e->getTarget();

            // Here your common code
        });
    }
}

您收听来自 的dispatch事件组中的事件MyModule。您可以阅读有关事件管理器模块类的更多信息。

于 2012-12-23T08:18:03.953 回答
0

为什么这么复杂?

class A 
{
    public function __construct()
    {
        $this->doSomeFancyStuff();  
    }
}

class B extends A
{
    public function __construct()
    {
        parent::__construct();
        $this->doMoreFancyStuffInChildClassOnly();
    }
}

如果你不需要这样做,doMoreFancyStuffInChildClassOnly()那么你不需要覆盖函数,甚至不需要调用parent::__construct(),因为它是自动发生的。阅读PHP5 OOP-Constructs的基础知识

于 2012-12-22T23:17:18.047 回答
0

我想在这种情况下最好使用调度侦听器。你也可以看看马修的文章

于 2012-12-23T00:05:13.447 回答
0

如果您使用的是 php 5.4,则可能是您所追求的特征。它具有 Sam 的答案的简单性,没有 Jurian 指出的可能问题。

见: http: //php.net/manual/en/language.oop5.traits.php

(注意:特质也有其弱点,特别是如果你开始大量使用它们,但对于正确的工作,它们可能是正确的工具)

于 2012-12-23T10:55:23.527 回答