CodeIgniter 4.2のインストール方法【2022年最新版】

CodeIgniter 4.2 のインストール方法と初期設定についてまとめておきます。

なお、4.2.0 からデフォルトでは自動ルーティングが無効に変更されています。

CodeIgniter 4.2 のサーバ要件

  • PHP 7.4 以上
    • php-json、php-mysqlnd(MySQL を使う場合)、php-xml が有効
    • intl、mbstring 機能拡張
    • libcurl(CURLRequest を使う場合)
  • データベース
    • MySQL 5.1 以上(MySQLi ドライバ)
    • PostgreSQL(Postgre ドライバ)
    • SQLite3(SQLite3 ドライバ)
    • Microsoft SQL Server 2005 以上(SQLSRV ドライバ)
    • Oracle 12.1 以上(OCI8 ドライバ)

動作確認環境

  • CodeIgniter 4.2.1
  • Composer 2.3.7
  • PHPUnit 9.5.21
  • PHP 8.0.20
    • Xdebug 3.1.1
  • MySQL 5.7.32
  • macOS 10.15.7

Composer のインストール

Composer とは、PHPでの新しいパッケージ(ライブラリ)管理システムです。

Composer はパッケージ管理コマンドとしての composer コマンド、パッケージのリポジトリとしてのPackagist、そしてクラスファイルをオートロードするオートローダを提供します。

Composer では主にパッケージを各プロジェクト配下にインストールして使います。

Homebrew

Composer は Homebrew からインストールできます。

以下のコマンドを実行してください。

$ brew install composer

Homebrew を使わない場合は、以下の公式のインストール方法があります。

公式のインストール方法

https://getcomposer.org/download/ に記載されているコマンドを実行します。

執筆時点では以下のようになっています。

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Installer verified
$ php composer-setup.php
All settings correct for using Composer
Downloading...

Composer (version 2.3.7) successfully installed to: /Users/kenji/composer.phar
Use it: php composer.phar
$ php -r "unlink('composer-setup.php');"

これで、カレントディレクトリに composer.phar がインストールされます。

composer.pharcomposer にリネームし、パスの通ったディレクトリに配置してください。

例えば、

$ mv composer.phar /usr/local/bin/composer

composer コマンドの確認

composer コマンドを実行してみましょう。

以下のようにバージョンとヘルプが表示されます。

$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.3.7 2022-06-06 16:43:28

Usage:
  command [options] [arguments]

...

CodeIgniter 4.2 のインストール

CodeIgniter 4 を composer からインストールします。

$ composer create-project codeigniter4/appstarter ci4app
Creating a "codeigniter4/appstarter" project at "./ci4app"
Info from https://repo.packagist.org: #StandWithUkraine
Installing codeigniter4/appstarter (v4.2.1)
  - Downloading codeigniter4/appstarter (v4.2.1)
  - Installing codeigniter4/appstarter (v4.2.1): Extracting archive
Created project in /Users/kenji/tmp/ci4app
Loading composer repositories with package information
Updating dependencies
Lock file operations: 41 installs, 0 updates, 0 removals
  - Locking codeigniter4/framework (v4.2.1)
  - Locking doctrine/instantiator (1.4.1)
  - Locking fakerphp/faker (v1.19.0)
  - Locking kint-php/kint (4.1.2)
  - Locking laminas/laminas-escaper (2.10.0)
  - Locking mikey179/vfsstream (v1.6.10)
  - Locking myclabs/deep-copy (1.11.0)
  - Locking nikic/php-parser (v4.14.0)
  - Locking phar-io/manifest (2.0.3)
  - Locking phar-io/version (3.2.1)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.3.0)
  - Locking phpdocumentor/type-resolver (1.6.1)
  - Locking phpspec/prophecy (v1.15.0)
  - Locking phpunit/php-code-coverage (9.2.15)
  - Locking phpunit/php-file-iterator (3.0.6)
  - Locking phpunit/php-invoker (3.1.1)
  - Locking phpunit/php-text-template (2.0.4)
  - Locking phpunit/php-timer (5.0.3)
  - Locking phpunit/phpunit (9.5.21)
  - Locking psr/container (2.0.2)
  - Locking psr/log (1.1.4)
  - Locking sebastian/cli-parser (1.0.1)
  - Locking sebastian/code-unit (1.0.8)
  - Locking sebastian/code-unit-reverse-lookup (2.0.3)
  - Locking sebastian/comparator (4.0.6)
  - Locking sebastian/complexity (2.0.2)
  - Locking sebastian/diff (4.0.4)
  - Locking sebastian/environment (5.1.4)
  - Locking sebastian/exporter (4.0.4)
  - Locking sebastian/global-state (5.0.5)
  - Locking sebastian/lines-of-code (1.0.3)
  - Locking sebastian/object-enumerator (4.0.4)
  - Locking sebastian/object-reflector (2.0.4)
  - Locking sebastian/recursion-context (4.0.4)
  - Locking sebastian/resource-operations (3.0.3)
  - Locking sebastian/type (3.0.0)
  - Locking sebastian/version (3.0.2)
  - Locking symfony/deprecation-contracts (v3.0.1)
  - Locking theseer/tokenizer (1.2.1)
  - Locking webmozart/assert (1.11.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 41 installs, 0 updates, 0 removals
  - Installing psr/log (1.1.4): Extracting archive
  - Installing laminas/laminas-escaper (2.10.0): Extracting archive
  - Installing kint-php/kint (4.1.2): Extracting archive
  - Installing codeigniter4/framework (v4.2.1): Extracting archive
  - Installing symfony/deprecation-contracts (v3.0.1): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing fakerphp/faker (v1.19.0): Extracting archive
  - Installing mikey179/vfsstream (v1.6.10): Extracting archive
  - Installing webmozart/assert (1.11.0): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing phpdocumentor/type-resolver (1.6.1): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.3.0): Extracting archive
  - Installing sebastian/version (3.0.2): Extracting archive
  - Installing sebastian/type (3.0.0): Extracting archive
  - Installing sebastian/resource-operations (3.0.3): Extracting archive
  - Installing sebastian/recursion-context (4.0.4): Extracting archive
  - Installing sebastian/object-reflector (2.0.4): Extracting archive
  - Installing sebastian/object-enumerator (4.0.4): Extracting archive
  - Installing sebastian/global-state (5.0.5): Extracting archive
  - Installing sebastian/exporter (4.0.4): Extracting archive
  - Installing sebastian/environment (5.1.4): Extracting archive
  - Installing sebastian/diff (4.0.4): Extracting archive
  - Installing sebastian/comparator (4.0.6): Extracting archive
  - Installing sebastian/code-unit (1.0.8): Extracting archive
  - Installing sebastian/cli-parser (1.0.1): Extracting archive
  - Installing phpunit/php-timer (5.0.3): Extracting archive
  - Installing phpunit/php-text-template (2.0.4): Extracting archive
  - Installing phpunit/php-invoker (3.1.1): Extracting archive
  - Installing phpunit/php-file-iterator (3.0.6): Extracting archive
  - Installing theseer/tokenizer (1.2.1): Extracting archive
  - Installing nikic/php-parser (v4.14.0): Extracting archive
  - Installing sebastian/lines-of-code (1.0.3): Extracting archive
  - Installing sebastian/complexity (2.0.2): Extracting archive
  - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive
  - Installing phpunit/php-code-coverage (9.2.15): Extracting archive
  - Installing doctrine/instantiator (1.4.1): Extracting archive
  - Installing phpspec/prophecy (v1.15.0): Extracting archive
  - Installing phar-io/version (3.2.1): Extracting archive
  - Installing phar-io/manifest (2.0.3): Extracting archive
  - Installing myclabs/deep-copy (1.11.0): Extracting archive
  - Installing phpunit/phpunit (9.5.21): Extracting archive
5 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
27 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
infection/extension-installer: No extensions found

ci4app フォルダに CodeIgniter 4.2.1 がインストールされました。

CodeIgniter4 のフォルダ構成

CodeIgniter4 のフォルダ構成は以下のようになっています。

ci4app/
├── app/ ... アプリケーション
│   ├── Common.php
│   ├── Config/      ... 設定
│   ├── Controllers/ ... コントローラ
│   ├── Database/    ... データベース
│   ├── Filters/     ... コントローラフィルタ
│   ├── Helpers/     ... ヘルパー
│   ├── Language/    ... 言語ファイル
│   ├── Libraries/   ... ライブラリ
│   ├── Models/      ... モデル
│   ├── ThirdParty/  ... サードパーティ
│   └── Views/       ... ビュー
├── builds*          ... buildsコマンド
├── composer.json
├── composer.lock
├── env              ... 環境変数設定ファイルのサンプル
├── phpunit.xml.dist ... PHPUnit設定ファイル
├── public/          ... Web公開領域(ドキュメントルート)
│   ├── favicon.ico
│   ├── index.php
│   └── robots.txt
├── spark* ... sparkコマンド
├── tests/ ... テストファイル
│   ├── _support/
│   ├── database/
│   ├── session/
│   └── unit/
├── vendor/   ... Composer管理
└── writable/ ... 書き込み用フォルダ
    ├── cache/
    ├── debugbar/
    ├── logs/
    ├── session/
    └── uploads/

システムメッセージの翻訳のインストール

システムメッセージの翻訳は公式の Composer パッケージがありますので、それをインストールします。

CodeIgniter プロジェクトのルートフォルダで、以下のコマンドを実行します。

$ composer require codeigniter4/translations:dev-develop

注意:このバージョンでは、develop ブランチでなくリリース版でも問題ありませんが、翻訳漏れがある場合がありますので、最新の develop ブランチをインストールしておくのが確実です。

環境変数の設定

CodeIgniter4 の設定ファイルは、プロジェクトのルートに配置する .env ファイルと、app/Config/ 以下の設定ファイルがあります。

.env ファイルとは?

.env はインストール直後には存在せず、サンプルとしての env ファイルが用意されています。env.env にコピーすれば OK です。

  • .env は環境変数を設定するためのものです。開発環境固有の設定値(データベース接続情報など)を設定します。
  • .env は Git などのバージョン管理に含めてはいけません。
  • .env で環境変数を設定しても、すでに定義されている環境変数の値は変更されません。
  • CodeIgniter4 の設定クラスがインスタンス化される時に、対応する環境変数があるとその値がプロパティに自動的に設定されます。

.env の設定

.env ファイルを作成します。

$ cp env .env

.env ファイルで環境変数を設定します。

まず、開発環境を development に変更します。

-# CI_ENVIRONMENT = production
+CI_ENVIRONMENT = development

baseURL を設定します。

-# app.baseURL = ''
+app.baseURL = 'http://localhost:8080/'

データベース接続設定をします。

-# database.default.hostname = localhost
-# database.default.database = ci4
-# database.default.username = root
-# database.default.password = root
-# database.default.DBDriver = MySQLi
-# database.default.DBPrefix =
+database.default.hostname = localhost
+database.default.database = ci4app
+database.default.username = dbuser
+database.default.password = dbpassword
+database.default.DBDriver = MySQLi
+database.default.DBPrefix =

-# database.tests.hostname = localhost
-# database.tests.database = ci4
-# database.tests.username = root
-# database.tests.password = root
-# database.tests.DBDriver = MySQLi
-# database.tests.DBPrefix =
+database.tests.hostname = localhost
+database.tests.database = ci4app_test
+database.tests.username = dbuser
+database.tests.password = dbpassword
+database.tests.DBDriver = MySQLi
+database.tests.DBPrefix =

開発環境なので、ログを出力するレベルを上げておきます。

-# logger.threshold = 4
+logger.threshold = 9

設定ファイルの設定

app/Config 以下の設定ファイルを設定します。

CodeIgniter が生成する URL から index.php を削除します。

--- a/app/Config/App.php
+++ b/app/Config/App.php
@@ -37,7 +37,7 @@ class App extends BaseConfig
      *
      * @var string
      */
-    public $indexPage = 'index.php';
+    public $indexPage = '';

     /**
      * --------------------------------------------------------------------------

ロケールを ja に変更します。

@@ -70,7 +70,7 @@ class App extends BaseConfig
      *
      * @var string
      */
-    public $defaultLocale = 'en';
+    public $defaultLocale = 'ja';

     /**
      * --------------------------------------------------------------------------

サポートするロケールに ja を追加します。

@@ -97,7 +97 ,7 @@ class App extends BaseConfig
      *
      * @var string[]
      */
-    public $supportedLocales = ['en'];
+    public $supportedLocales = ['en', 'ja'];

     /**
      * --------------------------------------------------------------------------

タイムゾーンを日本時間に変更します。

@@ -109,7 +109,7 @@ class App extends BaseConfig
      *
      * @var string
      */
-    public $appTimezone = 'America/Chicago';
+    public $appTimezone = 'Asia/Tokyo';

     /**
      * --------------------------------------------------------------------------

CURLRequest は同じインスタンスでリクエストを複数回送信すると、前回のリクエスト時の option が全て共有されるという仕様がデフォルトなので、これを無効にします。

--- a/app/Config/CURLRequest.php
+++ b/app/Config/CURLRequest.php
@@ -18,5 +18,5 @@ class CURLRequest extends BaseConfig
      *
      * @var bool
      */
-    public $shareOptions = true;
+    public $shareOptions = false;
 }

デフォルトの CSRF 保護は Cookie ベースなので、これをより安全な Session ベースに変更します。

--- a/app/Config/Security.php
+++ b/app/Config/Security.php
@@ -15,7 +15,7 @@ class Security extends BaseConfig
      *
      * @var string 'cookie' or 'session'
      */
-    public $csrfProtection = 'cookie';
+    public $csrfProtection = 'session';

     /**
      * --------------------------------------------------------------------------

CSRFトークンをより安全にするため、ランダム化を有効に変更します。

@@ -26,7 +26,7 @@ class Security extends BaseConfig
      *
      * @var bool
      */
-    public $tokenRandomize = false;
+    public $tokenRandomize = true;

     /**
      * --------------------------------------------------------------------------

デフォルトで csrf, invalidchars, secureheaders フィルタを有効にします。不要な URI があれば、除外設定してください。

--- a/app/Config/Filters.php
+++ b/app/Config/Filters.php
@@ -34,13 +34,13 @@ class Filters extends BaseConfig
     public $globals = [
         'before' => [
             // 'honeypot',
-            // 'csrf',
-            // 'invalidchars',
+            'csrf',
+            'invalidchars',
         ],
         'after' => [
             'toolbar',
             // 'honeypot',
-            // 'secureheaders',
+            'secureheaders',
         ],
     ];

バリデーションクラスで「厳密なルール」を使うように変更します。なお、従来のルールは基本的にPOST配列の検証を前提としており、暗黙の型変換が行われるため、JSONデータなど bool や null、配列などの値を正しく検証できない場合があります。

--- a/app/Config/Validation.php
+++ b/app/Config/Validation.php
@@ -3,10 +3,10 @@
 namespace Config;

 use CodeIgniter\Config\BaseConfig;
-use CodeIgniter\Validation\CreditCardRules;
-use CodeIgniter\Validation\FileRules;
-use CodeIgniter\Validation\FormatRules;
-use CodeIgniter\Validation\Rules;
+use CodeIgniter\Validation\StrictRules\CreditCardRules;
+use CodeIgniter\Validation\StrictRules\FileRules;
+use CodeIgniter\Validation\StrictRules\FormatRules;
+use CodeIgniter\Validation\StrictRules\Rules;

 class Validation extends BaseConfig
 {

PHP 開発サーバの起動

Welcome ページにアクセスするために、PHP 開発サーバを起動します。

CodeIgniter プロジェクトのルートフォルダで、spark serve コマンドを実行してください。

$ php spark serve
CodeIgniter v4.2.1 Command Line Tool - Server Time: 2022-06-30 17:32:27 UTC+09:00

CodeIgniter development server started on http://localhost:8080
Press Control-C to stop.

ブラウザでのアクセス

ブラウザで http://localhost:8080/ にアクセスします。

Welcome ページが表示されます。

スクロールしていくと、環境が development になっていることがわかります。

PHPUnit テストの実行

PHPUnit でのテストを実行します。

CodeIgniter プロジェクトのルートフォルダで、以下のコマンドを実行します。

$ composer test
> phpunit
PHPUnit 9.5.21 #StandWithUkraine

.....                                                               5 / 5 (100%)

Time: 00:00.621, Memory: 22.00 MB

OK (5 tests, 7 assertions)

Generating code coverage report in Clover XML format ... done [00:00.199]

Generating code coverage report in HTML format ... done [00:00.136]

Generating code coverage report in PHP format ... done [00:00.001]


Code Coverage Report:   
  2022-06-30 17:38:50   

 Summary:               
  Classes: 20.00% (1/5) 
  Methods: 16.67% (1/6) 
  Lines:   18.42% (7/38)

Config\Database
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  3/  3)

通りました。

データベース接続のテスト

データベースに接続できるか確認しておきましょう。

データベースセッション用のマイグレーションファイルの生成

spark コマンドに用意されているデータベースセッション用テーブルを作成するマイグレーションファイルを生成してみます。

CodeIgniter プロジェクトのルートフォルダで、以下のコマンドを実行します。

$ php spark make:migration --session
CodeIgniter v4.2.1 Command Line Tool - Server Time: 2022-06-30 17:39:46 UTC+09:00

作成されたファイル: APPPATH/Database/Migrations/2022-06-30-083947_CreateCiSessionsTable.php

生成されました。

マイグレーションの実行

作成されたマイグレーションファイルを実行します。

$ php spark migrate
CodeIgniter v4.2.1 Command Line Tool - Server Time: 2022-06-30 17:40:02 UTC+09:00

すべての新しいマイグレーションを実行しています...
    実行中: (App) 2022-06-30-083947_App\Database\Migrations\CreateCiSessionsTable
マイグレーションが完了しました。

完了しました。

テーブルの確認

spark db:table コマンドでテーブルを確認します。

$ php spark db:table ci_sessions --metadata
CodeIgniter v4.2.1 Command Line Tool - Server Time: 2022-06-30 17:40:41 UTC+09:00


List of Metadata Information in Table "ci_sessions":

+------------+-----------+------------+----------+-------------------+-------------+
| Field Name | Type      | Max Length | Nullable | Default           | Primary Key |
+------------+-----------+------------+----------+-------------------+-------------+
| id         | varchar   | 128        | No       |                   | Yes         |
| ip_address | varchar   | 45         | No       |                   | No          |
| timestamp  | timestamp |            | No       | CURRENT_TIMESTAMP | No          |
| data       | blob      |            | No       |                   | No          |
+------------+-----------+------------+----------+-------------------+-------------+

きちんとテーブルが作成されています。

データベースセッションを使わない場合は、作成されたマイグレーションファイル、ci_sessionsmigrations テーブルを削除してください。

データベースセッションを使う場合は、app/Config/App.php のセッションの設定をしてください。

関連

参考

Date: 2022/06/30

Tags: codeigniter, codeigniter4