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

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次