web-dev-qa-db-ja.com

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が初めてなので、どんな提案でも歓迎します。ありがとう。

27
Vicer

ロジックを2番目のコントローラーからそのモデルに移動し、最初のコントローラーのアクションでこのようなことをするのが適切でしょうか?

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

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

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

25
neilcrookes

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

CakePHPのドキュメントはrequestActionについて次のように述べています:

「コントローラーまたはモデルで使用することはめったに適切ではありません」

http://book.cakephp.org/view/434/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);
    }
  }
?>
29
Schaoulli

CakePHP 1.2.5では、requestAction()の2番目のパラメーターを介してさまざまなパラメータータイプを渡すことができるはずです。例えば。:

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

次に、UsersControllerで:

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

上記の「pass」を使用する代わりに、「form」と「named」を使用して、それぞれform/namedパラメーターを渡すことができます。

3
Matt Huggins

CakePHP 2.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);
    }
}
3
Jocari