今回はControllerでレンダリングを行うViewファイルを任意に変更できるrender()メソッドについて解説していきます。
目次
そもそもの命名規約について
ウェブフレームワークcakePHPは命名規約が厳しく、ControllerとViewファイル(.ctp)の間にもルールが存在します。基本的にはそれに従ってコードを書いていくのですが、自由にControllerのレンダリング先Viewファイルを変えたいということがあるでしょう。そのときはrender()メソッドを使います。
コードサンプル
src/Controller/ArticlesController.php
<?php namespace App\Controller; use App\Controller\AppController; class ArticlesController extends AppController { public function index() { $articles = $this->paginate($this->Articles); $this->set(compact('articles')); #src/Template/Articles/hogehoge.ctpをレンダリングする $this->render('hogehoge'); } }
こちらのコードサンプルでは、ArticlesController.phpというコントローラーを作成し、index()というメソッドを定義しています。cakePHPの規約に従えば、このindex()はsrc/Template/Articles/index.ctpファイルをレンダリングします。
しかし、index.ctp以外のファイルを使いたいという場合もあるかもしれません。今回はArticlesディレクトリにあるhogehoge.ctpを対象にしたいとすると、$this->render(‘hogehoge’);と書くことによってレンダリング先をsrc/Template/Articles/hogehoge.ctpにすることができます。
()の中にはsrc/Template/Articlesからの相対パスを書くので、$this->render(‘sample/hogehoge.ctp’)のように階層を深くしていくことも可能です。
render()の注意点
このrender()メソッドは、使われたところで処理が終了します。つまりメソッド内(今回の場合はindex())の一番最後か、returnの直前に書かなければいけません。例えば、
<?php namespace App\Controller; use App\Controller\AppController; class ArticlesController extends AppController { /** * Index method * * @return \Cake\Http\Response|null */ public function index() { $articles = $this->paginate($this->Articles); #src/Template/Articles/hogehoge.ctpをレンダリングする $this->render('hogehoge'); $this->set(compact('articles')); } }
このようにset()の前でrender()をしてしまうとset()が行われずviewで変数エラーが出ます。ついやってしまいがちなミスなので、気をつけてください。