このエントリーが役に立ったらシェアをお願いします!

CakePHPで実行中のアクションを切り替える便利関数!

このエントリーが役に立ったらシェアをお願いします!

CakePHPでアクションの処理を実行している時、他のアクションに移りたい・・という時があります。
そんな時に役立つControllerの関数をご紹介します。
CakePHPに触り始めた頃の僕は無理矢理こういう風に書いてました。

class TestController extends AppController {

  public function index() {
    $this->redirect(array('action' => 'move'));
  }

  public function  move() {
  }
}

・・・これではリダイレクトなのでURLがmoveに書き換わり、moveActionとして処理が仕切り直されます。
アドレスを変えたくない!内部的に切り替えたい!
でもCakePHPの公式ドキュメントにもやり方が書いてない!

・・書いてないんですが、実はこんな関数が用意されています。

スポンサーリンク

Action間の移動を可能にするsetAction関数

Cakeのドキュメントに書かれていない裏方関数。setAction関数です。
setActionの引数にAction名を渡すことで実行中のアクションを切り替える事ができます。
また、クラス変数(ここではtmp)を経由すれば値のやり取りも可能です。

class TestController extends AppController {

  public $tmp;

  public function index() {
    $this->setAction('move');
    $this->set('text', 'indexAction');
  }

  public function  move() {
    $this->set('text', 'moveAction');
  }
}

ただし、注意しなければならないのはsetActionを実行した時の動きです。

  1. renderを明示的に指定しない場合、移動先アクションのViewを表示する
  2. 移動先アクション実行後、移動元のアクションの処理に戻る

処理の順序としては以下のようになります。
この場合、Viewに渡される変数$textの値は’indexAction’という文字列になります。

class TestController extends AppController {

  public $tmp;

  public function index() {  //1
    $this->setAction('move');  //2
    $this->set('text', 'indexAction');  //6
  }  //7 →moveのviewをrenderする

  public function  move() {  //3
    $this->set('text', 'moveAction');  //4
  }  //5
}

なので、移動先Actionで処理を完結させたい場合はsetActionの直後にreturn;を書いてやると処理を終えることができます。
ifで処理を分岐してsetAction(); return;なんて使い方もありですね。
また、$this->render()で明示的にレンダーするViewを指定してやれば、移動先のViewがレンダーされることも防げます。

そんな少しクセのある関数ですが、色々使える場面があるのではないでしょうか。

スポンサーリンク

このエントリーが役に立ったらシェアをお願いします!

1この記事を書いた人
ShoheiTai
フロントエンド志向のWebエンジニア。
HTML5やWeb高速化、SEO等のフロントエンド開発が大好物。
バックエンドではCakePHP,Wordpress開発を主戦場としています。
Web開発のスパイスファクトリー株式会社創業メンバー。

CakePHPで実行中のアクションを切り替える便利関数!
イケてないコード - Webエンジニアのブログの
最新情報をいいねしてチェックしよう!