Flex: Cкомпонуйте ваш додаток

Дата оновлення перекладу 2022-12-15

Flex: Cкомпонуйте ваш додаток

Після прочитання першої частини цього туторіалу ви вирішили, що 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://flex.symfony.com.

Що зробив цей рецепт? На додаток до автоматичного підключення функції в config/bundles.php, він додав 3 речі:

config/packages/twig.yaml
Файл конфігурації, який встановлює Twig з розумними налаштуваннями за замовчуванням.
config/packages/test/twig.yaml
Файл конфігурації, який змінює деякі опції Twig при проведенні тестів.
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
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,
+        ]);
       }
  }

Розширивши 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.

Profiler: Рай налагодження

Одна з найкрутіших функцій Symfony ще навіть не встановлена! Давайте це виправимо:

1
$ composer require profiler

Так! Це ще один псевдонім! І Flex також встановлює другий рецепт, який автоматизує конфігурацію Symfony Profiler. Який результат? Оновіть!

Бачите цю чорну панель знизу? Це панель інструментів веб-налагодження, і це ваш новий кращий друг. Якщо ви наведете курсор на кожну іконку, ви зможете отримати інформацію про те, який контролер було виконано, інформацію про продуктивність, успіхи та невдачі кешування та багато іншого. Натисніть на будь-яку іконку, щоб зайти в профілювальник, де ви зможете отримати ще більш деталізовані дані про налагодження та продуктивність!

Крім того, по мірі установки нових бібліотек, ви отримуватимете більше інструментів (наприклад, іконку панелі інструментів веб-налагодження, яка відображає запити бази даних).

Тепер ви можете напряму використовувати профілювальник, так як він сконфігурував себе сам завдяки рецепту. Що ще ми можемо встановити?

Багата підтримка API

Ви створюєте API? Ви можете вже легко повернути JSON з будь-якого контролера:

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\Bundle\FrameworkBundle\Controller\AbstractController;
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',
        ]);
    }
}

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

1
$ composer require api

Це псевдонім api-platform/api-pack пакету Symfony , який має залежності в декількох інших пакетах, на кшталт Symfony Validator і Security, а також 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
<?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;

    // ...
}

Готово! У вас тепер є кінцеві точки для перерахування, додавання, оновлення та видалення продуктів! Не вірите мені? Перерахуйте ваші маршрути, виконавши:

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. Читайте далі про Архітектура.