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使ったことないよ！という人は、次の記事を参考にするとわかりやすいと思います。

- [Composerのインストール](https://qiita.com/SHIN_DEVELOP/items/1662c354d4af2a806908)
- [Composerをインストールしてみた](https://qiita.com/kakijin/items/02364adacf36410f449e)
- [CentOSにcomposerをインストールする方法](https://qiita.com/yukachin0414/items/bb2f54f59564919be6c7)

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

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

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

```text:今回想定のディレクトリ構成
/home
├── hoo
├── bar
├── ci4test
│   └── htdocs <-- ここがドキュメントルートとなるようにapacheの設定を行う
└── baz
```
`ci4test`ディレクトリを作りたいディレクトリの直上で、

```text:composerコマンドの実行
$ cd /home
$ composer create-project codeigniter4/appstarter ci4test
```
と実行します。


```text:実行の様子
$ 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です。

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


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

```text:ディレクトリの移動と構成の確認
$ 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で生成されるファイルは`apache`や`nobody`などになっている場合がほとんどです。
CI4は`writable`ディレクトリ内にキャッシュなどを書き込むような仕組みになっているので、ここはPHPが書き込めるようにしてやる必要があります。

```text:ディレクトリのオーナー変更
$ chown apache:apache -R writable
```
オーナーを変更できない場合は次でもOKです。

```text:ディレクトリの権限変更
$ chmod 777 -R writable
```
suEXEC/mod_ruid2が有効でそのままPHPが`writable`に書き込み可能な場合はこのステップは不要です。

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

```text:シンボリックリンクの場合
$ ln -s public htdocs
```

```text:直にドキュメントルートディレクトリに名称変更の場合
$ mv public htdocs
```
動作している場合は、ブラウザでアクセスすると次のような画面になるはずです。

![起動画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625099/943a9098-c935-bce2-dac2-2ffa395aa814.png)

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

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

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

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

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

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

```bash:.env
# CI_ENVIRONMENT = production
```

これを

```bash:.env
 CI_ENVIRONMENT = development
```

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

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

```bash:.env
# app.baseURL = ''
```

これを

```bash:.env
app.baseURL = 'http://example.com/'
```
と、書き換えておきます。
(このURLはもちろんサンプルで、実際はCI4のドキュメントルートを指すホスト名やIPアドレスです)

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

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

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

```bash:.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に接続できる前提で記します

```bash:.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経由の接続なども利用可能になります。これらを利用したい人はCI４のPDOドライバがリリースされるのを待つか、CI４のDatabaseモデルを利用せす自身でDBアクセスのプログラムを実装することになります。

長くなりましたので、[DBの接続テストなどは次回。](https://qiita.com/kohenji01/items/ced458da42ce70e067f8)