3

すべてのコントローラーで同じ 2 行が必要です。各コントローラーには独自の初期化ロジックがありますが、これらの 2 行はすべてのコントローラーで共通です。

public function init()
{
    $fm =$this->_helper->getHelper('FlashMessenger');
    $this->view->messages = $fm->getMessages();
}

コードの繰り返しを避けるにはどうすればよいですか?

アップデート:

OK、FlashMessenger は一例にすぎません。たとえば、'someAction' @ 'someController' を除くすべてのアクションにログ行を書き込む必要があるとします。したがって、新しい共通線はそうあるべきです。

$this->logger = new Zend_Log();
$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH.'/../logs/log.txt');
$this->logger->addWriter($writer);
$this->logger->log('Some Message',Zend_Log::DEBUG);

問題は、各コントローラーのすべての init() でこれらの行を繰り返さないようにするには、これらの行をどこに配置する必要があるかということです。これらの行は、bootstrap? に配置する必要があります。その場合:「someAction」のログ行をスキップするにはどうすればよいですか。または、「BaseController」を実装して、すべてのコントローラーをそこから拡張する必要があります。もしそうなら:どうすればオートロードできますか?(致命的なエラー: クラス 'BaseController' が見つかりません) .

4

5 に答える 5

6

コントローラーをサブクラス化するだけです:

class Application_ControllerAction extends Zend_Controller_Action {
    public function init()
    {
        $fm =$this->_helper->getHelper('FlashMessenger');
        $this->view->messages = $fm->getMessages();
    }
}


class IndexController extends Application_ControllerAction {
}

また、同じ書き込みコントローラー プラグインを実現することもできます。

編集:

フロント コントローラー プラグインは、 と同じように、各リクエストで実行されControllers、同じフック メソッドがあります。

routeStartup(): prior to routing the request
routeShutdown(): after routing the request
dispatchLoopStartup(): prior to entering the dispatch loop
preDispatch(): prior to dispatching an individual action
postDispatch(): after dispatching an individual action
dispatchLoopShutdown(): after completing the dispatch loop

さらに、コントローラーのパラメーターをチェックして、選択したリクエストでのみコードを実行することもできます。

if ('admin' == $this->getRequest()->getModuleName() 
&& 'update' == $this->getRequest()->getActionName() ) …
于 2011-02-19T12:51:35.337 に答える
1

フラッシュメッセージにアクセスできます(コントローラーからビューに何も送信する必要はありません。すべて自動化されています)

$fm = new Zend_Controller_Action_Helper_FlashMessenger();
Zend_Debug::dump($fm->getMessages());

ビューでは、このサイトhttp://grummfy.be/blog/191に示されているように、このコードをビューヘルパーにカプセル化することもお勧めします

于 2011-02-18T20:41:19.007 に答える
0

あなたのブートストラップで:

protected function _initMyActionHelpers() {
    $fm = new My_Controller_Action_Helper_FlashMessenger();
    Zend_Controller_Action_HelperBroker::addHelper($fm);;
}
于 2011-02-18T21:42:05.857 に答える
-1

コードの繰り返しを避けるにはどうすればよいですか?

独自のカスタム コントローラーを作成し、それをそのコントローラーのメソッドに実装してinitから、アプリ内のすべてのコントローラーをカスタム コントローラーから拡張します。

ただし、@Jeffが言及したように(リンクを参照)、別のビューヘルパーを使用するアプローチは、多くの場合、より良い解決策と見なされます。コントローラーでは、次のことのみを行います。

$this->_helper->flashMessanger('My message');

ビューヘルパーが残りを行います。

于 2011-02-18T20:49:09.520 に答える
-1

これは、新しいカスタム コントローラーを作成する理由ではありません。この行をすべての init() メソッドに追加するだけです。

$this->view->messages = $this->_helper->getHelper('FlashMessenger')->getMessages();
于 2011-02-18T21:02:00.073 に答える