Symfony入門 ~ Quick Tour 1/3 The Big Picture ~

この記事は私の勉強も兼ねて[Symfonyの公式ドキュメント](https://symfony.com/doc/current/index.html)の[Quick Tour/The Big Picture](https://symfony.com/doc/current/quick_tour/the_big_picture.html)を翻訳したものです。手探りで翻訳したので加減がわからずカタカナが多くなってしまっている気がします。（普通にブラウザの翻訳機能を使いながら英語のドキュメントを読んだ方がわかりやすいと思います。^^;）

こちらのドキュメントは[【非公式】 Symfony 日本語ドキュメント](https://okazy.github.io/symfony-docs/quick_tour/the_big_picture.html)でもご確認いただけます。【非公式】 Symfony 日本語ドキュメントのリポジトリは[こちら](https://github.com/okazy/symfony-docs)です。プルリク等いただけると嬉しいです。私が記事内で紹介されているコードを動作確認した時のコードは[こちら](https://github.com/okazy/symfony-quick-tour)にあります。

この記事およびコードは[公式ドキュメントのライセンス](https://github.com/symfony/symfony-docs/blob/master/LICENSE.md)に従い[Creative Commons BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)となります。

全体像
===============

10分でSymfonyを使い始めましょう！最も重要な概念を理解し、プロジェクトの構築を開始するには本当にこれだけです。

以前にWebフレームワークを利用していた場合は、Symfonyに親しみやすいはずです。
そうでない場合は、全く新しいWebアプリケーションの開発方法へようこそ。
Symfonyはベストプラクティスを採用し、安全簡単にアップグレードができる後方互換性、そして長期的なサポートを提供します。

Symfonyのダウンロード
---------------------

まずは [Composer](https://getcomposer.org/) がインストールされており、PHP7.1.3以降がインストールされていることを確認してください。

準備が整ったらターミナルで次を実行:

```terminal
    $ composer create-project symfony/skeleton quick_tour
```

これにより、最小で強力なSymfonyアプリケーションの ``quick_tour/`` ディレクトリが作成されます。:

```text
    quick_tour/
    ├─ .env
    ├─ bin/console
    ├─ composer.json
    ├─ composer.lock
    ├─ config/
    ├─ public/index.php
    ├─ src/
    ├─ symfony.lock
    ├─ var/
    └─ vendor/
```

すでにブラウザでプロジェクトをロードできますか? はい！
[Nginx またはApache](https://okazy.github.io/symfony-docs/setup/web_server_configuration) をセットアップし、 ``public/`` ディレクトリをドキュメントルートに設定します。
しかし、開発のためには[SymfonyのローカルWebサーバをインストール](https://okazy.github.io/symfony-docs/setup/symfony_server)して次のように実行することをお勧めします。:

```terminal
    $ symfony server:start
```

ブラウザで ``http://localhost:8000`` へアクセスして新しいアプリケーションを試してみましょう！:

<img width="1464" alt="スクリーンショット 2020-07-19 17.16.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206259/1157ee65-1b3c-450b-e281-7205103321f7.png">

基礎: ルート、コントローラ、レスポンス
-----------------------------------------

プロジェクトには約15個のファイルしかありませんが、洗練されたAPI、堅牢なWebアプリ、またはマイクロサービスの準備ができています。
Symfonyは小さなものから始まりますが、あなたと共にスケールします。

しかし先に進む前に、最初のページを作成して基本を掘り下げましょう。

``config/routes.yaml`` で始めます。ここで新しいページのURLを定義できます。
ファイルに既に存在する例のコメントアウトを外します。:

```yaml
    # config/routes.yaml
    index:
        path: /
        controller: 'App\Controller\DefaultController::index'
```

これは *ルート* と呼ばれます。
それはページ (``/``) のURLと "controller" を定義します。
このURLにアクセスしたときに呼び出される *関数* です。
その関数はまだ存在しないので、作成しましょう！

``src/Controller`` に新しい ``DefaultController`` クラスと ``index`` メソッドを作成します。::

```php:src/Controller/DefaultController.php
    namespace App\Controller;

    use Symfony\Component\HttpFoundation\Response;

    class DefaultController
    {
        public function index()
        {
            return new Response('Hello!');
        }
    }
```

これだけです！ホームページ ``http://localhost:8000/`` にアクセスしてみましょう。
SymfonyはURLがルートと一致することを確認し、新しい ``index()`` メソッドを実行します。

コントローラは、1つのルールを持つ通常の関数で、Symfony ``Response`` オブジェクトを返す必要があります。
ただし、そのレスポンスには、単純なテキスト、JSON、または完全なHTMLページなど、何でも含めることができます。

しかし、ルーティングシステムはるかに強力です。ルートをもっと面白くしましょう。:

```diff
# config/routes.yaml
index:
-     path: /
+     path: /hello/{name}
    controller: 'App\Controller\DefaultController::index'
```

このページのURLが変更され、今 ``/hello/*`` となり、 ``{name}`` は全てに一致するワイルドカードのように機能します。
そしてそれは良くなります！コントローラも更新します。:

```diff:src/Controller/DefaultController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;

class DefaultController
{
-     public function index()
+     public function index($name)
    {
-         return new Response('Hello!');
+         return new Response("Hello $name!");
    }
}
```

``http://localhost:8000/hello/Symfony`` にアクセスして、ページを試してください。
あなたは ``Hello Symfony!`` を確認できるでしょう。
URLの ``{name}`` の値は、コントローラーの ``$name`` 引数として使用できます。

しかし、さらに簡単になる可能性があります。アノテーションサポートをインストールしましょう。:

```terminal
    $ composer require annotations
```

次に、 ``#`` の文字を追加してYAMLルートをコメントアウトします。:

```yaml
    # config/routes.yaml
    # index:
    #     path: /hello/{name}
    #     controller: 'App\Controller\DefaultController::index'
```

代わりに、コントローラーメソッドの *真上* にルートを追加します。:

```diff:src/Controller/DefaultController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
+ use Symfony\Component\Routing\Annotation\Route;
class DefaultController
{
+    /**
+     * @Route("/hello/{name}")
+     */
     public function index($name) {
         // ...
     }
}
```

これは以前と同じように機能します！
しかし、アノテーションを使用することにより、ルートとコントローラーは互いに隣接して存在します。
別のページが必要ですか？
``DefaultController`` に別のルートとメソッドを追加します。::

```php:src/Controller/DefaultController.php
    namespace App\Controller;

    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;

    class DefaultController
    {
        // ...

        /**
         * @Route("/simplicity")
         */
        public function simple()
        {
            return new Response('Simple! Easy! Great!');
        }
    }
```

ルーティングは *さらに* いろいろなことができますが、それは別の機会にとっておきましょう！
まさに今、アプリにはさらに多くの機能が必要です！
テンプレートエンジンやロギング、デバッグツールなどのように。

次は[Flex: Compose your Application](https://okazy.github.io/symfony-docs/quick_tour/flex_recipes.html)となります。
Quick Tourの残りの2記事については翻訳したらQiitaにも投稿しようと思います。