В декабре 2018-го, на конфиренции Lisbon SymfonyCon Фабиэн Потансье — создетель фреймворка Symfony представил некий symfony.phar — инструмент для быстрого создания Symfony-приложений на основе официальных шаблонов проекта: skeleton, website-skeleton или demo. Также он позволяет запускать локальный веб-сервер для разработки.
Затем инструмент был переписан на языке Golang, что позволило реализовать много дополнительных возможностей таких, как поддержка https протокола для локального веб-сервера, тесная интеграция с SymfonyCloud и прочее! Приглашаю тебя, уважаемый читатель, познакомиться с этим инструментом подробнее, поскольку он работает не только в контексте фреймворка Symfony.
В этой статье мы рассмотрим инструмент, в контексте локальной разработки и не будем затрагивать интеграцию с SymfonyCloud.
Создание проекта
Чтобы создать новый Symfony проект, основанный на одном из официальных шаблонов, нужно запустить команду:
$ symfony new [--full | --demo] <path-to-project>
По умолчанию используется минимальный шаблон skeleton. Чтобы установить website-skeleton нужно запустить команду с опцией --full
. Соответственно, для установки demo проекта необходимо запускать команду с опцией --demo
.
Под капотом symfony new
выполняет команду composer create-project
, затем инициализирует новый Git репозиторий и сразу создаёт Initial commit.
Локальный сервер
Для запуска сервера достаточно в корне приложения запустить команду
$ symfony serve
она проанализирует доступные SAPI на используемой машине и выберет лучший вариант из существующих, пользуясь следующими приоритетами: на первом месте PHP FPM, дальше PHP CGI и в конце PHP CLI. Список доступных SAPI можно посмотреть командой:
$ symfony local:php:list
После этого команда запустит сервер, который будет доступен по адресу 127.0.0.1
и подберёт свободный порт начиная с 8000
.
По умолчанию сервер запускается в интерактивном режиме. Мы сразу видим логи сервера и приложения, но наш терминал заблокирован. Сервер можно запустить в режиме демона. Для этого нужно добавить опцию -d
при запуске команды symfony serve
.
Логи можно будет посмотреть, запустив команду:
$ symfony server:log
также можно посмотреть статус запущеного сервера используя команду:
$ symfony server:status
чтобы остановить запущенный сервер используется команда:
$ symfony server:stop
UPD: Раньше для запуска сервера мы использовали пакет symfony/web-server-bundle. С появлением Symfony CLI этот пакет становится не очень актуальным, так как он умеет только запускать сервер, используя PHP CLI SAPI и не поддерживает HTTPS, доменные имена, PHP FPM SAPI и прочее.
Поддержка TLS
Некоторые сторонние сервисы или библиотеки требуют отправлять запросы, используя HTTPS протокол. Symfony CLI предоставляет возможность очень легко настроить поддержку TLS, установив дополнительные компоненты, с помощью следующей команды:
$ symfony server:ca:install
после чего достаточно перезапустить ваш браузер и вуаля — поддержка TLS настроена! Запускаете сервер командой symfony serve
и можно перейти на сайт по HTTPS протоколу.
Мне не совсем нравится открывать все проекты по адресу https://127.0.0.1:8000
или https://localhost:8000
, а вам? Это приносит свои неудобства: если запущено несколько проектов одновременно — нужно запоминать на каком порту какой проект работает; при перезапуске сервера порты могут меняться и т.п.
Symfony CLI решает и этот вопрос! Он предоставляет для нас proxy-сервер, с помощью которого можно создавать красивые доменные имена. Для этого нужно привязать к нашему проекту желаемое домменое имя с помощью команды:
$ symfony proxy:domain:attach <domain-name>
таким образом домен demo-project.com
привязался к директории с проектом. Далее нам нужно запустить proxy-сервер командой:
$ symfony proxy:start
Мы запустили proxy-сервер в режиме демона и он доступен у нас по адресу http://127.0.0.1:7080
, можем открыть его в браузере:
где увидим список доменов, пути к проектам в файловой системе и статус сервера для каждого проекта. На данном скриншоте видно то, что все сервера находятся в статусе Stopped
, то есть они пока не запущены. Следующим шагом нам нужно добавить этот proxy-сервер в настройки ОС
На этом настройка proxy-сервера заканчивается, далее нужно запустить сервер уже известной нам командой symfony serve
. Помимо IP-адреса с портом мы увидим наше доменное имя, по которому можем перейти в браузере! Ко всем доменным именам добавляется постфикс .wip.
То есть в случае использования proxy-сервера flow запуска проекта немного меняется:
- Запускаем proxy-сервер
$ symfony proxy:start
- Запускаем сервер для приложения
$ symfony serve
Для завершения работы с проектом "зеркалируем" действия, описанные выше:
- Останавливаем сервер
$ symfony server:stop
- Останавливаем proxy-сервер
$ symfony proxy:stop
Для упрощения данных операций рекоммендую использовать утилиту GNU Make.
Переключение версий PHP
Если вы используете разные версии PHP на разных проектах, вы наверняка сталкивались с проблемой переключения между версиями. Было бы здорово иметь какой-то автоматический инструмент для этого, не так ли? Symfony CLI умеет решать и эту проблему! Вам достаточно создать файл .php-version
в корне проекта и в качестве содержимого указать желаемую версию.
$ echo "7.2" > .php-version
Как видно на скриншоте выше, Symfony CLI прочитал файл .php-version и запустил сервер, используя версию, указанную в этом файле.
Так же Symfony CLI предоставляет нам обёртку над PHP CLI, которая тоже учитывает версию PHP, указанную в файле .php-version. То есть если вам нужно вызывать консольные скрипты, например bin/console
— используйте её.
$ symfony php
Для удобства можно создать алиас для этой команды, чтобы сэкономить время и избежать ошибок в написании команды. К примеру, я создал для себя алиас sphp:
$ echo "alias sphp='symfony php'" >> ~/.bash_profile && source ~/.bash_profile
Symfony CLI предоставляет аналогичную обёртку для Composer, поэтому с ним у вас также не возникнет никаких проблем. Для удобства можно создать алиас и для этой обёртки. У меня это scomposer:
$ echo "alias scomposer='symfony composer'" >> ~/.bash_profile && source ~/.bash_profile
Проверка на уязвимые пакеты
В качестве бонуса Symfony CLI предоставляет команду для проверки на наличие уязвимых composer-пакетов в вашем проекте. Больше не прийдётся устанавливать в проект зависимость Symfony Security Checker. Так же официальная документация говорит о том, что версия встроенная в Symfony CLI работает оптимальнее за счёт того, что она не делает HTTP запросы на официальный API. Запустить проверку можно командой:
$ symfony security:check
Заключение
Symfony CLI — это довольно-таки удобный компонент локальной инфраструктуры приложения. У него есть возможность запускать веб-сервер с поддержкой HTTPS протокола, создавать доменные имена, автоматизировать переключение версии PHP для каждого проекта, проверять зависимости на наличие уязвимостей.
Официальную документацию компонента можно найти по этой ссылке.
Любые вопросы и проблемы можно описывать в официальном репозитории symfony/cli на GitHub.
Делитесь вашим опытом работы с данным инструментом в комментариях.
Спасибо за внимание!