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

️(2021-12-02 追記) この記事は古くなっています。 「CodeIgniter 4.1のインストール方法【2021年最新版】 」を参照してください。

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

(2021-02-23 追記) その後、CodeIgniter 4 Application Template を作成しました。

CodeIgniter 4.0 のサーバ要件

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

動作確認環境

  • CodeIgniter 4.0.4
  • Composer 2.0.8
  • PHPUnit 8.5.13
  • PHP 7.4.13
    • Xdebug 3.0.1
  • MySQL 5.7.32
  • macOS 10.15.7

Composer のインストール

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

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

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

Homebrew

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

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

$ brew install compoesr

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

公式のインストール方法

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

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

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { 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.0.8) 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.0.8 2020-12-03 17:20:38

Usage:
  command [options] [arguments]

...

CodeIgniter 4.0 のインストール

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

$ composer create-project codeigniter4/appstarter ci4app
Creating a "codeigniter4/appstarter" project at "./ci4app"
Installing codeigniter4/appstarter (v4.0.4)
  - Installing codeigniter4/appstarter (v4.0.4): Extracting archive
Created project in /Users/kenji/work/codeigniter/ci4app
Loading composer repositories with package information
Updating dependencies
Lock file operations: 36 installs, 0 updates, 0 removals
  - Locking codeigniter4/framework (v4.0.4)
  - Locking doctrine/instantiator (1.4.0)
  - Locking fzaninotto/faker (dev-master 5ffe7db)
  - Locking kint-php/kint (3.3)
  - Locking laminas/laminas-escaper (2.7.0)
  - Locking laminas/laminas-zendframework-bridge (1.1.1)
  - Locking mikey179/vfsstream (v1.6.8)
  - Locking myclabs/deep-copy (1.10.2)
  - Locking phar-io/manifest (2.0.1)
  - Locking phar-io/version (3.0.4)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.2.2)
  - Locking phpdocumentor/type-resolver (1.4.0)
  - Locking phpspec/prophecy (1.12.2)
  - Locking phpunit/php-code-coverage (7.0.14)
  - Locking phpunit/php-file-iterator (2.0.3)
  - Locking phpunit/php-text-template (1.2.1)
  - Locking phpunit/php-timer (2.1.3)
  - Locking phpunit/php-token-stream (4.0.4)
  - Locking phpunit/phpunit (8.5.13)
  - Locking psr/log (1.1.3)
  - Locking sebastian/code-unit-reverse-lookup (1.0.2)
  - Locking sebastian/comparator (3.0.3)
  - Locking sebastian/diff (3.0.3)
  - Locking sebastian/environment (4.2.4)
  - Locking sebastian/exporter (3.1.3)
  - Locking sebastian/global-state (3.0.1)
  - Locking sebastian/object-enumerator (3.0.4)
  - Locking sebastian/object-reflector (1.1.2)
  - Locking sebastian/recursion-context (3.0.1)
  - Locking sebastian/resource-operations (2.0.2)
  - Locking sebastian/type (1.1.4)
  - Locking sebastian/version (2.0.1)
  - Locking symfony/polyfill-ctype (v1.20.0)
  - Locking theseer/tokenizer (1.2.0)
  - Locking webmozart/assert (1.9.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 36 installs, 0 updates, 0 removals
  - Syncing fzaninotto/faker (dev-master 5ffe7db) into cache
  - Installing psr/log (1.1.3): Extracting archive
  - Installing laminas/laminas-zendframework-bridge (1.1.1): Extracting archive
  - Installing laminas/laminas-escaper (2.7.0): Extracting archive
  - Installing kint-php/kint (3.3): Extracting archive
  - Installing codeigniter4/framework (v4.0.4): Extracting archive
  - Installing fzaninotto/faker (dev-master 5ffe7db): Cloning 5ffe7db6c8 from cache
  - Installing mikey179/vfsstream (v1.6.8): Extracting archive
  - Installing symfony/polyfill-ctype (v1.20.0): Extracting archive
  - Installing webmozart/assert (1.9.1): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing phpdocumentor/type-resolver (1.4.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.2.2): Extracting archive
  - Installing phpunit/php-token-stream (4.0.4): Extracting archive
  - Installing sebastian/version (2.0.1): Extracting archive
  - Installing sebastian/type (1.1.4): Extracting archive
  - Installing sebastian/resource-operations (2.0.2): Extracting archive
  - Installing sebastian/recursion-context (3.0.1): Extracting archive
  - Installing sebastian/object-reflector (1.1.2): Extracting archive
  - Installing sebastian/object-enumerator (3.0.4): Extracting archive
  - Installing sebastian/global-state (3.0.1): Extracting archive
  - Installing sebastian/exporter (3.1.3): Extracting archive
  - Installing sebastian/environment (4.2.4): Extracting archive
  - Installing sebastian/diff (3.0.3): Extracting archive
  - Installing sebastian/comparator (3.0.3): Extracting archive
  - Installing phpunit/php-timer (2.1.3): Extracting archive
  - Installing phpunit/php-text-template (1.2.1): Extracting archive
  - Installing phpunit/php-file-iterator (2.0.3): Extracting archive
  - Installing theseer/tokenizer (1.2.0): Extracting archive
  - Installing sebastian/code-unit-reverse-lookup (1.0.2): Extracting archive
  - Installing phpunit/php-code-coverage (7.0.14): Extracting archive
  - Installing doctrine/instantiator (1.4.0): Extracting archive
  - Installing phpspec/prophecy (1.12.2): Extracting archive
  - Installing phar-io/version (3.0.4): Extracting archive
  - Installing phar-io/manifest (2.0.1): Extracting archive
  - Installing myclabs/deep-copy (1.10.2): Extracting archive
  - Installing phpunit/phpunit (8.5.13): Extracting archive
6 package suggestions were added by new dependencies, use `composer suggest` to see details.
Package fzaninotto/faker is abandoned, you should avoid using it. No replacement was suggested.
Package phpunit/php-token-stream is abandoned, you should avoid using it. No replacement was suggested.
Generating autoload files
22 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Generating autoload files
Generated autoload files

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

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
├── 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

注意:現在の codeigniter4/translations のリリースバージョン 4.0.2 にはまだ日本語が含まれていませんので develop ブランチをインストールしました。

環境変数の設定

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

.env ファイルとは?

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

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

.env の設定

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

$ cp env .env

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

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

--- env 2020-07-16 12:44:28.000000000 +0900
+++ .env    2020-12-29 09:14:27.000000000 +0900
@@ -14,13 +14,13 @@
 # ENVIRONMENT
 #--------------------------------------------------------------------

-# CI_ENVIRONMENT = production
+CI_ENVIRONMENT = development

baseURL を設定します。

 #--------------------------------------------------------------------
 # APP
 #--------------------------------------------------------------------

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

 # app.sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler'

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

@@ -49,17 +49,17 @@
 # DATABASE
 #--------------------------------------------------------------------

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

 #--------------------------------------------------------------------
 # CONTENT SECURITY POLICY

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

@@ -99,3 +99,9 @@
 # honeypot.name = 'honeypot'
 # honeypot.template = '<label>{label}</label><input type="text" name="{name}" value=""/>'
 # honeypot.container = '<div style="display:none">{template}</div>'
+
+#--------------------------------------------------------------------
+# LOGGER
+#--------------------------------------------------------------------
+
+logger.threshold = 9

設定ファイルの設定

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

言語を ja に変更します。

--- a/app/Config/App.php
+++ b/app/Config/App.php
@@ -63,7 +63,7 @@ class App extends BaseConfig
    | should run under for this request.
    |
    */
-   public $defaultLocale = 'en';
+   public $defaultLocale = 'ja';

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

    /*
    |--------------------------------------------------------------------------
@@ -99,7 +99,7 @@ class App extends BaseConfig
    | dates with the date helper, and can be retrieved through app_timezone()
    |
    */
-   public $appTimezone = 'America/Chicago';
+   public $appTimezone = 'Asia/Tokyo';

    /*
    |--------------------------------------------------------------------------

デフォルトで CSRF フィルタを有効にします。

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

不要な URI があれば、除外設定しましょう。

PHP 開発サーバの起動

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

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

$ php spark serve
CodeIgniter CLI Tool - Version 4.0.4 - Server-Time: 2020-12-29 09:56:35am

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

ブラウザでのアクセス

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

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

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

右下の CodeIgniter の炎のロゴをクリックすると、デバッグツールバーが表示されます。

PHPUnit テストの実行

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

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

$ XDEBUG_MODE=coverage composer test
> phpunit
PHPUnit 8.5.13 by Sebastian Bergmann and contributors.

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

Time: 295 ms, Memory: 12.00 MB

OK (5 tests, 6 assertions)

Generating code coverage report in Clover XML format ... done [62 ms]

Generating code coverage report in HTML format ... done [116 ms]

Generating code coverage report in PHP format ... done [1 ms]


Code Coverage Report:   
  2020-12-29 09:37:59   

 Summary:               
  Classes:  0.00% (0/5) 
  Methods:  0.00% (0/6) 
  Lines:    8.57% (6/70)

\Config::Config\Database
  Methods:   0.00% ( 0/ 1)   Lines:  55.56% (  5/  9)

通りました。

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

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

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

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

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

$ php spark session:migration
CodeIgniter CLI Tool - Version 4.0.4 - Server-Time: 2020-12-29 09:41:32am

Created file: APPPATH/Database/Migrations/20201229094132_create_ci_sessions_table.php

生成されました。

マイグレーションの実行

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

$ php spark migrate
CodeIgniter CLI Tool - Version 4.0.4 - Server-Time: 2020-12-29 09:43:26am

すべての新しいマイグレーションを実行しています...
    実行中: (App) 20201229094132_App\Database\Migrations\Migration_create_ci_sessions_table
Done

完了しました。

テーブルの確認

mysql コマンドでデータベースに接続し、テーブルが作成されたことを確認します。

mysql> use ci4app;
mysql> desc ci_sessions;
+------------+------------------+------+-----+---------+-------+
| Field      | Type             | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| id         | varchar(128)     | NO   | PRI | NULL    |       |
| ip_address | varchar(45)      | NO   |     | NULL    |       |
| timestamp  | int(10) unsigned | NO   | MUL | 0       |       |
| data       | text             | NO   |     | NULL    |       |
+------------+------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

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

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

関連

参考

Tags: codeigniter, codeigniter4

フレームワークへの依存をいかに減らすか

(2021-01-13 追記) 「フレームワークへの依存度を下げるFLUDパターン」 を書きました。

この記事は CodeIgniter Advent Calendar 2020 - Qiita の25日目です。

CodeIgniter Advent Calendar 2020 の記事ですが、今日は「フレームワークへの依存をいかに減らすか」というテーマです。

フレームワークの入門書、入門記事、公式ドキュメントには多分出てこない話題です。

フレームワークの罠

CodeIgniter4 についてチュートリアルから始めて、いろいろと書いてきました。

普通にユーザガイドを読んでアプリを開発していこうとすると、アプリは以下のように階層化されます。 黒い矢印は依存です。

MVC パターン MVC パターン

(2020-12-30 追記) 階層の順序を修正しました。

依存とはそれを使うということです。

コントローラがモデル、ビュー、そしてフレームワークに依存します。モデルもビューもフレームワークに依存します。

要するにフレームワークのユーザーが書くコードはほぼ全てフレームワークに依存します。フレームワークと密結合します。フレームワークがないとほとんど全く動きません。

普通にフレームワークを使おうとすると、自分の書いたコードが強くフレームワークに依存するようになっています。

フレームワークへの依存の問題点

フレームワークへの依存の何が問題でしょうか?

それは、フレームワークを変更しづらいということです。これは、別のフレームワークに移行するというような大きな話だけでなく、フレームワークをバージョンアップするのも大変になるということも含まれます。

フレームワークはそれほど安定していません。バージョンはどんどん上がりますし、互換性のない変更がされるかも知れません。

あるいは、開発が止まってしまうかも知れません。今は人気があるフレームワークも 5年、10年後は誰にもわかりません。

開発が止まっても自分でメンテしていけば使えないことはないですが、メンテできるほどの技術力があるのかリソースがあるのかという問題もあります。

アプリの寿命が長ければ長いほど、フレームワークへの依存は問題になります。

そこでフレームワークへの依存をいかに減らすかということが考えられてきました。

例えば、「クリーンアーキテクチャ」には、以下の特性が書いてありますね。

  • フレームワーク非依存
  • テスト可能
  • UI 非依存
  • データベース非依存
  • 外部エージェント非依存

ADOP パターン

フレームワークへの依存を減らす方法の 1つに ADOP(Application Domain Others Pattern) があります。

ADOP は以下の 3階層のパターンです。

黒い矢印は依存です。白い矢印は汎化、つまり抽象化です。

ADOP パターン ADOP パターン

階層の説明

ドメイン層(Domain Layer)
  • ドメイン駆動設計(DDD)でのドメインオブジェクトを配置する階層です。
  • ドメインオブジェクトとは、ビジネスルールをカプセル化したオブジェクトです。
  • ファクトリやリポジトリのインターフェースなども、通常はこの階層に配置します。
アプリケーション層(Application Layer)
  • ドメインオブジェクトを使いユースケースを実現するためのオブジェクトを配置する階層です。
アザーズ層(Others Layer)
  • Domain にも Application にも含まれない残り全てを配置する階層です。
  • アザーズ層はすべてを一箇所で管理するのではなく、技術スタックによって分割管理します。

MVC フレームワークはどこへ?

ADOP では以下のように説明されています。

MVC フレームワークといったユーザーインターフェースを完全に内包します。

つまり、図にするとこういうことです。

ADOP パターン ADOP と MVC フレームワーク

今まで MVC という世界で生きてきた我々からすると衝撃的ですね。世界には MVC 以外にももっと大切なことがあったのです!

ADOP では、既存の MVC コードから Domain と Application 層のコードを分離していることがわかります。

これらのコードをフレームワークや特定の技術スタックから分離し、フレームワークや特定の技術スタックの変更の影響をあまり受けないようにします。

ADOP のルール

ADOP のルールは以下の 2つだけです。

  1. オブジェクトが 3つの階層のどこに分類されるかを考え、それぞれのディレクトリに配置すること
  2. 下の階層のオブジェクトが上の階層のオブジェクトを取り扱うときには抽象型(インターフェース)に依存すること

CodeIgniter4 でのディレクトリ構成

CodeIgniter4 でのディレクトリ構成例は、以下のようになります。

https://github.com/nrslib/scrum-app-sample-php そのままなのでなんですが。

project/
├── app/
├── builds*
├── composer.json
├── composer.lock
├── packages/ ... packages ディレクトリを追加
│   ├── auth/ ... 認証パッケージ
│   │   ├── Application/         ... アプリケーション層
│   │   ├── DebugInfrastructure/ ... アザーズ層(デバッグ用インフラ)
│   │   └── Domain/              ... ドメイン層
│   ├── basic/ ... 共通ライブラリ
│   │   ├── DebugSupport/
│   │   ├── DomainSupport/
│   │   ├── Exception/
│   │   └── Transaction/
│   └── scrum/ ... スクラムパッケージ
│       ├── Application/            ... アプリケーション層
│       ├── DebugInfrastructure/    ... アザーズ層(デバッグ用インフラ)
│       ├── Domain/                 ... ドメイン層
│       └── EloquentInfrastructure/ ... アザーズ層(Eloquent用インフラ)
├── phpunit.xml
├── public/
├── spark*
├── tests/
├── vendor/
└── writable/

何が Domain と Application なのか?

どの階層に属するかの分類方法も ADOP で解説されています。

Domain 層

  • ドメインの事物を直接的に表現するコード、もしくは表現を支援するコードか?

ドメインは冒頭でも解説しようとしたとおり、ソフトウェアを適用する対象領域のことです。 たとえば物流システムであれば、ドメインの事物には運送手段(トラックなど)や拠点、配送など様々なモノやコトがあります。 それらを表現するコードであれば、質問への回答は Yes になり、ドメインレイヤーに所属させます。 また、それらのオブジェクトを構築するためのファクトリ、永続化の指針を示すリポジトリのインターフェースも、表現を支援するコードであるため、この質問に関しては Yes になります。

Application 層

  • ドメインの事物を表現するコードを取り扱い、ユースケースを達成するコードか?

ドメインの事物を表現するコードとはドメインレイヤーのオブジェクトのことを指し、つまり、運送手段(トラックなど)や拠点、配送など様々なモノやコトを表現したコードやファクトリ、リポジトリといった表現の支援を行うオブジェクトのことです。 それらを取り扱い、ソフトウェアのユースケースを達成するコードであれば、この質問に対する回答は Yes になります。

Others 層

Domain でも Application でもないものは、自動的に Others 層です。

まとめ

  • フレームワークは変化が激しく、強く依存すると長期のサービス提供に悪影響があります。
  • フレームワークへの依存を減らす方法の 1つとして ADOP があります。
  • ADOP はルールも少なく比較的わかりやすいため、適用が比較的容易です。
  • CodeIgniter4(や CodeIgniter3)でも ADOP を適用して、フレームワークへの依存度を下げることが可能です。

最後に

これで CodeIgniter Advent Calendar 2020 は終わりです。

CodeIgniter Advent Calendar は今まで 6回開催されましたが、25日全部埋まったのは今回 2020 が初めてです!

今年は CodeIgniter4 がついにリリースされました!

lonnieezell, jim-parry, samsonasik, MGatner そして全ての貢献者のみなさん、ありがとう!

この記事は CodeIgniter Advent Calendar 2020 - Qiita の25日目です。

参考

Tags: codeigniter, codeigniter4, ddd, mvc, php

PhpStormとXdebug3でCodeIgniter4をステップ実行する

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

この Advent Calendar もついに24日。ここ日本でも多くの人がクリスマスミサで以下のような聖書の言葉を聞くことでしょう。

Luke 2:8 - 2:12

And there were shepherds living out in the fields nearby, keeping watch over their flocks at night. An angel of the Lord appeared to them, and the glory of the Lord shone around them, and they were terrified.

But the angel said to them, “Do not be afraid. I bring you good news that will cause great joy for all the people. Today in the town of David a Savior has been born to you; he is the Messiah, the Lord. This will be a sign to you: You will find a baby wrapped in cloths and lying in a manger.”

なぜ、天使はこのような大きなニュースを羊飼いに伝えたのでしょうか?なぜ、救い主は飼い葉桶の中なのでしょうか?謎が謎を呼びます。

それはさておき、今日は Xdebug3 でステップ実行してみたいと思います。

動作確認環境

  • PhpStorm 2020.3
  • Xdebug 3.0.1
  • PHP 7.4.13
  • macOS 10.15.7

Xdebug のインストール&設定

pecl から xdebug をインストールします。

$ pecl install xdebug

php.ini の場所を確認します。

$ php --ini
Configuration File (php.ini) Path: /usr/local/etc/php/7.4
Loaded Configuration File:         /usr/local/etc/php/7.4/php.ini
Scan for additional .ini files in: /usr/local/etc/php/7.4/conf.d
Additional .ini files parsed:      /usr/local/etc/php/7.4/conf.d/ext-opcache.ini

php.ini に Xdebug の設定を追加します。

$ vi /usr/local/etc/php/7.4/php.ini

zend_extension を以下のようにフルパス変更します。

zend_extension="/usr/local/Cellar/php@7.4/7.4.13_1/pecl/20190902/xdebug.so"

以下を追加します。

[xdebug]
xdebug.mode = develop,debug
;xdebug.client_host = localhost
;xdebug.client_port = 9003
xdebug.idekey = PHPSTORM
;xdebug.start_with_request = yes

Xdebug が有効になっていることを確認します。

$ php -v
PHP 7.4.13 (cli) (built: Nov 30 2020 14:46:04) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans
    with Zend OPcache v7.4.13, Copyright (c), by Zend Technologies

PhpStorm の設定

Preferences の Languages & Frameworks > PHP > Debug を以下のように変更します。

Run メニューから Edit Configurations を開き、Templates の PHP Remote Debug から以下の設定を作成します。

IDE key を PHPSTORM に設定します。

Chrome の設定

https://chrome.google.com/extensions/detail/eadndfjplgieldjbigjakmdgkmoaaaoc から Xdebug Helper をインストールします。

Firefox、Safari の場合は、Browser debugging extensions—PhpStorm を参照してください。

Xdebug Helper を設定します。

http://localhost:8080/ 以下のみを許可します。

IDE key を PhpStorm に設定します。

ビルトインサーバの起動

php spark serve を実行してビルトインサーバを起動します。

PhpStorm でのデバッグ開始

以下のアイコンを押します。

アイコンが以下のように変わります。

Chrome でのデバッグ開始

Xdebug Heler を Debug に設定します。

PhpStorm でのステップ実行

Chrome からアクセスすれば、以下のように最初の行で実行が止まります。

ステップ実行の操作

このアイコン(Resume)を押すと、プログラムの実行が再開します。

このアイコン(Stop)を押すと、停止します。

このアイコン(Step Over)を押すと、次の文に進みます。メソッドが呼び出されても、メソッドの中には入って行きません。

このアイコン(Step Into)を押すと、次の文に進みます。メソッドが呼び出される場合、メソッドの中には入って行きます。

このアイコン(Force Step Into) ですが、Step Into との違いはよくわかりません。

このアイコン(Step Out)を押すと、現在のメソッドの1つ外まで進みます。

このアイコン(Run to Cursor)を押すと、カーソルの位置まで実行されます。

ブレークポイントの設定

index.php の最初の文にブレークポイントを設定し、ブレークポイントまで進めます。

ブレークポイントについては、以下を参照してください。

ブレークポイントで止まりました。

スタックトレースや変数がわかります。

Home コントローラにブレークポイントを設定し、そこまで進めます。

以下の流れで Home::index() にたどり着いていることがわかります。

Home.php:9, App\Controllers\Home->index()
CodeIgniter.php:931, CodeIgniter\CodeIgniter->runController()
CodeIgniter.php:427, CodeIgniter\CodeIgniter->handleRequest()
CodeIgniter.php:333, CodeIgniter\CodeIgniter->run()
index.php:44, require_once()
rewrite.php:45, {main}()

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

参考

Tags: codeigniter, codeigniter4, phpstorm, xdebug, debug