Если вы используете Symfony для разработки, то вам хорошо известна команда bin/console
, которая позволяет запускать команды, зарегистрированные в вашем приложении. Вы, вероятно, также добавляете свои собственные команды для использования, например. в заданиях cron.
Что меня раздражает, так это то, что в том же сценарии консоли у меня есть доступ к командам, связанным с приложением, (например, добавление нового пользователя) и связанным с инфраструктурой команды (например, запуск миграции доктрины).
Я хотел иметь место, где я буду получать доступ только к тем, которые связаны с приложениями. А сделать это оказалось довольно просто. Вот как это можно сделать:
bin/console
внутренне использует Symfony\Bundle\FrameworkBundle\Console\Application
class, который (в сотрудничестве с Symfony\Component\Console\Application
)обрабатывает всю работу. Нам нужно заменить его нашей реализацией.
Давайте создадим файл src/Console/Application.php
со следующим содержимым:
Как видите, в этом и заключается вся магия. Мы вмешиваемся в add(Command $command)
метод и отфильтровываем нежелательные команды.В этом случае мы оставляем только те, имена которых начинаются с app
пространства имен.
Если вы не хотите основывать это на имени команды, вы можете легко «пометить» свои команды каким-либо интерфейсом и использовать здесь
instanceof
.
Осталось только скопировать bin/console
файл, например. bin/application
и измените часть импорта, чтобы использовалась наша реализация.
Итак, в bin/application
lets измените:
use Symfony\Bundle\FrameworkBundle\Console\Application
в:
use App\Console\Application
И это все! Теперь вы можете запустить bin/application
, чтобы увидеть только свои команды: