Viewで描画を行うときに、処理によっては別のViewファイルを指定したい場合もあります。
この記事では、
・renderメソッドとは
・renderメソッドで引数を指定しない場合
・renderメソッドで引数を指定した場合
・renderメソッドの注意点
などのrenderメソッドの使い方に関して解説していきます。
renderメソッドは、別のViewファイルを描画したいときに非常に便利です。
ここではそんなrenderメソッドの使い方について、分かりやすく解説します!
renderメソッドとは
Controller::render()メソッドは、各アクションの最後に自動的に呼ばれ、Viewを描画します。
CakePHPでは、$this->autoRenderにfalseを指定しない限り、Controllerのアクションの最後に自動的にViewが呼び出されます。
ここで、
「Controllerの最後で自動的にViewが呼び出されるならrenderメソッドは不要では?」
と疑問に思われる方もいるかもしれません。
しかし、処理によっては別のViewのファイル(ctp)を指定したいときもあります。
そのような場合はrenderメソッドを使用すると便利です。
renderメソッドは以下のように記述します。
$this->render(string $view, string $layout);
引数にViewで描画するctpファイルを指定することで、そのファイルが呼び出されます。
renderメソッドの使い方
ここでは実際にrenderメソッドを使用してViewを呼出してみましょう。
引数を指定しない場合
以下はrenderメソッドで引数を指定しない場合のサンプルです。
引数を指定しない場合は、通常の規約どおりにViewファイルが呼び出されます。
src/Controller/SampleController.php
<?php namespace App\Controller; use App\Controller\AppController; class SampleController extends AppController { public function index() { $this->render(); } }
src/Template/Sample/index.ctp
<h2>これはindex.ctpです。</h2>
このサンプルを実行すると、「src/Template/Sample/index.ctp」のViewファイルが描画されます。
実行結果:
しかし、引数を指定しない場合はrenderメソッドを使用しなくても、Viewファイルが自動的に呼び出されます。
そのためrenderメソッドで引数を指定しないで使用することは、用途的には少ないと言えるでしょう。
引数を指定した場合
次にrenderメソッドに引数を指定したサンプルを紹介します。
以下のようにrenderメソッドに引数で別のctpファイルを指定します。
src/Controller/SampleController.php
<?php namespace App\Controller; use App\Controller\AppController; class SampleController extends AppController { public function index() { $this->render('/Sample2/sample'); } }
引数に指定した「/Sample2/sample」は、src/Templateフォルダからの相対パスであるとみなします。
そのためViewファイルは「src/Template/Sample2/sample.ctp」に作成します。
sample.ctp
<h2>これはsample.ctpです。</h2>
このサンプルを実行すると、Viewファイルはrenderメソッドで指定した「’/Sample2/sample’」が実行されます。
実行結果:
renderメソッドの注意点
注意しておきたいのが、renderメソッドはsetメソッドで渡したデータを使ってViewを描画します。
そのため、先にrenderメソッドを指定すると以降の処理は実行されません。
<誤>
$this->render('/Sample2/sample'); $this->set('sample', 'テスト文字列');
↑の処理ではrenderメソッドで処理が止まってしまい、setメソッドが実行されません。
Viewファイルで変数を参照しようとしても、変数が渡されていないため、未定義でエラーとなってしまうので注意しましょう。
正しくは以下のように記述します。
<正>
$this->set('sample', 'テスト文字列'); $this->render('/Sample2/sample');
実際にサンプルを動かして動作の違いを確認してみましょう。
src/Controller/SampleController.php
<?php namespace App\Controller; use App\Controller\AppController; class SampleController extends AppController { public function index() { //正しいパターンです $this->set('sample', 'テスト文字列'); $this->render('/Sample2/sample'); } }
sample.ctp
<h2>これはsample.ctpです。</h2> <br/> <?= isset($sample) ? $sample :'' ?>
実行結果:
確かに、sampleに値が受け渡されましたね!
まとめ
ここでは、Viewを描画するrenderメソッドについて、
・renderメソッドとは
・renderメソッドで引数を指定しない場合
・renderメソッドで引数を指定した場合
・renderメソッドの注意点
などについて解説しました。
renderメソッドは別のViewファイルを指定して描画を行いたいときに便利ですので、使い方はよく覚えておきましょう。
もし、render()メソッドの使い方を忘れてしまったら、この記事を思い出してくださいね!