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 インターフェイスを作成したい場合、1 つのコントローラーが?のAbstractRestfulController代わりに を拡張する必要があります。AbstractActionController

Zend Framework 2 は、この種の作業をより柔軟に実行できるフックを提供します。「リスナー」は、トリガーされた「イベント」のフックです。コントローラーは、モジュール クラスでリッスンできるいくつかのイベントを送信します。fooAction()それらの 1 つは、メソッドの実行時に呼び出される「dispatch」です。

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

php 5.4を使用している場合は、特性が目的である可能性があります。ジュリアンが指摘する可能性のある問題がなく、サムの答えは単純です。

参照: http: //php.net/manual/en/language.oop5.traits.php

(注:特に多くの特性を使い始めた場合、特性にも弱点がありますが、適切な仕事のために適切なツールになる可能性があります)

于 2012-12-23T10:55:23.527 に答える
0

この場合、ディスパッチリスナーを使用する方が良いと思います。マシューの記事もご覧ください。

于 2012-12-23T00:05:13.447 に答える
0

なぜそんなに複雑なのですか?

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

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

また、実行する必要がない場合はdoMoreFancyStuffInChildClassOnly()、関数を上書きしたり、parent::__construct()自動的に実行されるために呼び出す必要はありません。PHP5OOPの基本を読んでください-構築

于 2012-12-22T23:17:18.047 に答える