LaradockでPhalconに入門する

## TL;DR

`Phalcon`触ってみたかったので、`Laradock`で環境作ってWebアプリの雛形作ってみた

## 対象

* Laravelとか知ってるけどPhalconは触ったことないPHPer（私）
* サクッとPhalconお触りしてみたい人

## 準備

* macOS 10.14.5
* docker 18.09.2

## ディレクトリ構成

以下のようになる想定です

```shell-session
/path/to
├── phalcon-sample
└── laradock
```

※ `phalcon-sample`のところはプロジェクト名等で適宜読み替えてください

## 手順

`Laradock`の`workspace`コンテナ経由で`Phalcon`プロジェクトを作成します

### Laradock導入

```shell-session
$ cd /path/to
$ git clone https://github.com/laradock/laradock.git
Cloning into 'laradock'...
...
Resolving deltas: 100% (4755/4755), done.
```

※ `Laradock`について詳細は割愛するので、必要な方は[このへん](https://qiita.com/halnique/items/235be66dc3b71d303f88)見てください

### .env作成

```shell-session
$ cd /path/to/laradock
$ cp env-example .env
$ vi .env
$ diff -u env-example .env
...
-WORKSPACE_INSTALL_PHALCON=false
+WORKSPACE_INSTALL_PHALCON=true
...
-PHP_FPM_INSTALL_PHALCON=false
+PHP_FPM_INSTALL_PHALCON=true
...
-MYSQL_VERSION=latest
+MYSQL_VERSION=5.7
```

`.env`の変更は上記3箇所です

※ `MYSQL_VERSION`については本題とあまり関係ないので[このへん](https://qiita.com/halnique/items/235be66dc3b71d303f88#%E3%83%8F%E3%83%9E%E3%82%8A%E3%81%A9%E3%81%93%E3%82%8D)参考に「ふーん」ぐらいで大丈夫です

### dockerコンテナ起動

`workspace`コンテナのみ指定して起動します

```shell-session
$ docker-compose up -d workspace
Creating network "laradock_frontend" with driver "bridge"
Creating network "laradock_backend" with driver "bridge"
Creating network "laradock_default" with the default driver
Creating laradock_docker-in-docker_1 ... done
Creating laradock_workspace_1        ... done
$ docker-compose ps
           Name                      Command          State          Ports        
----------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh   Up      2375/tcp            
laradock_workspace_1          /sbin/my_init           Up      0.0.0.0:2222->22/tcp
```

### phalcon/devtoolsのインストールとPhalconプロジェクト作成

起動した`workspace`コンテナ内で[phalcon-devtools](https://github.com/phalcon/phalcon-devtools)をインストールします

`phalcon-devtools`は`Phalcon`公式から提供されている便利スクリプト集らしいです

`Laravel`で言うところの`artisan`みたいなやつでしょうか？（よくわかってない）

[公式の手順](https://phalconphp.com/ja/download/tools)とはちょっと異なりますが、一度コンテナ内のグローバルにインストールしてプロジェクト作成します（※ 後でプロジェクト内でインストールし直します）

```shell-session
$ docker-compose exec --user=laradock workspace bash
# ここから コンテナ内での作業です
$ composer global require phalcon/devtools
Changed current directory to /home/laradock/.composer
Using version ^3.4 for phalcon/devtools
./composer.json has been updated
...
Writing lock file
Generating autoload files
$ php ~/.composer/vendor/bin/phalcon.php project phalcon-sample

Phalcon DevTools (3.4.0)

                                                         
  Success: Controller "index" was successfully created.  
                                                         
/var/www/phalcon-sample/app/controllers/IndexController.php
                                                                                                                                                                      
  Success: Project 'phalcon-sample' was successfully created.
Please choose a password and username to use Database connection.Used default:'root' without password.  
                                                                                                                                                                      
$ exit
exit
# ここまで コンテナ内での作業です
$ docker-compose down
Stopping laradock_workspace_1        ... done
Stopping laradock_docker-in-docker_1 ... done
Removing laradock_workspace_1        ... done
Removing laradock_docker-in-docker_1 ... done
Removing network laradock_frontend
Removing network laradock_backend
Removing network laradock_default
```

`phalcon-devtools`でプロジェクト作成したら、コンテナは一度抜けて破棄します

### ローカル動作確認

`/path/to/phalcon-sample`ディレクトリがホスト側にも出来上がっているはずなので、`Laradock`のマウント設定を少し変更します

```shell-session
$ vi .env
$ diff -u env-example .env
...
-APP_CODE_PATH_HOST=../
+APP_CODE_PATH_HOST=../phalcon-sample
...
-WORKSPACE_INSTALL_PHALCON=false
+WORKSPACE_INSTALL_PHALCON=true
...
-PHP_FPM_INSTALL_PHALCON=false
+PHP_FPM_INSTALL_PHALCON=true
...
-MYSQL_VERSION=latest
+MYSQL_VERSION=5.7
```

先ほどの3箇所に加え、`APP_CODE_PATH_HOST`を変更しています

デフォルトでは`/path/to`をコンテナにマウントしていたのに対し、`/path/to/phalcon-sample`をマウントするようにしています

`.env`を変更したら、今度は`workspace`以外に`nginx`と`mysql`も一緒に起動します

```shell-session
$ docker-compose up -d workspace nginx mysql
Creating network "laradock_frontend" with driver "bridge"
Creating network "laradock_backend" with driver "bridge"
Creating network "laradock_default" with the default driver
Creating laradock_mysql_1            ... done
Creating laradock_docker-in-docker_1 ... done
Creating laradock_workspace_1        ... done
Creating laradock_php-fpm_1          ... done
Creating laradock_nginx_1            ... done
```

無事に立ち上がったら、この時点で[localhost](http://localhost/)で動作確認できると思います

<img width="748" alt="screenshot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138022/a56d4dc1-2f97-443b-dce2-f2efae6993d5.png">

`phalcon-devtools`はこの後も使うと思うので、プロジェクト内に改めてインストールしておきます

```shell-session
$ docker-compose exec --user=laradock workspace bash
# ここから コンテナ内での作業です
$ composer require --dev phalcon/devtools
Using version ^3.4 for phalcon/devtools
./composer.json has been created
...
Writing lock file
Generating autoload files
$ exit
exit
```

最終的に中身はこんな感じになっていると思います

```shell-session
$ ll phalcon-sample/
total 72
drwxr-xr-x   8 user  group    256  6 21 12:22 app/
drwxr-xr-x   2 user  group     64  6 21 12:22 cache/
-rw-r--r--   1 user  group     66  6 21 12:33 composer.json
-rw-r--r--   1 user  group  26968  6 21 12:33 composer.lock
-rw-r--r--   1 user  group    123  6 21 12:22 index.html
drwxr-xr-x   9 user  group    288  6 21 12:22 public/
drwxr-xr-x  12 user  group    384  6 21 12:33 vendor/
```

## まとめ

`phalcon-devtools`周りでちょっとぐだつきましたが、とりあえず最終形はきれいな形に収まったと思います…