【CakePHP入門】render()メソッドで任意のViewファイルを指定する

こんにちは!フリーエンジニアのヤマシタです。

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_image1

しかし、引数を指定しない場合は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'」が実行されます。

実行結果:
image2

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()メソッドの使い方を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。