Если вы используете Symfony для разработки, то вам хорошо известна команда bin/console, которая позволяет запускать команды, зарегистрированные в вашем приложении. Вы, вероятно, также добавляете свои собственные команды для использования, например. в заданиях cron.

Что меня раздражает, так это то, что в том же сценарии консоли у меня есть доступ к командам, связанным с приложением, (например, добавление нового пользователя) и связанным с инфраструктурой команды (например, запуск миграции доктрины).

Я хотел иметь место, где я буду получать доступ только к тем, которые связаны с приложениями. А сделать это оказалось довольно просто. Вот как это можно сделать:

bin/consoleвнутренне использует Symfony\Bundle\FrameworkBundle\Console\Applicationclass, который (в сотрудничестве с Symfony\Component\Console\Application)обрабатывает всю работу. Нам нужно заменить его нашей реализацией.

Давайте создадим файл src/Console/Application.php со следующим содержимым:

Как видите, в этом и заключается вся магия. Мы вмешиваемся в add(Command $command)метод и отфильтровываем нежелательные команды.В этом случае мы оставляем только те, имена которых начинаются с app пространства имен.

Если вы не хотите основывать это на имени команды, вы можете легко «пометить» свои команды каким-либо интерфейсом и использовать здесь instanceof.

Осталось только скопировать bin/console файл, например. bin/application и измените часть импорта, чтобы использовалась наша реализация.

Итак, в bin/applicationlets измените:

use Symfony\Bundle\FrameworkBundle\Console\Application

в:

use App\Console\Application

И это все! Теперь вы можете запустить bin/application, чтобы увидеть только свои команды: