30 ноября 2017 года была выпущена новая версия фреймворка Symfony. Похоже, основная команда решила использовать порядок нумерации «Звездных войн», так как 4 версия намного лучше трех предыдущих. Теперь они кажутся приквелами.
В этой статье я попытаюсь рассказать обо всех важных изменениях, внесенных в 4 версию. Если вы знакомы с Symfony 3 и хотите познакомиться с новой версией, то данная статья для вас!
Введение
Внутри Symfony 4 представляет собой просто Symfony 3.4 с удаленными устаревшими функциями.
Однако снаружи присутствует крупный рывок вперед. Большинство изменений (начиная с процесса установки, структуры директориев, сделанные с помощью связок, до самого программирования) были сделаны для улучшения впечатлений разработчиков от применения платформы. Symfony может быть использована для создания веб-приложений так же легко, как для создания других фреймворков поверх них. Такая система обязана быть сложной. Как Symfony доказывает в новой версии, эта сложность может быть «скрыта» от глаз разработчиков.
Прежде всего помните, что для Symfony 4 требуется PHP 7.1.3 или выше (Это отличные новости!), так что убедитесь, что ваша среда обновлена!
Установка Symfony
composer create-project symfony/skeleton PROJECT_NAME
Jerzy Zawadzki (отзыв из твиттера) - Мне очень нравится, как за эти годы изменилась страница установки Symfony: из zip-установки, создания компоновщика «standard-edition», установщика Symfony (удобный, но необязательный инструмент) к самому простому варианту – «symfony/skeleton».
Symfony 4 оставляет позади прежние методы установки, но я не буду говорить, что это революция. Если вы внимательно следите за развитием Symfony, вы можете заметить, каким образом она система добралась до текущей версии.
Когда был выпущен Symfony 2, это была простая загрузка zip. Позже, когда Symfony стал использовать компоновщика, установка изменилась на: composer create-project symfony/symfony-standard-edition PROJECT_NAME
. Эта команда доставляла немного проблем:
- Пакет стандартной версии был огромен, так что компоновщик тратил много времени на разрешение всех зависимостей;
- Новые разработчики плохо понимали, что такое стандартная версия и есть ли другие версии, а если да, то где;
- Стандартная версия имела встроенную демонстрацию. Для того чтобы начать новый проект, требовалось удалить несколько файлов примеров.
В 2015 году было объявлено о выходе нового установщика Symfony. Он исправил проблему с синхронизацией, поскольку он загружал zip-файл вместо того, чтобы помещать его в компоновщик. Также была исправлена проблема с демонстрацией, так как установщик имеет встроенную команду separate symfony demo
для новичков. Тем не менее, это был еще один дополнительный инструмент, который требовалось установить заранее.
Итак, Symfony 4 представил новый способ установки при помощи пакета symfony/skeleton:
composer create-project symfony/skeleton PROJECT_NAME
Чем это отличается от такой команды содержащая symfony/symfony-standard-edition
?
В первом варианте, по сути, нет ничего - только файл composer.json с 5 зависимостями:
"symfony/console": "4.1",
"symfony/flex": "1.0",
"symfony/framework-bundle": "4.1",
"symfony/lts": "4@dev",
"symfony/yaml": "4.1"
Результатом установки, которых является 21 пакет:
Это только те пакеты, которые нужны для запуска фреймворка. Это значит:
- Никакого объектно-реляционного отображения, которое используется по умолчанию;
- Никакого шаблонизатора, установленного по умолчанию;
- Никаких компонентов, которые нужны не для каждого проекта: например, формы, безопасность.
Почему? Потому что построение лучше наследования! Не каждый проект нуждается в базе данных, не в каждом проекте нужны шаблоны (например, API)! Из-за этого вендор, который используется по умолчанию, уменьшился в размерах на 70%!
Да! Symfony 4 - это микрофреймворк.
Кстати, если вам понравилось микроядро Symfony 3, оно есть и в 4 версии.
Но мне нужен шаблонизатор!
Да, да, нам всем нужен Twig. В таком случае используется команда:
composer require twig
После этого у вас будет готовый для работы Twig. Вам не нужно будет ничего настраивать (объявлять пути, включать наборы и т. д.). Symfony Flex автоматически сделает все за вас. Это плагин-компоновщик, который управляет приложениями Symfony. Он доступен не только для Twig, но и для любых других компонентов Symfony или для внешних наборов!
Symfony Flex
В апреле Фабиан Потенсье написал:
Забавный факт: компоновщик начался с разговора о том, как общим способом устанавливать наборы/плагины/расширения для Symfony и phpBB.
Странный факт: ни Symfony, ни phpBB не использует компоновщик для установки наборов/плагинов/расширений.
Да, установка расширений иногда казалась проблематичной. Нужно было тратить много времени на работу с файлами readme.md
: сначала регистрировать набор в классе AppKernel
, добавлять конфигурацию к и без того большому файлу config.yml
, запускать несколько команд и т. д. Теперь всем этим занимается за вас Symfony Flex.
Как? Каждая установка набора следует «рецепту», который определяется в репозиториях Symfony Flex Recipes.
https://github.com/symfony/recipes;
https://github.com/symfony/recipes-contrib.
Давайте рассмотрим рецепт для популярного EasyAdminBundle от Javier Eguiluz:
Что делает этот рецепт? Он говорит Flex:
- Зарегистрировать набор во всех средах («prod», «dev», «test»);
- Скопировать файлы из рецепта в директорий конфигурации (каждый набор получает собственный файл config.yaml!);
- Если кто-то вызовет composer require admin, то будет установлен конкретный набор.
Последний момент по-настоящему важен. Выше вы можете видеть, что есть 2 репозитория с рецептами: symfony/recipies
и symfony/recipies-contrib
. Первый поддерживается Symfony Core Team и содержит только рецепты для компонентов Symfony и наборы, «выбранные» ими. Итак, если кому-то нужно расширение, которое делает панель администратора, то, по мнению Symfony Core Team, человек должен установить EasyAdminBundle. Именно для этого и нужны дополнительные имена. Этот параметр недоступен в репозитории symfony/recipies-contrib
, который предназначен для рецептов, созданных сообществом.
Но что если набор, который я хочу использовать, не имеет рецепта? Без проблем, Flex все равно сможет зарегистрировать его автоматически в пакете bundles.php
. Однако в таком случае вам все равно придется настраивать его самостоятельно. Если это так, вам стоит сделать PR для набора на symfony/recipies-contrib
, чтобы его можно было автоматизировать в будущем.
Все рецепты (как официальные, так и нет) можно найти на официальном сайте.
Важные пакеты Symfony
Здесь можно найти список компонентов Symfony, которые ранее входили в установку по умолчанию, а теперь их нужно устанавливать отдельно.
Ниже можно увидеть список наиболее полезных и важных, по моему мнению, пакетов:
- debug, который установит DebugBundle;
- profiler для Web Profiler Toolbar;
- log для MonologBundle;
- web-server, если вы хотите, чтобы команды server:start и server:stop были встроены в сервере;
- orm, если вам нужен Doctrine;
- twig для любимого шаблонизатора;
- mailer для SwiftMailer.
Структура проекта Symfony
В этом аспекте тоже многое поменялось. Все это, как и ранее, было сделано для упрощения системы. Наиболее важные изменения (по сравнению с 3.х версиями):
- Больше нет директория app/: теперь директорием высшего уровня является config/ (с config/packages и файлами настроек для наборов);
- AppKernel.php перенесен в src/Kernel.php;
- Наборы больше не определяются прямо в файле Kernel; это делается в отдельном файле config/bundles.php;
- Директорий web/ теперь называется public/;
- Мы прощаемся с app.php и app_dev.php. Теперь это один стандартный файл index.php, а среда задается переменной среды APP_ENV;
- При установке шаблонов Twig они хранятся не в app/Resources/views, а в templates/.
Прощай, AppBundle!
Да! В Symfony 4 больше нет ни одного набора в src/
. Все файлы теперь просто живут в директории src/
(по умолчанию они имеют ключевое слово App/
). Это влияет на 2 вещи:
- Вы не можете (по умолчанию) разделить свое приложение на наборы (хотя это, кстати, все равно плохая идея: разделять приложение стоит, но не на наборы);
- Механизмы наследования наборов устарели в 3.4 и были удалены в 4.
MakerBundle
В Symfony 2 и 3 по умолчанию устанавливался SensioGeneratorBundle. Он добавлял несколько полезных команд для консоли генератора.
В Symfony 4 это заменено MakerBundle, причем функции были расширены. Чтобы установить пакет, нужно просто выполнить команду:
composer require maker
Вы получите доступ к следующим генераторам:
make:auth Creates an empty Guard authenticator
make:command Creates a new console command class
make:controller Creates a new controller class
make:entity Creates a new Doctrine entity class
make:form Creates a new form class
make:functional-test Creates a new functional test class
make:serializer:encoder Creates a new serializer encoder class
make:subscriber Creates a new event subscriber class
make:twig-extension Creates a new Twig extension class
make:unit-test Creates a new unit test class
make:validator Creates a new validator and constraintclass
make:voter Creates a new security voter class
Вывод
Надеюсь, я смог доказать, что Symfony 4 - все тот же старый добрый фреймворк с новым оформлением и функциями, которые облегчают жизнь разработчикам. Теперь вы готовы создать свой новый проект в Symfony 4?