Symfony FlexでSymfony4アプリケーションを構築する

Symfony4でアプリケーション開発はじめ2ヶ月ほど立ちました。今後Symfony Flexを中心に開発をすすめることになりそうなので、Symfony Flexを使用したアプリケーションの方法をまとめました。最終的に`/echo`でアクセスすると`{'message': 'echo!'}`を返すAPIサーバを構築します。はじめに、[公式リファレンス](https://symfony.com/doc/current/setup/flex.html)でSymfony Flexの説明を確認します。正しい意味は原文より拾ってください。

### 概要

>Symfony Flex is the new way to install and manage Symfony applications. Flex is not a new Symfony version, but a tool that replaces and improves the Symfony Installer and the Symfony Standard Edition.

Symfony FlexはSymfonyアプリケーションを設置・管理するための新たな方法です。FlexはSymfonyの新規バージョンではないですが、SymfonyインストーラーとSymfonyスタンダードエディションの改善とその代わりになるツールです。

>Symfony Flex automates the most common tasks of Symfony applications, like installing and removing bundles and other Composer dependencies. Symfony Flex works for Symfony 3.3 and higher. Starting from Symfony 4.0, Flex should be used by default, but it is still optional.

Symfony FlexはSymfonyアプリケーションでの共通のタスクを自動化します。例えば、インストール・バンドルの削除・composerの依存などです。Symfony Flexは3.3かそれ以上のバージョンで動作します。Symfony 4.0からは、Flexは基本的に使われるべきですが、まだオプションとなります。

と言った内容が書かれています。Flexを通してプロジェクトを管理して問題なさそうです。

### Symfony Flexアプリケーションの雛形の作成方法

`composer create-project symfony/skeleton’ [プロジェクト名]`を実行することにより、Symfony Flexの雛形が作成されます。

```bash
composer create-project symfony/skeleton .
```

上記コマンドを元にDockerを使用して環境を構築します。

## Docker環境の用意

今回は開発環境を想定しているため、以下のDockerfileを用意し、別途用意するdocker-compose.ymlファイルより起動を行います。

```Dockerfile:Dockerfile
FROM php:7.2

RUN apt-get update
RUN apt-get install -y git zip unzip libzip-dev

RUN docker-php-ext-install -j$(nproc) zip

# composerのインストール
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser
ENV COMPOSER_ALLOW_SUPERUSER 1
# composerの参照を日本に設定
RUN composer config -g repos.packagist composer https://packagist.jp

WORKDIR /var/www/html

EXPOSE 80

# CMD tail -f /dev/null
CMD ["php", "-S", "0.0.0.0:80", "-t", "./public", "./public/index.php"]
```

```yml:
version: '3'

services:

  app:
    build: .
    volumes:
          - ./echo-api/:/var/www/html
    ports:
      - "80:80"
    restart: always
```

上記の構成ファイルをを元に`docker-compose up`で環境の起動を行います。

### Docker環境内でSymfonyプロジェクトの初期化

開発用のDockerが用意できました。次にdocker環境に入り、プロジェクトの初期化を行います。

`docker exec -it {container id} bash`コマンドでDockerコンテナに入り、雛形を作成します。

```bash
composer create-project symfony/skeleton .
```

<img width="639" alt="b1e0cbbd3673c303e869f8e5af749c57.png" src="https://qiita-image-store.s3.amazonaws.com/0/35291/a004fd61-7de6-24ae-7545-b032699ba301.png">

インストールが始まり、最終的に以下のディレクトリが生成されます。

<img width="269" alt="fb768d1c32e5f9377bb693a042568e58.png" src="https://qiita-image-store.s3.amazonaws.com/0/35291/9998f4ba-79e5-d1fb-bf70-33da19814c43.png">

### ライブラリの追加

引き続きルーティング処理を使用できるようにするために'sensio/framework-extra-bundle'のインストールを行います。

```bash
composer require sensio/framework-extra-bundle
```

はじめ、`routing`のライブラリをインストールし、動かそうとしたのですが、追加設定が必要でした。そのため、symfonyでアノテーションルーティングを追加しすぐに使用したい場合は`sensio/framework-extra-bundle`が適しているかと思います。

### echo apiの作成

`/echo`にアクセスすると`{'message': 'echo!'}`を返すAPIを用意します。`src/Controller/EchoController.php`にファイルを作成し以下ファイルを作成します。

```php:src/Controller/EchoController.php
<?php namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\Request;

/**
 * Class EchoControllerTest
 * @package App\Tests\Controller
 */
class EchoControllerTest extends WebTestCase
{

    public function test_echo_index()
    {
        $client = $this->createClient();
        $client->request(Request::METHOD_GET, '/echo');
        $this->assertEquals($client->getResponse()->getContent(), '{"message":"echo!"}');
    }
}
```

#### テストの実行

テストを実行し成功することを確認します。

```bash
php bin/phpunit
```

<img width="682" alt="909474c1755cd381cba99d9a5339a00e.png" src="https://qiita-image-store.s3.amazonaws.com/0/35291/271f5dd8-bf97-3a38-1e3d-fc11feda41de.png">

またブラウザ[http://127.0.0.1/echo](http://127.0.0.1/echo)からも確認を行い、表示されていることを確認します。

<img width="418" alt="f02eb6dfb0fa58b61b52d826d9a14ec4.png" src="https://qiita-image-store.s3.amazonaws.com/0/35291/87e0de02-dd94-1dad-f6ab-67a16567862c.png">

### まとめ

* Symfony Flexを使用したマイクロフレームワークの開発の流れをデモアプリを元に紹介しました。
* 簡単なecho apiサーバを構築し簡易的なテストも実行しました。
* 作成した環境はdocker化しているため、どんな環境でも手軽に構築が可能です。

Symfony Flexを用いてマイクロフレームワークベースの簡易なプロジェクトを構成できました。アプリケーションを構築するにはデータベースとのやりとりも必要になってくるため、必要に応じて同じようにライブラリを追加することで、拡張することができます。

### リンク

[ソースコード](https://github.com/inkusu/symfony_flex_demo)