Flex: Compose your Application

After reading the first part of this tutorial, you have decided that Symfony was worth another 10 minutes. Great choice! In this second part, you'll learn about Symfony Flex: the amazing tool that makes adding new features as simple as running one command. It's also the reason why Symfony is ideal for a small micro-service or a huge application. Curious? Perfect!

このチュートリアルの最初の部分を読んだ後、Symfony にはさらに 10 分の価値があると判断したことになります。偉大な選択肢!この第 2 部では、コマンドを 1 つ実行するだけで新しい機能を簡単に追加できる素晴らしいツールである Symfony Flex について学びます。これは、Symfony が小さなマイクロサービスや巨大なアプリケーションにとって理想的である理由でもあります。奇妙?完全!

Symfony: Start Micro!

Unless you're building a pure API (more on that soon!), you'll probably want to render HTML. To do that, you'll use Twig. Twig is a flexible, fast, and secure template engine for PHP. It makes your templates more readable and concise; it also makes them more friendly for web designers.

純粋な API を構築していない限り (これについてはすぐに説明します!)、おそらく HTML を torender したいと思うでしょう。そのためには、Twig を使用します。 Twig は、柔軟で高速かつ安全な PHP 用のテンプレート エンジンです。テンプレートをより読みやすく簡潔にします。また、Web デザイナーにとってより使いやすくなります。

Is Twig already installed in our application? Actually, not yet! And that's great! When you start a new Symfony project, it's small: only the most critical dependencies are included in your composer.json file:

Twig は既にアプリケーションにインストールされていますか?実はまだです!これは素晴らしいことです!新しい Symfony プロジェクトを開始するとき、それは小さいです: 最も重要な依存関係のみが composer.json ファイルに含まれています:
1
2
3
4
5
6
7
"require": {
    "...",
    "symfony/console": "^6.1",
    "symfony/flex": "^2.0",
    "symfony/framework-bundle": "^6.1",
    "symfony/yaml": "^6.1"
}

This makes Symfony different from any other PHP framework! Instead of starting with a bulky app with every possible feature you might ever need, a Symfony app is small, simple and fast. And you're in total control of what you add.

これにより、Symfony は他の PHP フレームワークとは異なります! Symfony アプリは、必要な可能性のあるすべての機能を備えたかさばるアプリから始めるのではなく、小さく、シンプルで高速です。何を追加するかは完全に制御できます。

Flex Recipes and Aliases

So how can we install and configure Twig? By running one single command:

では、どうすれば Twig をインストールして設定できるのでしょうか?単一のコマンドを実行することにより:
1
$ composer require twig

Two very interesting things happen behind the scenes thanks to Symfony Flex: a Composer plugin that is already installed in our project.

Symfony Flex のおかげで、舞台裏で 2 つの非常に興味深いことが起こっています。プロジェクトに既にインストールされている aComposer プラグインです。

First, twig is not the name of a Composer package: it's a Flex alias that points to symfony/twig-bundle. Flex resolves that alias for Composer.

まず、twig は Composer パッケージの名前ではありません: symfony/twig-bundle を指す Flex エイリアスです。 Flex は Composer のエイリアスを解決します。

And second, Flex installs a recipe for symfony/twig-bundle. What's a recipe? It's a way for a library to automatically configure itself by adding and modifying files. Thanks to recipes, adding features is seamless and automated: install a package and you're done!

次に、Flex は symfony/twig-bundle のレシピをインストールします。レシピとは何ですか?これは、ライブラリがファイルを追加および変更することによって、ライブラリ自体を自動的に構成する方法です。レシピのおかげで、機能の追加はシームレスかつ自動化されています。パッケージをインストールすれば完了です!

You can find a full list of recipes and aliases inside RECIPES.md on the recipes repository.

レシピとエイリアスの完全なリストは、レシピ リポジトリの RECIPES.md にあります。

What did this recipe do? In addition to automatically enabling the feature in config/bundles.php, it added 3 things:

このレシピは何をしましたか?機能 inconfig/bundles.php を自動的に有効にすることに加えて、3 つのことが追加されました。
config/packages/twig.yaml
A configuration file that sets up Twig with sensible defaults.
適切なデフォルトで Twig をセットアップする構成ファイル。
config/packages/test/twig.yaml
A configuration file that changes some Twig options when running tests.
テストの実行時に一部の Twig オプションを変更する構成ファイル。
templates/
This is the directory where template files will live. The recipe also added a base.html.twig layout file.
これは、テンプレート ファイルが存在するディレクトリです。このレシピには、base.html.twig レイアウト ファイルも追加されています。

Twig: Rendering a Template

Thanks to Flex, after one command, you can start using Twig immediately:

Flex のおかげで、1 つのコマンドの後、すぐに Twig を使い始めることができます:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
  // src/Controller/DefaultController.php
  namespace App\Controller;

  use Symfony\Component\Routing\Annotation\Route;
- use Symfony\Component\HttpFoundation\Response;
+ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

- class DefaultController
+ class DefaultController extends AbstractController
  {
       #[Route('/hello/{name}', methods: ['GET'])]
       public function index(string $name): Response
       {
-        return new Response("Hello $name!");
+        return $this->render('default/index.html.twig', [
+            'name' => $name,
+        ]);
       }
  }

By extending AbstractController, you now have access to a number of shortcut methods and tools, like render(). Create the new template:

AbstractController を拡張することで、render() などの多くのショートカット メソッドやツールにアクセスできるようになりました。新しいテンプレートを作成します。
1
2
{# templates/default/index.html.twig #}
<h1>Hello {{ name }}</h1>

That's it! The {{ name }} syntax will print the name variable that's passed in from the controller. If you're new to Twig, welcome! You'll learn more about its syntax and power later.

それでおしまい! {{ name }} 構文は、コントローラーから渡された name 変数を出力します。 Twig を初めて使用する場合は、ようこそ!その構文と機能については後で詳しく説明します。

But, right now, the page only contains the h1 tag. To give it an HTML layout, extend base.html.twig:

ただし、現在、ページには h1 タグのみが含まれています。 HTML レイアウトにするには、base.html.twig を拡張します。
1
2
3
4
5
6
{# templates/default/index.html.twig #}
{% extends 'base.html.twig' %}

{% block body %}
    <h1>Hello {{ name }}</h1>
{% endblock %}

This is called template inheritance: our page now inherits the HTML structure from base.html.twig.

これはテンプレートの継承と呼ばれます: このページは、base.html.twig から HTML 構造を継承します。

Profiler: Debugging Paradise

One of the coolest features of Symfony isn't even installed yet! Let's fix that:

Symfony の最もクールな機能の 1 つは、まだインストールされていません!それを修正しましょう:
1
$ composer require profiler

Yes! This is another alias! And Flex also installs another recipe, which automates the configuration of Symfony's Profiler. What's the result? Refresh!

はい!これは別のエイリアスです。また、Flex は、Symfony のプロファイラーの構成を自動化する別のレシピもインストールします。結果は?リフレッシュ!

See that black bar on the bottom? That's the web debug toolbar, and it's your new best friend. By hovering over each icon, you can get information about what controller was executed, performance information, cache hits & misses and a lot more. Click any icon to go into the profiler where you have even more detailed debugging and performance data!

一番下の黒いバーが見えますか?それが Web デバッグ ツールバーであり、あなたの新しい親友です。各アイコンにカーソルを合わせると、実行されたコントローラー、パフォーマンス情報、キャッシュ ヒットとミスなどに関する情報を取得できます。任意のアイコンをクリックしてプロファイラーに移動すると、さらに詳細なデバッグ データとパフォーマンス データが表示されます。

Oh, and as you install more libraries, you'll get more tools (like a web debug toolbar icon that shows database queries).

ああ、さらに多くのライブラリをインストールすると、より多くのツール (データベース クエリを表示する Web デバッグ ツールバー アイコンなど) を取得できます。

You can now directly use the profiler because it configured itself thanks to the recipe. What else can we install?

レシピのおかげでプロファイラーが自動的に構成されたため、プロファイラーを直接使用できるようになりました。他に何をインストールできますか?

Rich API Support

Are you building an API? You can already return JSON from any controller:

APIを構築していますか?任意のコントローラーから既に JSON を返すことができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// src/Controller/DefaultController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;

class DefaultController extends AbstractController
{
    // ...

    #[Route('/api/hello/{name}', methods: ['GET'])]
    public function apiHello(string $name): JsonResponse
    {
        return $this->json([
            'name' => $name,
            'symfony' => 'rocks',
        ]);
    }
}

But for a truly rich API, try installing API Platform:

しかし、真にリッチな API については、API プラットフォームをインストールしてみてください。
1
$ composer require api

This is an alias to api-platform/api-pack Symfony pack, which has dependencies on several other packages, like Symfony's Validator and Security components, as well as the Doctrine ORM. In fact, Flex installed 5 recipes!

これは api-platform/api-pack Symfony pack のエイリアスであり、Symfony の Validator や Security コンポーネント、Doctrine ORM など、他のいくつかのパッケージに依存しています。実際、Flex は 5 つのレシピをインストールしました。

But like usual, we can immediately start using the new library. Want to create a rich API for a product table? Create a Product entity and give it the #[ApiResource] attribute:

しかし、いつものように、新しいライブラリをすぐに使い始めることができます。製品テーブル用の豊富な API を作成したいですか? Product エンティティを作成し、#[ApiResource] 属性を指定します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// src/Entity/Product.php
namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ApiResource]
class Product
{
    #[ORM\Id]
    #[ORM\GeneratedValue(strategy: 'AUTO')]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string')]
    private $name;

    #[ORM\Column(type: 'integer')]
    private $price;

    // ...
}

Done! You now have endpoints to list, add, update and delete products! Don't believe me? List your routes by running:

終わり!製品を一覧表示、追加、更新、および削除するためのエンドポイントが用意されました。信じない?次のコマンドを実行して、ルートを一覧表示します。
1
2
3
4
5
6
7
8
9
10
11
12
$ php bin/console debug:router

------------------------------ -------- -------------------------------------
 Name                           Method   Path
------------------------------ -------- -------------------------------------
 api_products_get_collection    GET      /api/products.{_format}
 api_products_post_collection   POST     /api/products.{_format}
 api_products_get_item          GET      /api/products/{id}.{_format}
 api_products_put_item          PUT      /api/products/{id}.{_format}
 api_products_delete_item       DELETE   /api/products/{id}.{_format}
 ...
------------------------------ -------- -------------------------------------

Removing Recipes

Not convinced yet? No problem: remove the library:

まだ納得していませんか?問題ありません: ライブラリを削除します:
1
$ composer remove api

Flex will uninstall the recipes: removing files and undoing changes to put your app back in its original state. Experiment without worry.

Flex はレシピをアンインストールします。ファイルを削除し、変更を取り消してアプリを元の状態に戻します。心配せずに実験してください。

More Features, Architecture and Speed

I hope you're as excited about Flex as I am! But we still have one more chapter, and it's the most important yet. I want to show you how Symfony empowers you to quickly build features without sacrificing code quality or performance. It's all about the service container, and it's Symfony's super power. Read on: about The Architecture.

皆さんも私と同じように Flex に興奮していることを願っています!しかし、まだもう 1 つの章があり、これが最も重要です。 Symfony を使用すると、コードの品質やパフォーマンスを犠牲にすることなく機能をすばやく構築できるようになる方法をお見せしたいと思います。サービスコンテナがすべてであり、Symfony のスーパーパワーです。続きを読む: The Architecture について。