令和から始めるCodeIgniter3入門

この記事は、CodeIgniter3の入門レベルの解説をしていく。

CodeIgniter3の機能やクラス、関数などについては公式ドキュメントに詳しくかつ 分かりやすく書かれているので、そちらを読むこと。

CodeIgniter ユーザガイド — CodeIgniter 3.2.0-dev ドキュメント

この記事では、公式ドキュメントには載っていないけど、 CodeIgniter3で実用的なWebアプリを作る上で知っておくべき事柄をまとめていく。

令和の時代にCodeIgniter3は使えるのか?

使える。と言うより、僕が使っている

Laravelと比較すると色々と機能がしょぼいのは否定できないが、学習コストの低さと速度は大きなウリと言える。

僕自身Laravelを勉強するのに2週間ほどかかったが、CodeIginiter3は1日あれば公式ドキュメントをチェックできるし、 覚えるべき事柄も断然少ない。

CodeIginiter3自体はまだメンテされており、2023年5月時点ではPHP5.4 ~ 8.1までサポートされている。

また、後継バージョンだとして、CodeIginiter4の開発も進められている。4の方は3の思想を継承した上でモダンな設計、機能を兼ね備えており、4の方を使っても良いと思う。

ただ、今回は3の解説をしていく。

CodeIgniter3のインストール方法

CodeIginiter3はcomposerを使わずに公式サイトから直接インストールして使うこともできるが、 、composerからインストールする事を強く推奨する

composerからのインストールでは、以下のコマンドを実行する。(sample_appの部分はプロジェクト名に書き換えること。)

composer create-project kenjis/codeigniter-composer-installer sample_app

このinstallerからCodeIginiter3をインストールすることで、以下のメリットがある。

  • bin/server.shでローカルサーバルが立ち上がるスクリプト付き(本家にはない)
  • composerが使える設定を最初からしている。(本家ではconfig.phpファイルから設定する必要がある)

CodeIgniter3の開発で便利なライブラリをインストール

以下は、CodeIgniter3の開発で必須のライブラリを紹介する。

ci-phpunit-test

悲しい事に、CodeIgniter3自体はコンソールからUnitTestをする機能がないので、 ci-phpunit-testを使ってテスト環境を整える。

composer require kenjis/ci-phpunit-test:^3.0 --dev

その後、テストに必要なコードやディレクトリを作成するために以下のコマンドを実行する。

php vendor/kenjis/ci-phpunit-test/install.php -a ./application -p ./public -t ./tests

カレントディレクトリ以下に、testsディレクトリが作成されているはず。

テストの詳細な方法は、以下のドキュメントを見ること。

codeigniter-cli

悲しい事に、CodeIgniter3には標準でコンソールからデータベースのMigrationを行う機能はない。

と言うより、Cliを通して自作コマンドを実行する仕組みがない。 (厳密には、Controllerをコマンドの様に実行する、と言うトリッキーな方法ならできる。)

そこでcodeigniter-cliというライブラリを使う事で解決していく。

composer require kenjis/codeigniter-cli --dev
php vendor/kenjis/codeigniter-cli/install.php

上記のライブラリを導入後、application/commandsにコマンドを記述することで、コマンド実行ができる様になる。

<?php
# application/commands/TestCommand.php

class TestCommand extends Command {

    public function __invoke()
    {
        $this->stdio->outln('<<green>>This is TestCommand class<<reset>>');
    }

}

上記のコマンドを作成後、./cli testとすることで実行できる。

他にも、Migrationファイルの作成、実行やSeedの実行などができる。 詳細は、以下のドキュメントに記載されている。

phpdotenv

CodeIgniter3ではapplication/configディレクトリ以下にtestingディレクトリやproductionディレクトリを作成し、そこに諸々の設定ファイルを追加することで、環境ごとに設定を変える事ができる。

しかし、GitHub等で管理する以上は設定値をハードコーディングしたくないので、上記の機能を使うよりも、 phpdotenvを導入した方が遙かに良い。

phpdotenvを導入することで、Laravelの様に.env.env.testingの様に設定を管理できる。

まずは、phpdotenvをインストール。

composer require vlucas/phpdotenv

phpdotenvを使える様にするために、application/config/config.phpファイルを開き、以下の設定を修正する。

// false から true にする。
$config['enable_hooks'] = true;

そして、application/config/hook.phpを開き、以下のように修正する。

<?php

defined('BASEPATH') or exit('No direct script access allowed');

use Dotenv\Dotenv;

$hook['pre_system'] = function () {
    try {
        $base_path = realpath(APPPATH . "..");

        if (file_exists($base_path . "/.env." . ENVIRONMENT)) {
            $file = ".env." . ENVIRONMENT;
        } else {
            $file = ".env";
        }

        $dotenv = Dotenv::createUnsafeImmutable($base_path, $file);
        $dotenv->load();

    } catch (\Throwable $e) {
        log_message("error", $e->getMessage() . "\n" . $e->getTraceAsString());
        exit;
    }
};

実際に使う時には、.envファイルを以下の様に設定する。

DB_HOST="127.0.0.1"
DB_USER="root"
DB_PASS="password"
DB_NAME="sample_db"

そしてapplication/config/database.phpで以下の様に使う


$db['default'] = array( 'dsn' => '', 'hostname' => $_ENV["DB_HOST"], 'username' => $_ENV["DB_USER"], 'password' => $_ENV["DB_PASS"], 'database' => $_ENV["DB_NAME"], );

注意としては、gentenv関数だと値を取得できないので、$_ENVを使うこと。

yidas/codeigniter-model

CodeIgnitier3のORMを拡張するライブラリ。

デフォルトのORMを使うのも良いが、もう少し機能を増やしたORMを使いたい時にこちらのORMが役に立つ。 また、Validation処理も良い感じにやってくれる。

composer require yidas/codeigniter-model

詳細は、公式ドキュメントを見ること。

yidas/codeigniter-model: CodeIgniter 3 Active Record (ORM) Standard Model with Laravel Eloquent & Yii2 AR like

twig

悲しい事に、CodeIgniter3はデフォルトでテンプレートエンジンを備えておらず、 標準で用意しているXSS対策も変な実装になっている.

(CSRF対策やSQLインジェクション対策は上手く機能している。)

そこでテンプレートエンジンはtwigを使うことで、上記の問題を解決していく。 (別にまともなテンプレートエンジンであればなんでも良い。)

CodeIgniter3でtwigを利用するには、codeiginiter-twig-ssのライブラリを使うのが良い。 (1つ注意だが、version 1.0を使うこと。 v4.0以上はCodeIgniter4向けのライブラリになっている。)

kenjis/codeigniter-ss-twig at v1.0.0

composer require kenjis/codeigniter-ss-twig:^1.0
php vendor/kenjis/codeigniter-ss-twig/install.php

これで、application/librariesディレクトリ以下にTwig.phpがコピーされる。

使い方は簡単で、application/viewsディレクトリにtwigのviewファイルを書いた後に、Controller内に 以下の処理を書けば良い。

基本的には、CodeIgniter3標準のviewと同じ様に書ける。

<?php

public function index()
{
    $this->load->library('twig');

    # Responseとして返す。
    $this->twig->display('welcome', $data);

    # 文字列として返す。
    $output = $this->twig->render('welcome', $data);
}

他にも、twig内にグローバル変数を定義したり、関数を追加したりできる。 詳細は以下のドキュメントを読むこと。

$output = $this->twig->render('welcome', $data);

まとめ

ここまで頑張る必要があるのだからLaravelやCodeIgniter4を使えば良いのでは と一瞬頭をよぎったが、愛着があるから仕方ない。

CodeIgniter3は他のWebフレームワークにはない自由があって良いぞ。