令和から始める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
詳細は、公式ドキュメントを見ること。
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フレームワークにはない自由があって良いぞ。