2009-10-02 17 views
27

コントローラでは、別のコントローラのアクションを呼び出し、配列をパラメータとして渡す最も適切な方法は何ですか?CakePHP:配列をパラメータとして持つ別のコントローラのアクションを呼び出す最良の方法は?

requestActionを使用して他のコントローラ内のアクションを呼び出すことができることはわかっています。しかし、リクエストアクションを使用して配列としてパラメータを渡すことは可能ですか?

いいえ、私はApp Controllerにアクションを入れたくありません。それは私の解決策ではありません。

私が知っている唯一の他の方法はで説明したように、他のコントローラをロードすることです: http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-components-behaviors-views-and-helpers

しかし、単にパラメータとして配列を渡しながら、他のコントローラのアクションを呼び出すための簡単な方法はありますか?

私はcakePHPには新しいので、どんな提案もありがとうございます。ありがとう。

+0

どのcakephpのバージョンですか?それを追加できますか? –

答えて

24

ロジックを2番目のコントローラからそのモデルに移動し、最初のコントローラの動作でこれを行うことは適切でしょうか?

$var = ClassRegistry::init('SecondModel')->myMethod($array); 
$this->set(compact('var')); 

次に、最初のコントローラのアクションのビューで、そのデータを使用できます。

私は常にコントローラメソッドをブラウザでヒットし、モデルに多くのロジックを配置し、コントローラのモデルではないモデルからのデータを必要とするコントローラのアクションから外部モデルメソッドを呼び出し、そのデータを自分のビューで使用し、頻繁に表示されるデータの場合は、そのデータを作成します。

+0

良い提案。私はコントローラからモデルへのロジックを分離することについて何か聞いてきました。その概念についてまだ明確ではありません。私はケーキでより多くの経験を得ると、私はより明確な画像を得るでしょう。ご協力いただきありがとうございます。 – Vicer

+4

ニールは正しいアイデアを持っています。コントローラは、着信要求を処理して委任することを意図しています。主にあなたのモデルに含まれるべきビジネスロジック、またはコード。 –

+1

これは正しいとは思わない、モデルはデータベースアクセスルールのためのもので、コントローラは他のすべてを処理します。ほとんどの場合、アプリケーションの大半はコントローラにあります。私はあなたが "コード"それは物事 ".. ..とにかく、ベストプラクティスIMOは、優先順位を再利用するコードを作ることです、理想的には、たくさんのものがコントローラのcomponentsに置かれるべきです、モデルはデータのバリデーションなどのようなものにしか使われません。これらのケースは、通常、これらの再利用のためのコンポーネントフォルダ(モデルフォルダ内)にも作成する必要があります。 – Rick

3

CakePHP 1.2.5では、requestAction()の2番目のパラメータでさまざまなパラメータ型を渡すことができます。例えば:次にUserControllerにある状態

$this->requestAction('/users/view', array('pass' => array('123'))); 

function view($id) { 
    echo $id; // should echo 123 I believe, otherwise try $this->params['pass']. 
} 

代わりに、上記の「パス」を使用しての、あなたは代わりに、それぞれの形式/名前付きパラメータを渡すために「形式」と「という名前」を試すことができます。

+0

素晴らしい!私がそれをすることができるかどうかは分かりませんでした。試してみる。ありがとうございました。 – Vicer

+0

私はこれが動作することを確認できます – Mikelangelo

29

requestActionメソッドを使用するのではなく、必要なコントローラをインポートしてインスタンス化することをお勧めします。あなたは、インポートしたら

http://book.cakephp.org/view/434/requestAction

を " コントローラやモデルで使用することは稀適切である"

とコントローラをロード:

CakePHPのドキュメントがあることでrequestActionについて語りますそのコントローラーの任意のメソッドをパラメーターで呼び出すことができます。

<?php 
    //Import controller 
    App::import('Controller', 'Posts'); 

    class CommentsController extends AppController { 
    //Instantiation 
    $Posts = new PostsController; 
    //Load model, components... 
    $Posts->constructClasses(); 

    function index($passArray = array(1,2,3)) { 
     //Call a method from PostsController with parameter 
     $Posts->doSomething($passArray); 
    } 
    } 
?> 
+0

あなたの返信に感謝します。はい、私はrequestActionについての噂を聞いたことがあります。なぜそれが奨励されていないのだろうか。とにかく、 'インポート'は別の解決策です、ありがとう。 – Vicer

+0

私は同意します、これは最高です、私はrequestactionを使用していましたが、すぐになぜそれが良くないのかを示しています。特殊文字を使用することはできません。文字列に "/"を使用すると、htisはそれを別の変数に分割します。 – Rick

+0

別のコントローラで1つのコントローラアクションを使用することは、大きなアプリではかなり一般的です。 requestAction以外の方法でCakeが標準の単一のコマンドを実装しても、ドキュメントの状態でさえパフォーマンスが悪いというニュースがありますか? – Ryan

-1

それは、複数のコール

var $controllersArray = array(); 

function _getController($pControllerName){ 
    if (! isset($this->controllersArray[$pControllerName])){ 
     $importRes = App::import('Controller', $pControllerName);// The same as require('controllers/users_controller.php'); 
     $strToEval = "\$controller = new ".$pControllerName."Controller;"; 
     $evalRes = eval($strToEval); 
     if ($evalRes === false){ 
      throw new AppException("Error during eval of given getController '$pControllerName'"); 
     } 
     $controller->constructClasses();// If we want the model associations, components, etc to be loaded 
     $this->controllersArray[$pControllerName] = $controller; 
    } 
    $result = $this->controllersArray[$pControllerName]; 

    return $result; 
} 
+0

このコードをテストしたことは不可能です。それは構文エラーをスローします.. Eval ..:?確かに? –

3

CakePHPの2の場合のキャッシュであるので、私は私のAppControllerクラスに次のメソッドや変数を入れました。X:

<?php 
App::uses('AppController', 'Controller'); 
App::uses('PostsController', 'Controller'); 

class CommentsController extends AppController { 

    public function index($parameter = null){ 
     //Instantiate 
     $Posts = new PostsController(); 
     //Load model, components... 
     $Posts->constructClasses(); 

     //Call a method of Posts passing a parameter 
     $Posts->aMethod($parameter); 
    } 
} 
関連する問題