CodeIgniter4でTwigを使ってみる

この記事は CodeIgniter Advent Calendar 2020 - Qiita の10日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

CodeIgniter4 で Twig を利用してみたいと思います。

以下の公式チュートリアルのアプリを Twig 化します。

Twig のインストール

codeigniter-ss-twig の 4.x ブランチをインストールします。

$ composer require kenjis/codeigniter-ss-twig:4.x-dev

(2021-02-23 追記) v4.0.0をリリースしましたので、現在は開発ブランチではなく、kenjis/codeigniter-ss-twig:^4.0でOKです。

Twig テンプレートの作成

ページ全体のテンプレートを作成します。

app/Views/news_tmpl.html.twig


<!doctype html>
<html>
<head>
    <title>CodeIgniter Tutorial</title>
</head>
<body>

<h1>{{ title }}</h1>

{% include main ~ '.twig' %}

<em>&copy; 2019</em>
</body>
</html>

各ページのパーツを作成します。

app/Views/news/create.html.twig


<h2>{{ title }}</h2>

{{ validation_list_errors() }}

<form action="/news/create" method="post">
    {{ csrf_field() }}

    <label for="title">Title</label>
    <input type="input" name="title" /><br />

    <label for="body">Text</label>
    <textarea name="body"></textarea><br />

    <input type="submit" name="submit" value="Create news item" />
</form>

app/Views/news/overview.html.twig


<h2>{{ title }}</h2>

{% if news %}

    {% for news_item in news %}

        <h3>{{ news_item.title }}</h3>

        <div class="main">
            {{ news_item.body }}
        </div>
        <p><a href="/news/{{ news_item.slug|url_encode }}">View article</a></p>

    {% endfor %}

{% else %}

    <h3>No News</h3>

    <p>Unable to find any news for you.</p>

{% endif %}

app/Views/news/success.html.twig

<p>News item created successfully.</p>

app/Views/news/view.html.twig


<h2>{{ news.title }}</h2>
<p>{{ news.body }}</p>

News コントローラ

News コントローラを Twig を使うように変更します。

--- a/app/Controllers/News.php
+++ b/app/Controllers/News.php
@@ -4,9 +4,32 @@ namespace App\Controllers;
 use App\Models\NewsModel;
 use CodeIgniter\Controller;
 use CodeIgniter\Exceptions\PageNotFoundException;
+use CodeIgniter\HTTP\RequestInterface;
+use CodeIgniter\HTTP\ResponseInterface;
+use Psr\Log\LoggerInterface;
+use Kenjis\CI4Twig\Twig;

 class News extends Controller
 {
+    /**
+     * @var Twig
+     */
+    private $twig;
+
+    public function initController(
+        RequestInterface $request,
+        ResponseInterface $response,
+        LoggerInterface $logger
+    ) {
+        parent::initController(
+            $request,
+            $response,
+            $logger
+        );
+
+        $this->twig = new Twig();
+    }
+
     public function index()
     {
         $model = new NewsModel();
@@ -14,12 +37,11 @@ class News extends Controller
         $data = [
             'news'  => $model->getNews(),
             'title' => 'News archive',
+            'main'  => 'news/overview.html',
         ];
 //        dd($data);

-        echo view('templates/header', $data);
-        echo view('news/overview', $data);
-        echo view('templates/footer', $data);
+        return $this->twig->render('news_tmpl.html', $data);
     }

     public function view($slug = null)
@@ -34,11 +56,10 @@ class News extends Controller
         }

         $data['title'] = $data['news']['title'];
+        $data['main'] = 'news/view.html';
 //        dd($data);

-        echo view('templates/header', $data);
-        echo view('news/view', $data);
-        echo view('templates/footer', $data);
+        return $this->twig->render('news_tmpl.html', $data);
     }

     public function create()
@@ -56,14 +77,19 @@ class News extends Controller
                  'body'  => $this->request->getPost('body'),
             ]);

-            echo view('news/success');
+            $data['main'] = 'news/success.html';
+
+            return $this->twig->render('news_tmpl.html', $data);

         }
         else
         {
-            echo view('templates/header', ['title' => 'Create a news item']);
-            echo view('news/create');
-            echo view('templates/footer');
+            $data = [
+                'title' => 'Create a news item',
+                'main' => 'news/create.html',
+            ];
+
+            return $this->twig->render('news_tmpl.html', $data);
         }
     }
 }

これで Twig 化できました。

この記事は CodeIgniter Advent Calendar 2020 - Qiita の10日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

参考

Tags: codeigniter, codeigniter4, twig

codeigniter4-dockerでCodeIgniter4の開発環境を作成してみる

この記事は CodeIgniter Advent Calendar 2020 - Qiita の8日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

CodeIgniter4 用の Docker イメージというのがありましたので、試してみたいと思います。

(2021-02-23 追記) その後、docker-codeigniter-apache を作成しました。

codeigniter4-docker

使っているソフトウェアのバージョンは、執筆時点では、以下になっています。

  • php:7.3-apache
  • mariadb:10.5.5
  • phpmyadmin:5.0.2
  • CodeIgniter 4.0.4

作業環境

  • Docker Desktop Community 2.5.0.1
  • macOS 10.15.7

Docker Desktop がインストールされていない場合は、https://www.docker.com/products/docker-desktop からダウンロードしてインストールしてください。

開発環境の構築

プロジェクト用のフォルダを作成します。

$ mkdir ci4-docker

docker-compose.yml を作成します。

$ cd ci4-docker/
$ vi docker-compose.yml

https://github.com/atsanna/codeigniter4-docker/blob/master/docker-compose.yml をコピペします。

ビルドします。

$ docker-compose up -d

しばらくするとビルドが終わります。非常に簡単ですね。

フォルダ構成

以下のフォルダ構成になってました。

ci4-docker/
├── docker-compose.yml
└── localfolder/
    ├── logs/
    │   └── mysql/
    ├── mysql/
    ├── sessions/
    └── www/
        └── codeigniter4/
            ├── README.md
            ├── app/
            ├── builds*
            ├── composer.json
            ├── composer.lock
            ├── env
            ├── license.txt
            ├── phpunit.xml.dist
            ├── public/
            ├── spark*
            ├── tests/
            ├── vendor/
            └── writable/

アクセス方法

CodeIgniter4

http://localhost/ にアクセスすると、Welcome ページが表示されます。

phpMyAdmin

http://localhost:81/ にアクセスすると phpMyAdmin のログインページが表示されます。

以下のアクセス情報でログインできます。

MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: codeigniter4
MYSQL_USER: codeigniter4
MYSQL_PASSWORD: codeigniter4

正常に動作しているようです。

このように非常に簡単に CodeIgniter4 の開発環境を構築できました。

この記事は CodeIgniter Advent Calendar 2020 - Qiita の8日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

参考

Tags: codeigniter, codeigniter4, docker