Создайте вашу первую страницу в Symfony

Дата обновления перевода 2023-01-16

Создайте вашу первую страницу в Symfony

Создание новой страницы – не важно, будет это страница HTML или JSON – это простой процесс, состоящий из 2 шагов:

  1. Создайте маршрут: Маршрут – это URL (например, /about) вашей страницы и указание на контроллер;
  2. Создайте контроллер: Контроллер – это РНР функция, написанная вами, которая создаёт страницу. Вы берете входящую информацию запроса, и используете её для создания объекта Symfony Response, который может содержать HTML содержимое, JSON строку, или даже бинарный файл вроде изображения или PDF.

Screencast

Предпочитаете видео-уроки? Посмотрите сериал Восхитительная разработка с Symfony.

See also

Symfony охватывает жизненный цикл HTTP запрос-ответ. Чтобы узнать больше см. Symfony и основы HTTP.

Cоздание страницы: маршрут и контроллер

Tip

Перед тем, как продолжать, убедитесь в том, что вы прочли главу про установку, и можете вызвать приложение Symfony из своего браузера.

Допустим, вы хотите создать страницу /lucky/number, которая будет генерировать счастливое (хорошо, случайное) число и отображать его. Для этого, создайте «класс контроллера» и внутри него метод «контроллера»:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// src/Controller/LuckyController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;

class LuckyController
{
    public function number(): Response
    {
        $number = random_int(0, 100);

        return new Response(
            '<html><body>Lucky number: '.$number.'</body></html>'
        );
    }
}

Теперь вам нужно проассоциировать эту функцию контроллера с публичным URL (например, /lucky/number), чтобы метод number() выполнялся, когда пользователь переходит по ссылке. Эта ассоциация определяется путём создания маршрута в файле config/routes.yaml:

1
2
3
4
5
6
# config/routes.yaml

# имя маршрута "app_lucky_number" пока не важно
app_lucky_number:
    path: /lucky/number
    controller: App\Controller\LuckyController::number

Вот и всё! Если вы используете веб-сервер Symfony, испробуйте его, перейдя по ссылке: http://localhost:8000/lucky/number

Если вы увидите отображенное счастливо число – поздравляем! Однако перед тем, как бежать играть в лотерею, посмотрите, как это работает. Помните два шага по созданию страницы?

  1. Создайте контроллер и метод: Это функция, в которой вы строите страницу и возвращаете объект Response. Вы узнаете больше о контроллерах в разделе о них, включая то, как возвращать ответы JSON.
  2. Создайте маршрут: В config/routes.yaml, маршрут определяет URL к вашей странице (path), и какой controller вызывать. Вы узнаете больше о маршрутизации в разделе о ней, включая то, как cоздавать переменные URL;

Маршруты аннотаций

Вместо того, чтобы определять ваш маршрут на YAML, Symfony также позволяет вам использовать маршруты атрибутов. Атрибуты встраиваются в PHP, начиная с версии PHP 8. В более ранних версиях PHP вы можете использовать аннотации. Чтобы сделать это, установите пакет аннотаций:

1
$ composer require annotations

You can now add your route directly above the controller:

  • Attributes
1
2
3
4
5
6
7
8
9
10
11
12
13
// src/Controller/LuckyController.php

// ...
+ use Symfony\Component\Routing\Annotation\Route;

class LuckyController
{
+   #[Route('/lucky/number')]
    public function number(): Response
    {
        // this looks exactly the same
    }
}

Вот и всё! Страница http://localhost:8000/lucky/number будет работать точно так же, как и раньше! Аннотации являются рекомендоанным способом конфигурации маршрутов.

Автоустановка рецептов с помощью Symfony Flex

Возможно вы не заметили, но когда вы выполнили composer require annotations, произошли две особенные вещи, обе благодаря мощному плагину Composer по имени Flex.

Во-первых, annotations - это не настоящее имя пакета: это дополнительное имя (т.е. ярлык), который Flex разрешает до sensio/framework-extra-bundle.

Во-вторых, после того, как был скачан этот пакет, Flex выполнил рецепт, который является набором автоматических инструкций, которые сообщают Symfony, как интегрировать внешний пакет. Рецепты Flex существуют для многих пакетов (см. symfony.sh) и имеют возможность делать многое, вроде добавления файлов конфигурации, создания каталогов, обновления .gitignore и добавления новой конфигурации в ваш файл .env. Flex автоматизирует установку пакетов, чтобы вы могли вернуться к написанию кода.

Команда bin/console

Ваш проект уже имеет в себе мощный инструмент отладки: команду bin/console. Попробуйте выполнить её:

1
$ php bin/console

Вы должны увидеть список команд, которые могут дать вам информацию об отладке, помочь сгенерировать код, сгенерировать миграции DB и многое другое. Когда вы будете устанавливать больше пакетов, вы будете видеть больше команд.

Чтобы получить список всех маршрутов в вашей системе, используйте команду debug:router:

1
$ php bin/console debug:router

Сейчас вы должны увидеть ваш маршрут app_lucky_number сверху:

1
2
3
4
5
----------------  -------  -------  -----  --------------
Имя               Метод    Схема    Хост   Путь
----------------  -------  -------  -----  --------------
app_lucky_number  ЛЮБОЙ    ЛЮБАЯ    ЛЮБОЙ  /lucky/number
----------------  -------  -------  -----  --------------

Вы также увидите маршруты отладки под app_lucky_number -- больше о маршрутах отладки будет в следующем разделе.

Вы узнаете еще о многих командах дальше!

Tip

Если ваша оболочка поддерживается, вы также можете настроить поддержку заполнения консоли. Это автоматически заполняет команды и другой ввод при использовании bin/console. См. документ Console , чтобы узнать больше о том, как настроить заполнение.

Панель инструментов веб-отладки: отладка мечты

Одной из потрясающих функция Symfony является Web Debug Toolbar (панель инструментов веб-отладки): панели, которая отображает огромное количество информафии отладки внизу вашей страницы при разработке. Это все включено при установке с использованием пакета Symfony под названием symfony/profiler-pack.

Вы увидите темную панель внизу страницы. Вы узнаете больше обо всей информации, которую она содержит, далее, но не бойтесь экспериментировать: наведите курсор и нажимайте на разные иконки, чтобы получить информацию о маршрутизации, производительности, ведению логов и другом.

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

Если вашему контроллеру нужно возвращать HTML, то вы, скорее всего, захотите использовать шаблон. К счастью, в Symfony есть шаблонизатор Twig – простой, многофункциональный и, на самом деле, классный.

Для начала, установите Twig:

1
$ composer require twig

Далее, убедитесь в том, что LuckyController расширяет базовый класс Symfony Controller:

1
2
3
4
5
6
7
8
9
10
// src/Controller/LuckyController.php

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

- class LuckyController
+ class LuckyController extends AbstractController
  {
      // ...
  }

Теперь, используйте удобную функцию render(), чтобы отобразить шаблон. Передайте ей переменную number, чтобы вы могли использовать её в Twig:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// src/Controller/LuckyController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
// ...

class LuckyController extends AbstractController
{
    #[Route('/lucky/number')]
    public function number(): Response
    {
        $number = random_int(0, 100);

        return $this->render('lucky/number.html.twig', [
            'number' => $number,
        ]);
    }
}

Файлы шаблонов живут в каталоге templates/, который был создан для вас автоматически при установке Twig. Создайте новый каталог templates/lucky с новым файлом number.html.twig внутри:

1
2
{# templates/lucky/number.html.twig #}
<h1>Ваше счастливое число - {{ number }}</h1>

Синтаксис {{ number }} используется для отображения переменных в Twig. Обновите ваш брайзер, чтобы получить ваше новое счастливое число!

http://localhost:8000/lucky/number

Теперь вам может быть интересно, куда делась Панель инструментов веб-отладки: она пропала, так как в текущем шаблоне нет тега </body>. Вы можете добавить элемент тела самостоятельно, или расширить base.html.twig, который содержит все элементы HTML по умолчанию.

В статье шаблоны, вы узнаете все о Twig: как проходить по циклу, отображать другие шаблоны и на полную использовать его мощную систему наследования шаблонов.

Проверка структуры проекта

Отличные новости! Вы уже работали внутри самых важных каталогов вашего проекта:

config/
Содержит... конфигурацию, конечно же! Вы будете конфигурировать маршруты, сервисы и пакеты.
src/
Здесь живет весь ваш PHP-код.
templates/
Все ваши шаблоны Twig живут здесь.

Большинство времени, вы будете работать в src/, templates/ или config/. По мере прочтения книги, вы узнаете, что можно делать в каждом из этих мест.

А что насчет других каталогов в проекте?

bin/
Известный файл bin/console живет здесь (и другие, менее важные исполнимые файлы).
var/
Здесь хранятся автоматически созданные файлы, такие как файлы кеша (var/cache/) и логи (var/log/).
vendor/
Здесь находятся сторонние библиотеки (например, «поставщик»)! Они обычно скачиваются с помощью менеджера пакетов Composer.
public/
Это корневой документ вашего проекта: здесь вы размещаете любые ваши публично доступные файлы.

И когда вы будете устанавливать новые пакеты, при необходимости новые каталоги будут созданы автоматически.

Что дальше?

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

Ладно, пора закончить освоение базовых знаний, прочитав следующие статьи:

После этого, узнайте о других важных аспектах вроде сервис-контейнера, системы Form, использовании Doctrine (если вам нужно использовать базу данных) и других!

Повеселитесь!