我想通过分别为每个模块指定的不同ParentController
扩展我的所有控制器。
我不知道,在哪里放置扩展控制器,以及在顶级控制器中写什么。
我想做那样的事情:
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
}
}
答案 0 :(得分:1)
我同意Alex的观点:尽量不要使用重载来完成这类任务。重载(即使用(抽象)类并将它们与特定控制器一起使用)会在以后产生困难。
例如,如果将来一个控制器不应该执行该公共代码怎么办?您需要创建逻辑以使用构造函数中的标志禁用该公共代码的执行或更丑陋。或者,如果要创建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
事件。您可以阅读更多about the event manager和the module class。
答案 1 :(得分: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
答案 2 :(得分:0)
我想在这种情况下最好使用调度侦听器。您还可以查看Matthew's article
答案 3 :(得分:0)
如果您使用的是PHP 5.4,那么您可能会追求特质。它具有Sam的答案的简单性,没有Jurian指出的可能的问题。
请参阅:http://php.net/manual/en/language.oop5.traits.php
(注意:特质也有它们的弱点,特别是如果你开始使用它们很多,但是对于正确的工作,它们可能是正确的工具)