CodeIgniter4をインストール (Composer利用)


新しいCodeIgniter使ってみませんか?

CodeIgniter4(以下、CI4。前バージョンはCI3と記します。)、ついに正式リリースされましたね。
Namespaceが採用されたことでClassを作りやすくなったり、CI3よりかなり現代風な実装になった感じです。
自分の会社でもCI3は開発案件で利用していて大変役立っていましたが、CI4ではどうなのでしょうか?
早速触っていきたいと思います。

CI4の動作環境

とりあえずPHP 7.2以上環境に

  • php-intl
  • php-json
  • php-mbstring
  • php-mysqlnd
  • libcurl

あたりを導入しておくと良いと思います。
DBはMySQL(5.1以上。もちろんMariaDBでもOK)、PostgreSQL、SQLite3が対応しています。
これらはRedHat/CentOS系の方はyumやdnfで、Debian系の方はaptで簡単に導入できます。
Mac/Windowsの方はMamp、Xampp、MacPorts、Homebrewなんでもお好きな方法で導入可能です。

なお、今回はLinux上でwebサーバはapache+mysqlで動かす前提で説明します。

Composer入ってますか?

今回はcomposerコマンドをインストールしたいので、お手元の環境に適宜導入しておいてください。
composer使ったことないよ!という人は、次の記事を参考にするとわかりやすいと思います。

プロジェクトの作成

ここで言うプロジェクトというのは、ざっくりいうとCI4が動くのに必要なファイルが全部入ったディレクトリ程度の理解でいいと思います。
今回はci4testという名前のプロジェクト(ディレクトリ)を作ってみます。

CI4自体はドキュメントルートの内側においてももちろん問題ないのですが、大量のファイルがドキュメントルート配下に配置されるのはちょっと気持ち悪いですよね?

よりセキュアに運用できるように今回はこれから作成されるci4testディレクトリの中にあるhtdocsというディレクトリがドキュメントルートになる前提で進めてみようと思います。
(apache側の設定は割愛します)

今回想定のディレクトリ構成
/home
├── hoo
├── bar
├── ci4test
│   └── htdocs <-- ここがドキュメントルートとなるようにapacheの設定を行う
└── baz

ci4testディレクトリを作りたいディレクトリの直上で、

composerコマンドの実行
$ cd /home
$ composer create-project codeigniter4/appstarter ci4test

と実行します。

実行の様子
$ composer create-project codeigniter4/appstarter ci4test
Installing codeigniter4/appstarter (v4.0.2)
  - Installing codeigniter4/appstarter (v4.0.2): Loading from cache
Created project in ci4test
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 35 installs, 0 updates, 0 removals
  - Installing laminas/laminas-zendframework-bridge (1.0.3): Loading from cache
  - Installing laminas/laminas-escaper (2.6.1): Loading from cache
  - Installing psr/log (1.1.3): Loading from cache
  - Installing kint-php/kint (3.3): Loading from cache
  - Installing codeigniter4/framework (v4.0.2): Loading from cache

     ・
     ・
  --SNIP--
     ・
     ・

phpunit/phpunit suggests installing ext-soap (*)
phpunit/phpunit suggests installing ext-xdebug (*)
Writing lock file
Generating autoload files
Generated autoload files containing 579 classes

こんな感じのメッセージがつらつら出てくればインストール成功です。
エラーが出た場合は作成先のディレクトリ内に何らかのファイルがすでに存在してたり、パーミッションが無かったりなどが考えられるので、よくチェックして再度上記コマンドを実行します。

予め空のci4testディレクトリが存在する場合はディレクトリ内に入って次のようにしてもOKです。

composerコマンドの実行
$ cd /home/ci4test
$ composer create-project codeigniter4/appstarter ./

インストールが成功の場合、プロジェクトディレクトリの中は次のような感じになっているはずです。

ディレクトリの移動と構成の確認
$ cd /home/ci4test
$ tree -L 1
.
├── LICENSE
├── README.md
├── app
├── builds
├── composer.json
├── composer.lock
├── contributing.md
├── env          <--今回キモになるファイル
├── license.txt
├── phpunit.xml.dist
├── public             <--今回キモになるディレクトリ
├── spark
├── tests
├── vendor
└── writable       <--今回キモになるディレクトリ

writableディレクトリに権限を設定する

PHPがsuEXECされたCGIまたはmod_ruid2などで特に実行ユーザが指定された状態で動いていない場合は、apacheはその予め設定されたユーザでの動作になるのでPHPで生成されるファイルはapachenobodyなどになっている場合がほとんどです。
CI4はwritableディレクトリ内にキャッシュなどを書き込むような仕組みになっているので、ここはPHPが書き込めるようにしてやる必要があります。

ディレクトリのオーナー変更
$ chown apache:apache -R writable

オーナーを変更できない場合は次でもOKです。

ディレクトリの権限変更
$ chmod 777 -R writable

suEXEC/mod_ruid2が有効でそのままPHPがwritableに書き込み可能な場合はこのステップは不要です。

ドキュメントルートを設定する

CI4を実際に動かすためのファイルはAppstarterで導入した場合publicの中にあります。
つまりここがAppstarterが想定しているドキュメントルートのディレクトリです。
ですのでこれをhtdocsに書き換えるなりsymlinkを張るなりすればCI4が動き出します。

シンボリックリンクの場合
$ ln -s public htdocs
直にドキュメントルートディレクトリに名称変更の場合
$ mv public htdocs

動作している場合は、ブラウザでアクセスすると次のような画面になるはずです。

これ以外の画面の場合はどこか設定が間違っていると思われます。

環境設定(DB設定と開発モード切り替えなど)

フレームワークを使って何かを作るときには殆どの場合DBと連携することが必須となってくるので、DBの設定もしてしまいましょう。
CI4ではenvファイルによる環境設定がサポートされているのでこれを利用します。
ここに記述したものはCI4の中では$_ENVに割り当てられ、プログラムの中で自由に参照できるのでとても便利です。

envファイルのテンプレートはプロジェクトディレクトリ直下にあるので、これを.envにコピーして使用します。

envファイルのコピー
$ cp env .env

.envファイルを覗くと全体がコメントアウトされた状態で記述されているので、必要な箇所をアンコメントして設定を記述します。

まずは開発環境設定

とりあえず、エラーがキャッチできないとプログラムが大変なので、開発モードに変更します。

.env
# CI_ENVIRONMENT = production

これを

.env
 CI_ENVIRONMENT = development

に変更します。ここの値が変更前に記述してあるproductionのときは所謂本番モードで、エラー表示が行われなくなります。
余計なエラー表示はセキュリティ上よろしくないので、開発時にここをdevelopmentに変更した時には、公開時にはproductionにちゃんと切り替えることを心がけましょう。

次にbaseURLもここに記述します。

.env
# app.baseURL = ''

これを

.env
app.baseURL = 'http://example.com/'

と、書き換えておきます。
(このURLはもちろんサンプルで、実際はCI4のドキュメントルートを指すホスト名やIPアドレスです)

この2箇所を書き換えると開発モードになり、ブラウザ上にエラー表示や開発ツールのボタン(画面右下にCIのアイコンが表示されます)の表示が行われます。

これらは、CI3を使ったことがある人ならピンと来るかもしれませんが、
CI_ENVIRONMENT.htaccessなどで設定していたCI_ENVに相当し、
app.baseURLapplication/config/config.php$config['base_url']の設定に相当するものです。
もちろん、CI3の頃のようにapp/Config/App.phpに記述することもできます。
(CI4ではCI3と違ってクラスのメンバ変数として定義されますが。)

続いてDB設定

DBに関連する情報は次のブロックに記述されていますので、適宜記述します。

.env
#--------------------------------------------------------------------
# DATABASE
#--------------------------------------------------------------------

# database.default.hostname = localhost
# database.default.database = ci4
# database.default.username = root
# database.default.password = root
# database.default.DBDriver = MySQLi
    .
    .
    .
    .

ここではkohenji01というmysqlユーザがhogehogeというパスワードでci4testという自ホスト(localhost)のDBに接続できる前提で記します

.env
#--------------------------------------------------------------------
# DATABASE
#--------------------------------------------------------------------

 database.default.hostname = localhost
 database.default.database = ci4test
 database.default.username = kohenji01
 database.default.password = hogehoge
 database.default.DBDriver = MySQLi
    .
    .
    .
    .

このように設定して保存をしてください。
とりあえずこれを記述しておくだけで、あとはCI4がいい感じに接続してくれます。

冒頭でも触れたとおり、CI4では2020年4月現在、DBはMySQL・PostgreSQL・SQLite3のみをサポートしてますが、将来的にはPDOドライバがサポートされる予定だそうです。
ドライバがリリースされればPDOが接続できるDBはすべて網羅されると思われますので、OracleやMSSQL、ODBC経由の接続なども利用可能になります。これらを利用したい人はCI4のPDOドライバがリリースされるのを待つか、CI4のDatabaseモデルを利用せす自身でDBアクセスのプログラムを実装することになります。

長くなりましたので、DBの接続テストなどは次回。