2012-04-05 8 views
4

以下の方法はどのように動作するのですか?

$this->getRequest()->getPost(); 

は、クラスZend_Controller_Request_Abstractには方法getPost()はありませんが、どのように機能することができますか? OOP原則では、方法getPost()Zend_Controller_Request_Abstractに表示されます。

直接インスタンスがない場合、ZendがZend_Controller_Request_HttpのクラスでgetPost()をプルするにはどうすればよいですか?

ありがとうございます。

答えて

2

ZendはまずZend/Controller/Front.phpで利用可能なFrontControllerへのすべてのリクエストを送信します。 FrontControllerがコントローラにHTTPリクエストを注入する、ここで、それは

/** 
    * Instantiate default request object (HTTP version) if none provided 
    */ 
    if (null !== $request) { 
     $this->setRequest($request); 
    } elseif ((null === $request) && (null === ($request = $this->getRequest()))) { 
     require_once 'Zend/Controller/Request/Http.php'; 
     $request = new Zend_Controller_Request_Http(); 
     $this->setRequest($request); 
    } 

が起こっているコードがfrontcontrollerの目的は、することにあるルート着信要求を、要求 環境を初期化し、その後、任意 ディスパッチ発見された行動応答が集約され、処理が完了したときに返されます。

これは何をZendの/コントローラ/ Action.phpに意志である

/** 
* Return the Request object 
* 
* @return Zend_Controller_Request_Abstract 
*/ 
public function getRequest() 
{ 
    return $this->_request; 
} 

さらに、クエリの回答FrontController here

の詳細 - コメントはZend_Controller_Request_Abstractを継承 "が-Aであると言い、ここで '戻り値の型。 Zend_Controller_Request_Abstractというクラスを返すことができるので、 'is-a'を強調表示しました。詳細にあるチェックこのwikipediaページ知識表現、オブジェクト指向プログラミングやデザインに

」、 は(包摂)またはのis_a-Aであるか、または1つのクラスD は関係があります別のクラスBのサブクラス(したがって、BはDのスーパークラスです)。

+0

ありがとうございました。しかし、上記のように、Zendが 'setRequest(new Zend_Controller_Request_Http())'を適用している場合、 'getRequest()'メソッドは 'Zend_Controller_Request_Http'型を返すべきですが、' Zend_Controller_Request_Abstract'混乱している。ありがとう。 – Vegetus

+0

トップに@Tim Fountainの私のレビューを見てください。 – Vegetus

2

getPost()は、Zend_Controller_Request_Abstractを拡張するZend_Controller_Request_Httpクラスの一部です。

+0

私の推論に従い、 '$ this-> getRequest()'を適用すると、 'Zend_Controller_Request_Abstract'型を返します。したがって、このタイプのクラスを通して、 'getPost()'メソッドはありません。 – Vegetus

+1

これは、クラスの継承がどのように機能するかを示します。 getRequest()は 'Zend_Controller_Request_Abstract'のインスタンスを返さず、' Zend_Controller_Request_Http'のインスタンスを返しますが、このクラスは 'Zend_Controller_Request_Abstract'を拡張しています。コンピュータサイエンスのクラスは、通常、この種のことを説明するために「Employee extends Person」のような単純な例を使用します。したがって、getEmployee()メソッドは 'Employee'のインスタンスを返すかもしれませんが、 'Employee'はまだPersonです。 –

+0

ああ、そうです。 'var_dump($ this-> getRequest())'は、実際に 'Zend_Controller_Request_Http'のインスタンスを返します。しかし、 'public function getRequest()'メソッドにZend/Controller/Actionクラスを入力すると、Zend_Controller_Request_Abstract'を返すメッセージ状態になり、混乱します。ありがとうございます。 – Vegetus

1

私は(「この質問はおそらく意見、議論、引数、ポーリング、または拡張の議論を求めるだろう」)質問を閉じるために投票したが、私はあなたが興味深いポイントを上げると思います。私は、ZF開発チームは次のように防御できると思っています:

アクションは、Zend_Controller_Action_Interfaceを実装するだけで、本質的にはdispatch()メソッドです。このフレームワークは抽象実装のクラスZend_Controller_Actionを提供しています。ユーザランドのアプリ開発者は通常、アクションメソッドなどを定義するために拡張していますが、実際にはZend_Controller_Request_Httpのインスタンスが必要なクラスはありません。フレームワークコードには$request->getPost()に固有の依存関係はありません。私たちのアプリ開発者は通常Zend_Controller_Request_Httpインスタンスを作成するデフォルトのディスパッチフローを使用するだけで、getPost()メソッドを使ってPOSTにアクセスできます。

POSTの概念が実際には適用されないCLIのMVCアプリケーションを、そのリクエストメカニズムとしてZend_Controller_Request_Abstractの別のサブクラスを使用して簡単に作成できます。

関連する問題