1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CakePHP4でTwigテンプレートエンジンを使う方法

Posted at

CakePHP4は標準ではテンプレートエンジンが使えないため、Viewでは生PHPで出力処理を書きます。
CookBook(公式ドキュメント)でもテンプレートエンジンについての記載はなく、一見使用できないように思えますが、実はCakePHP4には元々cakephp/twig-viewというパッケージが含まれており、設定変更すればTwigをテンプレートエンジンとして使用できます。
https://github.com/cakephp/twig-view

Twigを使うための手順は以下のとおりです。

1. AppView.phpを変更

・AppViewの継承元クラスをTwigViewに変更
・use Cake\TwigView\View\TwigViewに変更
・initialize()メソッド内で親クラスのinitialize()を呼び出し

src/View/AppView.php
<?php
declare(strict_types=1);

namespace App\View;

- use Cake\View\View;
+ use Cake\TwigView\View\TwigView;

- class AppView extends View
+ class AppView extends TwigView
{
    public function initialize(): void
    {
+       parent::initialize();
        // オプション設定する場合はここに記述
    }
}

※コメント部分は省略しています。

2. テンプレートの拡張子を変更

各テンプレートファイル(templates/)の拡張子を.phpから.twigに変更します。

例:default.php => default.twig

3. テンプレートの内容をTwigでの記述に変更

テンプレートの内容を全てTwig記法で書き換えます。
以下、動作確認を兼ねた簡単な記述例です。

layout/default.twig
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    {{ fetch('content') }}
</body>
</html>
Posts/index.twig
<h2>{{ title }}</h2>

{% for post in posts %}
    {% if post.isPublished %}
        <h4>{{ post.title }}</h4>
        <p>{{ post.body }}</p>
        <hr>
    {% endif %}
{% endfor %}
PostsController.php
<?php
declare(strict_types=1);

namespace App\Controller;

class PostsController extends AppController
{
    public function index()
    {
        $title = 'Twig表示テスト';
        $posts = [
            [
                'title' => '記事タイトル 1',
                'body' => '本文テキスト 1',
                'isPublished' => true,
            ],
            [
                'title' => '記事タイトル 2',
                'body' => '本文テキスト 2',
                'isPublished' => false,
            ],
            [
                'title' => '記事タイトル 3',
                'body' => '本文テキスト 3',
                'isPublished' => true,
            ],
        ];
        $this->set(compact('title', 'posts'));
    }
}

上記コードの場合、以下スクリーンショットのような表示になります。
正常に表示されていれば、Twigでの描画に切り替わっています。
2021-05-29-Twig表示テスト.png

参考情報

cakephp/twig-viewの設定方法・オプション機能などの詳細については、以下URLのReadmeに記載されています。
https://github.com/cakephp/twig-view

Twigテンプレートエンジンの公式ドキュメントです。
https://twig.symfony.com/doc/3.x/

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?