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を実行した時の動きです。
- renderを明示的に指定しない場合、移動先アクションのViewを表示する
- 移動先アクション実行後、移動元のアクションの処理に戻る
処理の順序としては以下のようになります。
この場合、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がレンダーされることも防げます。
そんな少しクセのある関数ですが、色々使える場面があるのではないでしょうか。
コメント