2012-02-17 11 views
4

zendのMVCリクエストライフサイクルを理解するためにthisを読んでいました。 しかし、コントローラのプレディスパッチメソッドを使うzendでは、コントローラのアクションの前に実行したいコードのための十分なinitメソッドではないと思います。Zendコントローラのプレディスパッチメソッド

コントローラのプレディスパッチではなく、initでなければならないものは何か。

例を挙げることができますか?

+2

私はZendアプリケーションを書いて以来長い間ずっと続いていました。(これはコメントであり、答えではありませんが)最初に気になるのは、あなたが認証ヘルパーを持っていて、コントローラにアクセスする権限があります。 – Corbin

答えて

9

Zend_Controller_Action - Object Initializationおよび次のセクションPre and Post Dispatch Hooksを参照してください。彼らは両方とも、2つの詳細については、アクションコントローラ自体に入ります。

init()は、コントローラオブジェクトを設定し、すべての操作で使用できる初期化を行うためのものです。 init()preDispatch()より先に実行されるため、にはinit()で設定したものを使用できます。 init()から転送またはリダイレクトすることは可能ですが、コントローラーアクションをディスパッチする前に実行されるため、preDispatch()から実行することをお勧めします。マニュアルから

注:をpreDispatch対のinitの使い方()()両者の差は、(initとをpreDispatch)とは何で、どのような行動は、各中 を取るでしょうか?

init()メソッドは、主に コンストラクタを拡張することを目的としています。通常、コンストラクタは単にオブジェクト を設定し、多くのロジックを実行しません。これには、コントローラー(モデル、構成 オブジェクトなど)で使用される リソースの初期化、またはコントローラ、ブートストラップ、またはレジストリの フロントから取得された値の割り当てが含まれます。

をpreDispatch()方法はまた、(例えば、ビュー、アクションヘルパー、)オブジェクトまたは 環境を設定するために使用することができ

状態が、その主な 目的がかどうか要求されたアクションに関する意思決定を行うことです を発送する必要があります。そうでない場合は、_forward()〜 別のアクションを実行するか、例外をスローする必要があります。

注:_forward()は、2つの方法の意図 の定式化であるのinit()から実行されたときが実際に正しく機能しないであろう。すべてのアクションのためのレイアウトを設定する

public function preDispatch() { 

     $this->_helper->layout->setLayout('admin'); 
    } 

    /** 
    *initiaize the flashmessenger and assign the _session property 
    */ 
    public function init() { 

     if ($this->_helper->FlashMessenger->hasMessages()) { 
      $this->view->messages = $this->_helper->FlashMessenger->getMessages(); 
     } 
     //set the session namespace to property for easier access 
     $this->_session = new Zend_Session_Namespace('location'); 

    } 

私はをpreDispatch()を使用します:

+0

ありがとう@ drew010 –

2

はここdrew010の答えは、私はをpreDispatch()とINT()を使用する方法の例です拡張しますそれはデフォルトのレイアウトではなく、init()ではフラッシュメッセンジャーを初期化し、このコントローラのセッション名前空間を設定し、プロパティとしてセッションを初期化します。

1

ここでは、preDispatch()の代わりにinit()を使用してリソースを無駄にすることのできる人気のある問題点があります:コントローラプラグインのpreDispatch()メソッドを使用してアクセス制御を行う場合、呼び出しシーケンスはYourController :: init YourAccessPlugin :: preDispatch()、YourController :: preDispatch()、YourController :: whateverActionです。これは、init()で重労働をした場合、許可されていないユーザがそれを引き起こす可能性があることを意味します。たとえばと言ってください。 init()で新しいセッション名前空間を開始すると、無意味な検索ボットがセッションデータベースを空のセッションで散らばってしまうことがあります。だから、initの非常に基本的な単純なものに固執し、すべてのリソースに触れたり変更したりしないで、データベースへのアクセスを避けてください。

関連する問題