Welcome to the Cookbook

loading...

3.5.5.4.6 requestAction

requestAction(string $url, array $options)

この関数は、なんらかのロケーションを使用してコントローラのアクションを呼び出し、そのアクションの実行結果のデータを返します。$url に渡すのは CakePHP の相対 URL (/controllername/actionname/params) です。受信コントローラのアクションに特別なデータを渡すには、 $options 配列に追加します。

オプションに 'return' を渡すことで requestAction() を使用して、完全にレンダリングされたビューを取得することができます。: requestAction($url, array('return'));

キャッシュを使わずに requestAction を使用すると、パフォーマンスが悪くなります。まれにコントローラやモデルで使用することが適切な場合があります。

requestAction は(キャッシュされた)エレメントとともに使用されることが一番多いです。- レンダリングする前にエレメント用のデータを取り出すために使用されるからです。レイアウト内で "latest comments" エレメントを設置する例を見てみましょう。初めにデータを返すコントローラの関数を作成する必要があります。

// controllers/comments_controller.php
class CommentsController extends AppController {
    function latest() {
        return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10));
    }
}
  1. // controllers/comments_controller.php
  2. class CommentsController extends AppController {
  3. function latest() {
  4. return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10));
  5. }
  6. }

上記の関数を呼び出す簡単なエレメントを作成は次のように行います:

// views/elements/latest_comments.ctp

$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
    echo $comment['Comment']['title'];
}
  1. // views/elements/latest_comments.ctp
  2. $comments = $this->requestAction('/comments/latest');
  3. foreach($comments as $comment) {
  4. echo $comment['Comment']['title'];
  5. }

どこにでもエレメントを設置することができます。出力を取得して使用します:

echo $this->element('latest_comments');
  1. echo $this->element('latest_comments');

このように記述すると、エレメントがレンダリングされるときはいつでも、リクエストが生成されコントローラにデータが渡されます。データは処理されてから返されます。しかし、不必要な処理を防ぐためにエレメントのキャッシュを使用することが重要であることに注意してください。エレメントの呼び出しを変更することによって次のようになります。:

echo $this->element('latest_comments', array('cache'=>'+1 hour'));
  1. echo $this->element('latest_comments', array('cache'=>'+1 hour'));

requestAction の呼び出しは、キャッシュされたエレメントのビューファイルが存在し有効である間は生成されなくなります。

さらに、requestAction は Cake 流儀の URL に基づいた配列も扱えるようになりました。

echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured'), array('return'));
  1. echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured'), array('return'));

これにより requestAction の呼び出しが Router::url を使用しないため、パフォーマンス向上が図れます。URL に基づいた配列は、一つの点を除き HtmlHelper::link で使用する配列と同じです。もし名前つきの引数もしくはpassed引数を使用する場合は、これらを第二引数に正しいキーでラップして渡さなければなりません。これは、requestAction が名前つきの変数を、Controller::params にまとめるだけで、名前つきの変数を 'named' キーに位置づけないからです。

echo $this->requestAction('/articles/featured/limit:3');
echo $this->requestAction('/articles/view/5');
  1. echo $this->requestAction('/articles/featured/limit:3');
  2. echo $this->requestAction('/articles/view/5');

これらを requestAction へ配列で渡すには、次のようにします。:

echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured'), array('named' => array('limit' => 3)));
echo $this->requestAction(array('controller' => 'articles', 'action' => 'view'), array('pass' => array(5)));
  1. echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured'), array('named' => array('limit' => 3)));
  2. echo $this->requestAction(array('controller' => 'articles', 'action' => 'view'), array('pass' => array(5)));

文字列の URL と類似した配列を利用するほかの場所と違い、requestAction はこれらを異なるものとして扱います。

requestAction() に URL を配列で渡す場合、全ての パラメータを要求するアクションに定義する必要があります。これには、$this->data$this->params['form'] を含みます。加えて全ての必要なパラメータを渡すには、namedとpassパラメータは上記で見られるような二つ目の配列で渡されている必要があります、