【CakePHP3】Controllerで表示させるViewファイルをrender()で変更する




今回は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で変数エラーが出ます。ついやってしまいがちなミスなので、気をつけてください。