Flex: Составьте ваше приложение

После прочтения первой части этого туториала, вы решили, что Symfony стоит ещё 10 ваших минут. Отличный выбор! В этой второй части, вы узнаете о Symfony Flex: потрясающем инструменте, который делает добавление новых функций таким же простым, как выполнение команды. Он также является причиной того, почему Symfony идеален для маленького микро-сервиса или огромного приложения. Интересно? Отлично!

Symfony: Начните с микро!

Кроме случаев, когда вы строите чистый API (об этом позже!), вы скорее всего захотите отобразить HTML. Чтобы сделать это, вы будете использовать Twig. Twig - это гибкий, быстрый и безопасный шаблонизатор для PHP. Он делает ваши шаблоны более читаемыми и компактными; он также делает их более дружественными для веб-дизайнеров.

Twig уже установлен в нашем приложении? На самом деле, ещё нет! И это прекрасно! Когда вы начинаете новый проект Symfony, он маленький: только самые критично важные зависимости включены в ваш файл composer.json:

1
2
3
4
5
6
7
"require": {
    "...",
    "symfony/console": "^4.1",
    "symfony/flex": "^1.0",
    "symfony/framework-bundle": "^4.1",
    "symfony/yaml": "^4.1"
}

Это отличает Symfony от любого другого PHP фреймворка! Вместо того, чтобы начинать с громоздкого приложения с каждой возможной функцией, которая может вам понадобиться, приложение Symfony маленькое, простое и быстрое. И вы полностью контролируете, что добавлять.

Рецепты и дополнительные имена Flex

Так как же нам установить и сконфигурировать Twig? Просто выполните одну команду:

1
$ composer require twig

Две очень интересные вещи происходят за кулисами благодаря Symfony Flex: плагину Composer, который уже установлен в нашем проекте.

Во-первых, twig - это не имя пакета Composer: это дополнительное имя Flex, которое указывает на symfony/twig-bundle. Flex разрешает это дополнительное имя для Composer.

И во-вторых, Flex устанавливает рецепт для symfony/twig-bundle. Что такое рецепт? Это способ для библиотеки автоматически конфигурировать себя, добавляя и изменяя файлы. Благодаря рецептам, добавление функций незаметно и автоматизировано: установите пакет и вы закончили!

Вы можете найти полный список рецептов и дополнительных имён, зайдя на https://symfony.sh.

Что сделал этот рецепт? В дополнение к автоматическому подключению функции в config/bundles.php, он добавил 3 вещи:

config/packages/twig.yaml
Файл конфигурации, который устаналивает Twig с разумными настройками по умолчанию.
config/routes/dev/twig.yaml
Маршрут, который помогает вам отладить ваши страницы ошибок.
templates/
Каталог, в котором будут жить файлы шаблонов. Рецепт также добавил файл макета base.html.twig.

Twig: Отображение шаблона

Благодаря Flex, после одной команды вы можете незамедлительно начать использовать Twig:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// src/Controller/DefaultController.php
// ...

+ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

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

Расширив AbstractController, у вас теперь есть доступ к перечню методов сокращения и инструментов, вроде render(). Создайте новый шаблон:

1
2
{# templates/default/index.html.twig #}
<h1>Привет, {{ name }}</h1>

Вот и всё! Синтаксис {{ name }} отобразит переменную name, которая передаётся из контроллера. Если вы новичок в Twig, то добро пожаловать! Вы узнаете больше о его синтаксисе и силе позже.

Но, прямо сейчас. страница содержит только тег h1. Чтобы предоставить ему макет HTML, расширьте base.html.twig:

1
2
3
4
5
6
{# templates/default/index.html.twig #}
{% extends 'base.html.twig' %}

{% block body %}
    <h1>Привет, {{ name }}</h1>
{% endblock %}

Это называется наследование шаблона: наша страница теперь наследует структуру HTML из base.html.twig.

Профилировщик: Рай отладки

Одна из самых крутых функций Symfony ещё даже не установлена! Давайте это исправим:

1
$ composer require profiler

Да! Это ещё один союзник! И Flex также устанавливает другой рецепт, который автоматизирует конфигурацию Профилировщика Symfony. Какой результат? Обновите!

Видите эту черную панель внизу? Это панель инструментов веб-отладки, и это ваш новый лучший друг. Наведя на на каждую иконку, вы можете получить информацию о том, какой контроллер был выполенен, инфромацию о производительности, удачи и неудачи кеширования и многое другое. Нажмите на любую иконку, чтобы зайти в профилировщик, где вы можете получить ещё более детализированные данные об отладке и производительности!

А, и по ходу установки новых библиотек, вы будете получать больше инструментов (например иконку панели инструментов веб-отладки, которая отображает запросы БД).

Использование профилировщика просто, так как он сконфигурировал себя сам благодаря рецепт. Что ещё мы можем установить так же легко?

Богатая поддержка API

Вы строите API? Вы можете уже с лёгкостью вернуть JSON из любого контроллера:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/**
 * @Route("/api/hello/{name}")
 */
public function apiExample($name)
{
    return $this->json([
        'name' => $name,
        'symfony' => 'rocks',
    ]);
}

Но для действительно богатого API, попробуйте установить Платформу Api:

1
$ composer require api

Это дополнительное имя api-platform/api-pack, которое имеет зависимости в нескольких других пакетах, вроде компонентов Symfony Валидатор и Безопасность, а также Doctrine ORM. На самом деле, Flex установил 5 рецептов!

Но, как обычно, мы можем сразу же начать использовать новую библиотеку. Хотите создать богатый API для таблицы product? Создайте сущность 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
25
26
27
28
29
30
31
// src/Entity/Product.php
// ...

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="string")
     */
    private $price;

    // ...
}

Готово! У вас теперь есть конечные точки для перечисления, добавления, обновления и удаления продуктов! Не верите мне? Перечислите ваши маршруты, выполнив:

1
$ php bin/console debug:router
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
------------------------------ -------- -------------------------------------
 Имя                            Метод    Путь
------------------------------ -------- -------------------------------------
 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}
 ...
------------------------------ -------- -------------------------------------

Легко удаляйте рецепты

Всё ещё не убеждены? Не проблема: удалите библиотеку:

1
$ composer remove api

Flex удалит рецепты: удаление файлов и отмена изменений для возвращения вашего приложения обратно в исходное состояние. Экспериментируйте без боязни.

Больше функций, архитектуры и скорости

Я надеюсь, что вы так же рады по поводу Flex, как и я! Но у на всё ещё есть одна глава и она будет самой важной из всех. Я хочу показать вам, как Symfony предоставляет вам возможность, чтобы быстро строить функции не жертвуя качеством кода или производительностью. Всё дело в сервис контейнере, и это супер-сила Symfony. Читайте дальше о The Architecture.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.