0
public function helloAction() {
    $a =10;

}
public function thanksAction() {
    $b = 20;
    $b = $b + $a; //`enter code here` how can i get this $a variable value from helloAction() to thanksAction()
// without use _redirect() and i mean don't send url helloAction() to thanksAction() by any method
}

zend フレームワークでソリューションを提供します。ここにコードを入力してください` _redirect() を使用せずに、この $a 変数値を helloAction() から thanksAction() に取得するにはどうすればよいですか? つまり、任意の方法で URL helloAction() を thanksAction() に送信しないでください。

4

3 に答える 3

4

さまざまなオプションがありますが、それらはすべて、正確な要件が何であるかによって異なります。

オプション 1: 転送 - 質問から、最初に helloAction を実行してから、thanksAction() を実行して、$a を 10 に設定してから、thanksAction に渡したいようです。そのためには、_forward メソッドを使用できます。URL は変更されませんが、指定されたアクションに実行が渡されます。

       public function helloAction() {
               $a =10;
               $this->_forward("thanks","index", null, array('a' => $a));
        }
        public function thanksAction() {
               $a = $this->_getParam("a");
               $b = 20;
               $b = $b + $a; 
         }
 Note the _forward() will process all statements in helloAction(), skip its view script, and process all the statements in thanksAction and display its view script.`

オプション 2: 変数 $a をクラス パラメーターとして設定し、アクションで $this を使用してアクセスします。

      public function helloAction() {
            $this->a =10;

      }
      public function thanksAction() {
            $b = 20;
            $b = $b + $this->a; 
      }

オプション 3: セッションまたは Zend レジストリに値を設定し、必要な場所にアクセスします。

@vascowhiteが彼の回答で指摘したように、GET、POST、またはSESSIONを介さずにアクション間でパラメーターを渡す必要がある状況に遭遇した場合、設計上の問題が発生する可能性があります。できることの 1 つは、次のように、ステートメントを通常の関数に移動して、helloAction から呼び出すことです。

     public function helloAction() {
            $a =10;
            $c = $this->processA($a);

      }
      protected function processA($a) {
            $b = 20;
            $b = $b + $a; 
            return $b;
      }
于 2012-11-06T18:32:32.390 に答える
3

あなたはする必要はありません。コントローラーは、互いに通信する必要はありません。複数のコントローラーに共通する機能がある場合は、モデル レイヤーの 1 つに移動する必要があります。

最小限のロジックしか持たないスリムなコントローラーを目指して努力する必要があります。あるコントローラーが別のコントローラーにアクセスするための要件は、リファクタリングを行う必要があることを示すコードの匂いです。デザインを厳しく批判的に見て、この状況をどのように回避できるかを考えてください。それを続けると、さらに複雑になるだけです。

4 年間の ZF 開発と、1 人の開発者として 10 個のプロジェクトを完了した後、特に古いプロジェクトの維持に関しては、苦い経験から話しています。これで、コントローラーは何も共有しないという破ることのできないルールができました。

于 2012-11-06T19:00:20.617 に答える
0

janenz00はほぼすべてをカバーしていますが、各コントローラーはクラスであり、各アクションは関数であり、そのように呼び出すことができることを忘れないでください。

      public function helloAction() {
            $a =10;
            $this->thanksAction($a);

      }
      public function thanksAction($a) {
            $b = 20;
            $b = $b + $a; 
      }

ZF の世界では helloAction を実行しているため、両方のアクションが完了した後に表示されるビューは hello ビューであることに注意してください。actionHelper が必要ない場合は、これを使用して、コントローラー内で共通のロジック/検証/コードを処理することもできます。

于 2012-11-06T18:48:32.880 に答える