【2020年度版】EC-CUBE の開発環境の作り方

[ビルトインウェブサーバーで簡単環境構築](https://qiita.com/nanasess/items/c835e87c0e720c4e391f) や、 [EC-CUBE の開発環境の作り方](https://qiita.com/nanasess/items/7170ab22e81e2e8e7edd)の2020年度版です。

最近、 **[symfony/cli](https://symfony.com/download)** が超絶使えるようになっているのでご紹介したいと思います。

- *一部制約がありますが、 WordPress や Symfony を使用していない EC-CUBE2系でも利用可能です*
- *Symfony3系、4系では `Symfony/WebServer-bundle` で開発用ローカルウェブサーバーを起動していましたが、 Symfony5系では廃止されました*

## symfony/cli とは

- Symfonyプロジェクトを新しく作成したり
- パワフルな開発用ローカルウェブサーバーが利用できたり
- セキュリティチェックができたり

する便利なコマンドラインツールです。
ここでは開発用ローカルウェブサーバーの利用方法を中心に紹介したいと思います。

## インストール方法

**2023年1月21日追記**
最近、 Symfony cli のインストール方法が変わりましたので、こちらを参考にインストールしてください。
https://symfony.com/download

### Mac

```shell
curl -sS https://get.symfony.com/cli/installer | bash

## $HOME/.symfony/bin に PATH を通しておきます
export PATH=$HOME/.symfony/bin:$PATH
```

### Windows

*後日もうちょっと詳細にまとめます*

1. [こちらから setup.exe をダウンロードし、インストールしてください](https://symfony.com/download)
2. (Git がインストールされていない場合) インストールの最後に、 Git for Windows のダウンロードページが表示されます。 *Click here to download manually* のリンクをクリックし、 Git for Windows をダウンロードし、インストールしてください
3. (PHP がインストールされていない場合) [Web Platform Installer](https://www.microsoft.com/web/downloads/platform.aspx) をインストールし、(**PHP7.3.x(x64)**) をインストールします

*TODO: PHPのインストールは [chocolatey](https://chocolatey.org/packages/php/7.3.17) の方が簡単かも*

### Linux

```shell
wget https://get.symfony.com/cli/installer -O - | bash

## $HOME/.symfony/bin に PATH を通しておきます
export PATH=$HOME/.symfony/bin:$PATH
```


## EC-CUBE(4.0系)のインストール方法

symfony コマンドをインストールしたら、以下3つのコマンドを実行することでEC-CUBEをインストールできます。

```shell
symfony composer selfupdate --1 ## EC-CUBE4.1以降は不要です
symfony composer install
symfony console eccube:install -n
```

## 開発用ローカルウェブサーバーの利用方法

以下のコマンドを実行することで `http://127.0.0.1:8000` で開発用ローカルウェブサーバーが起動します。

```
symfony server:start
```

インストールされている PHP を自動的に検索してくれますので、特別な設定不要です。
また、 **php-fpm がインストールされていれば、 php-fpm 経由で起動します**

停止したい場合は `CTRL+C` で停止します。

### SSL を利用したい場合

以下のコマンドでオレオレSSL証明書を自動設定できます。

```
symfony server:ca:install
```

開発用ローカルウェブサーバーの URL も `https://127.0.0.1:8000` になります。
WSL2 を使用している場合は `https://localhost:8000` へアクセスしてください。

### インストールされているPHPの表示

`symfony local:php:list` コマンドで、インストールされている PHP を一覧表示できます

```shell
symfony local:php:list
```

*コマンドを実行すると、以下のようなテーブルが表示されます*

| Version | Directory                               | PHP CLI   | PHP FPM                       | PHP CGI                      | Server  | System? |
|---------|-----------------------------------------|-----------|-------------------------------|------------------------------|---------|---------|
|  5.3.29 | /opt/local                              | bin/php53 |                               |                              | PHP CLI |         |
|  5.4.45 | /Users/nanasess/.phpbrew/php/php-5.4.45 | bin/php   | sbin/php-fpm                  | bin/php-cgi                  | PHP FPM |         |
|  5.6.40 | /Users/nanasess/.phpbrew/php/php-5.6.40 | bin/php   | sbin/php-fpm                  | bin/php-cgi                  | PHP FPM |         |
|  7.0.33 | /Users/nanasess/.phpbrew/php/php-7.0.33 | bin/php   | sbin/php-fpm                  | bin/php-cgi                  | PHP FPM |         |
|  7.1.33 | /Users/nanasess/.phpbrew/php/php-7.1.33 | bin/php   | sbin/php-fpm                  | bin/php-cgi                  | PHP FPM |         |
|  7.2.30 | /Users/nanasess/.phpbrew/php/php-7.2.30 | bin/php   | sbin/php-fpm                  | bin/php-cgi                  | PHP FPM |         |
|  7.3.11 | /usr                                    | bin/php   | sbin/php-fpm                  |                              | PHP FPM |         |
|  7.3.17 | /Users/nanasess/.phpbrew/php/php-7.3.17 | bin/php   | sbin/php-fpm                  | bin/php-cgi                  | PHP FPM |         |
|   7.4.3 | /usr/local                              | bin/php   | Cellar/php/7.4.3/sbin/php-fpm | Cellar/php/7.4.3/bin/php-cgi | PHP FPM | *       |
|   7.4.5 | /Users/nanasess/.phpbrew/php/php-7.4.5  | bin/php   | sbin/php-fpm                  | bin/php-cgi                  | PHP FPM |         |

僕みたいな、 PHPをたくさん入れている人は上記のようにたくさん表示されます。
とても便利な機能ですね！
試した限りでは、 cli 版のPHP5.4でも動作しました。

### 指定したPHPバージョンで開発用ローカルウェブサーバーを起動する

基本的に、 PATH の通った PHP で開発用ローカルウェブサーバーは起動します。
PHP7.2を利用したいプロジェクトでは、以下のように `.php-version` ファイルを作成します。

```shell
cd my-project
echo "7.2" > .php-version
```

### DocumentRoot を指定する

EC-CUBE2系、EC-CUBE3系のように、 html ディレクトリをドキュメントルートにしたい場合は `--document-root` オプションを使用します

```shell
symfony server:start --document-root=html
```

### EC-CUBE2系や WordPress で使用する

この開発用ローカルウェブサーバーは、 **DirectoryIndex を設定することができません**

少々不便ですが 下層の DirectoryIndexにアクセスする場合は、以下の例のように index.php 付与してアクセスしましょう

#### 例

- `https://wordpress.example.com/wp-admin/` → `https://wordpress.example.com/wp-admin/index.php`

EC-CUBE2系は `html/define.php` の `define('USE_FILENAME_DIR_INDEX', true);` を設定することで対応可能です。

## 注意点

#### `symfony server:ca:install` で SSL(TLS)を有効にした場合の注意点

`$_SERVER['HTTPS']` は **On** となります (Apache などは小文字の **on**)。一部のアプリケーションやフレームワークでは誤作動の可能性がありますので注意してください

#### 開発用ローカルウェブサーバーからメールを送信しようとすると、 Invalid ID given エラーになる場合

開発用ローカルウェブサーバーからメールを送信しようとすると、 Message ID が `乱数@127.0.0.1:8000` となり、 **Invalid ID given** というエラーになってしまう場合があります。
これは、 `$_SERVER['SERVER_NAME']` が `127.0.0.1:8000` に設定されるためです。
以下のようなコードを `path/to/ec-cube/index.php` に入れておくことで回避できます。

```path/to/ec-cube/index.php
// require $autoload; の下あたり

if (isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Symfony') !== false) {
    $_SERVER['SERVER_NAME'] = '127.0.0.1';
}
```

## まとめ

Symfony と Docker は相性が強烈に悪く、設定も煩雑で難解です。
**symfony/cli** でしたら、簡単なコマンドで SSL のテスト環境まで構築できてしまいます。ローカル開発環境構築に挫折したり苦しんでいる方には、ぜひおすすめします。