Несколько месяцев назад вышла альфа версия Composer плагина Symfony Flex. С выпуском Symfony 3.3 стало возможным протестировать работу данного плагина и «попробовать на вкус» подход к построению приложений на Symfony 4. Что мы сейчас и попробуем сделать.
В предыдущем посте я писал про структуру приложения Symfony 4 и некоторых особенностях, поэтому сейчас заострять внимание на этом не буду. Для того, чтобы процесс установки прошел гладко, рекомендую пользователям Windows использовать GitBash или Cygwin терминал. Вообще-то вы можете использовать любой терминал, главное чтобы в окружении была доступна утилита make и установленные linux-tools. Так же вам понадобится PHP версии ^7.1.3
Несколько слов о самом плагине. Symfony Flex берет на себя заботу по настройке компонент, устанавливаемых в ваше приложение с помощью Composer. Это не обязательно должны быть компоненты Symfony. Плагин работает с рецептами. Если рецепт для пакета определен в репозитории, то Symfony Flex сделает свою работу, в противном случае вам придется как и раньше настроить все руками.
На данный момент существует два репозитория рецептов, главный (или официальный) и публичный. Главный репозиторий отличается тем, что может определять алиасы для пакетов и размещение рецепта в этот репозиторий должно быть одобрено core-team Symfony. В публичном репозитории более мягкие правила для размещения.
Первым делом установим Symfony Flex:
С этого момента плагин контролирует процесс установки пакетов в ваше приложение. Чтобы получить простое «Hello World» приложение установим symfony/framework-bundle. Мы уже можем воспользоваться «магией» Symfony Flex плагина и использовать удобный алиас для этого:
Теперь давайте посмотрим на структуру каталогов:
В каталоге /etc, теперь находится вся конфигурация и файл bundles.php, который содержит массив всех бандлов установленных в вашем проекте. Этот файл модифицируется плагином Symfony Flex, каждый раз когда вы устанавливаете или удаляете бандл. Если вы хотите использовать локальный бандл, вам придется самостоятельно прописать его в этот файл.
Для конфигурации контейнера предусмотрен файл container.yaml, для роутинга routing.yaml. Так же в /etc вы увидите каталог packages, в котором хранятся минимальные конфигурации по умолчанию для всех компонентов. По сути эти конфигурации копируются из рецептов.
В каталоге /src, располагается класс Kernel, переработанный под новую структуру каталогов. Так же здесь есть пустой каталог Controller.
В папке /web теперь только index.php для всех видов окружения. Если посмотреть содержимое этого файла, можно заметить, что для имитации присутствия переменных окружения используется компонент symfony/dotenv. Этот компонент поставляется по умолчанию с symfony 3.3. В режиме разработки он позволяет определять переменные окружения в файле .env
Давайте установим этот компонент:
Теоретически мы установили минимальный набор компонентов необходимых для запуска приложения. Но есть один нюанс. По умолчанию рецепты поставляются с конфигурацией в YAML. И поэтому даже если собственные конфигурации вы хотите писать в другом формате, вам все равно придется установить компонент symfony/yaml, чтобы конфигурации всех компонентов могли быть загружены. В противном случае вам придется переписывать все конфиги в каталоге /etc/packages в нужный вам формат каждый раз когда вы добавляете новый компонент.
Давайте установим symfony/yaml:
Почти все готово. Осталось немного «поколдовать» над файлом composer.json. Первое, что нужно сделать это прописать секцию psr-4, для автозагрузки наших классов. Так как весь код у нас лежит теперь прямо в /src, добавим:
Обратите внимание на следующую секцию в composer.json:
В эту секцию плагин Symfony Flex, добавляет необходимые вызовы команд для каждого компонента. Данные вызовы прописаны в рецептах. При текущей конфигурации, секция «auto-scripts» не будет исполнена плагином. Для того, чтобы это исправить нужно добавить вот такие параметры:
Этот шаблон позволяет плагину Symfony Flex включиться в процесс при наступлении событий «post-install» и «post-update» композера.
Теперь попросим Composer пересобрать класс автозагрузки:
Самое время добавить контроллер. Создадим в папке /src/Controller класс TestController:
Теперь нужно прописать маршрут в файле /etc/routing.yaml:
Запускаем веб-сервер с помощью make:
Переходим в браузере по 127.0.0.1:8000 и видим наше сообщение «It works!».
Минимальное приложение собрано и запущено, но хочется использовать аннотации для определения маршрутов. Без проблем! Для этого нам потребуется sensio/framework-extra-bundle и symfony/annotations-pack, для последнего предусмотрен удобный алиас annot.
Теперь закомментируем маршрут в файле routing.yaml, который определили до этого и вместо него укажем где лежат наши классы контроллеров для парсера аннотаций:
Изменим наш контроллер, добавив аннотацию для маршрута (не забудьте так же добавить use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route):
Переходим по 127.0.0.1:8000/test и видим наше сообщение. Если нам больше не нужно использовать аннотации, то мы можем удалить компоненты:
Останется только вернуть настройки роутинга в routing.yaml, и все будет работать. Плагин Symfony Flex позаботится о том, чтобы удалить за собой весь мусор, а так же убрать из конфигурации бандл sensio/framework-extra-bundle.
Вот таким образом можно уже сейчас экспериментировать с приложениями в стиле Symfony 4.
По правде говоря, вы можете воспользоваться уже готовым composer.json файлом для установки такого приложения «из коробки»:
Я описал процесс ручной сборки проекта, чтобы акцентировать внимание на некоторых деталях.
Исходники проекта можно посмотреть тут.
Спасибо за внимание.
В предыдущем посте я писал про структуру приложения Symfony 4 и некоторых особенностях, поэтому сейчас заострять внимание на этом не буду. Для того, чтобы процесс установки прошел гладко, рекомендую пользователям Windows использовать GitBash или Cygwin терминал. Вообще-то вы можете использовать любой терминал, главное чтобы в окружении была доступна утилита make и установленные linux-tools. Так же вам понадобится PHP версии ^7.1.3
Symfony Flex
Несколько слов о самом плагине. Symfony Flex берет на себя заботу по настройке компонент, устанавливаемых в ваше приложение с помощью Composer. Это не обязательно должны быть компоненты Symfony. Плагин работает с рецептами. Если рецепт для пакета определен в репозитории, то Symfony Flex сделает свою работу, в противном случае вам придется как и раньше настроить все руками.
На данный момент существует два репозитория рецептов, главный (или официальный) и публичный. Главный репозиторий отличается тем, что может определять алиасы для пакетов и размещение рецепта в этот репозиторий должно быть одобрено core-team Symfony. В публичном репозитории более мягкие правила для размещения.
Установка плагина
Первым делом установим Symfony Flex:
composer require symfony/flex
С этого момента плагин контролирует процесс установки пакетов в ваше приложение. Чтобы получить простое «Hello World» приложение установим symfony/framework-bundle. Мы уже можем воспользоваться «магией» Symfony Flex плагина и использовать удобный алиас для этого:
composer req frameworkbundle
Теперь давайте посмотрим на структуру каталогов:
/etc /src /vendor /web .env .env.dist .gitignore composer.json composer.lock Makefile
В каталоге /etc, теперь находится вся конфигурация и файл bundles.php, который содержит массив всех бандлов установленных в вашем проекте. Этот файл модифицируется плагином Symfony Flex, каждый раз когда вы устанавливаете или удаляете бандл. Если вы хотите использовать локальный бандл, вам придется самостоятельно прописать его в этот файл.
Для конфигурации контейнера предусмотрен файл container.yaml, для роутинга routing.yaml. Так же в /etc вы увидите каталог packages, в котором хранятся минимальные конфигурации по умолчанию для всех компонентов. По сути эти конфигурации копируются из рецептов.
В каталоге /src, располагается класс Kernel, переработанный под новую структуру каталогов. Так же здесь есть пустой каталог Controller.
В папке /web теперь только index.php для всех видов окружения. Если посмотреть содержимое этого файла, можно заметить, что для имитации присутствия переменных окружения используется компонент symfony/dotenv. Этот компонент поставляется по умолчанию с symfony 3.3. В режиме разработки он позволяет определять переменные окружения в файле .env
Давайте установим этот компонент:
composer req symfony/dotenv
Теоретически мы установили минимальный набор компонентов необходимых для запуска приложения. Но есть один нюанс. По умолчанию рецепты поставляются с конфигурацией в YAML. И поэтому даже если собственные конфигурации вы хотите писать в другом формате, вам все равно придется установить компонент symfony/yaml, чтобы конфигурации всех компонентов могли быть загружены. В противном случае вам придется переписывать все конфиги в каталоге /etc/packages в нужный вам формат каждый раз когда вы добавляете новый компонент.
Давайте установим symfony/yaml:
composer req symfony/yaml
Почти все готово. Осталось немного «поколдовать» над файлом composer.json. Первое, что нужно сделать это прописать секцию psr-4, для автозагрузки наших классов. Так как весь код у нас лежит теперь прямо в /src, добавим:
{ "autoload": { "psr-4": { "App\\": "src/" } } }
Обратите внимание на следующую секцию в composer.json:
{ "scripts": { "auto-scripts": { "make cache-warmup": "script", "assets:install --symlink --relative %WEB_DIR%": "symfony-cmd" } } }
В эту секцию плагин Symfony Flex, добавляет необходимые вызовы команд для каждого компонента. Данные вызовы прописаны в рецептах. При текущей конфигурации, секция «auto-scripts» не будет исполнена плагином. Для того, чтобы это исправить нужно добавить вот такие параметры:
"post-install-cmd": [ "@auto-scripts" ], "post-update-cmd": [ "@auto-scripts" ]
Этот шаблон позволяет плагину Symfony Flex включиться в процесс при наступлении событий «post-install» и «post-update» композера.
Финальный вид composer.json
{ "require": { "symfony/flex": "^1.0", "symfony/framework-bundle": "^3.3", "symfony/dotenv": "^3.3", "symfony/yaml": "^3.3" }, "autoload": { "psr-4": { "App\\": "src/" } }, "scripts": { "auto-scripts": { "make cache-warmup": "script", "assets:install --symlink --relative %WEB_DIR%": "symfony-cmd" }, "post-install-cmd": [ "@auto-scripts" ], "post-update-cmd": [ "@auto-scripts" ] } }
Теперь попросим Composer пересобрать класс автозагрузки:
composer dump-autoload
Самое время добавить контроллер. Создадим в папке /src/Controller класс TestController:
namespace App\Controller; use Symfony\Component\HttpFoundation\Response; class TestController { public function test() { return new Response('It works!'); } }
Теперь нужно прописать маршрут в файле /etc/routing.yaml:
index: path: / defaults: {_controller: 'App\Controller\TestController::test'}
Запускаем веб-сервер с помощью make:
make serve
Переходим в браузере по 127.0.0.1:8000 и видим наше сообщение «It works!».
Минимальное приложение собрано и запущено, но хочется использовать аннотации для определения маршрутов. Без проблем! Для этого нам потребуется sensio/framework-extra-bundle и symfony/annotations-pack, для последнего предусмотрен удобный алиас annot.
composer req sensio/framework-extra-bundle composer req annot
Теперь закомментируем маршрут в файле routing.yaml, который определили до этого и вместо него укажем где лежат наши классы контроллеров для парсера аннотаций:
controllers: resource: ../src/Controller/ type: annotation
Изменим наш контроллер, добавив аннотацию для маршрута (не забудьте так же добавить use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route):
namespace App\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Component\HttpFoundation\Response; class TestController { /** * @return Response * @Route("/test", name="test") */ public function test() { return new Response('It works!'); } }
Переходим по 127.0.0.1:8000/test и видим наше сообщение. Если нам больше не нужно использовать аннотации, то мы можем удалить компоненты:
composer rem annot composer rem sensio/framework-extra-bundle
Останется только вернуть настройки роутинга в routing.yaml, и все будет работать. Плагин Symfony Flex позаботится о том, чтобы удалить за собой весь мусор, а так же убрать из конфигурации бандл sensio/framework-extra-bundle.
Вот таким образом можно уже сейчас экспериментировать с приложениями в стиле Symfony 4.
По правде говоря, вы можете воспользоваться уже готовым composer.json файлом для установки такого приложения «из коробки»:
composer create-project "symfony/skeleton:^3.3" demo
Я описал процесс ручной сборки проекта, чтобы акцентировать внимание на некоторых деталях.
Исходники проекта можно посмотреть тут.
Спасибо за внимание.
