Руководство по правильному консольному приложению PHP Symfony

Погуглив по этой теме, я смог найти только официальную документацию по Symfony's Console Component и несколько руководств по быстрой сборке, но я хотел бы написать о создании настоящего масштабируемого консольного приложения, которое вы могли бы использовать в реальном производственном проекте. Я объясню причины, по которым мы делаем то или иное.

Мне нравится писать развязанный, многоразовый и как можно более сырой код, поэтому мы постараемся двигаться в этом направлении. Кроме того, мы воспользуемся преимуществами всех новых функций PHP 7. Помните, что это означает, что вам потребуется версия выше 7.1.

По сути, мы будем использовать только контейнер зависимостей и Консольный компонент Symfony и собираем их вместе. Должно быть довольно легко и просто. Лично мне нравится Zend's Service Manager, но вы можете использовать любой контейнер зависимостей, который вам нравится. Попробуйте выбрать компилирующую ПСР-11.

Начнем с инициализации определения композитора и запроса диспетчера служб:

composer init --require zendframework/zend-servicemanager && composer install

Мы также должны потребовать консольный компонент Symfony:

composer require symfony/console

Создадим консольную команду. Ничего особенного, просто стандартная команда Symfony:

Не забудьте автозагрузить свой код в composer.json:

“autoload”: {
    “psr-4”: {
        “App\\”: “src/App/”
    }
}

Следующим шагом будет регистрация этой команды как службы. Мы хотим, чтобы это приложение могло масштабироваться, поэтому важно сохранить чистый контроль внедрения зависимостей.

Для простоты я буду использовать анонимные функции для фабрик, но в реальном проекте я бы использовал подходящие фабричные классы.

Я рекомендую сохранить все ваши команды в виде сервисов, даже если у них не будет зависимостей. Кроме того, мы создадим файл конфигурации, который возвращает все команды для приложения.

Осталось только создать фронт-контроллер. Нам просто нужно создать экземпляр новой консоли и зарегистрировать все наши команды, которые мы загрузим из нашего файла подтверждения и извлечем из нашего контейнера;)

Мы будем использовать файл без расширения:

Вот и все!

Вы должны иметь возможность запустить php application my:command и увидеть My awesome command!, напечатанный в консоли.

Некоторые люди расширили бы класс Symfony Application, но я думаю, что в этом нет необходимости, поскольку этот класс уже предназначен для расширения для этого варианта использования.

Вы можете создавать все необходимые вам команды и сервисы. Просто добавьте созданные вами команды в файл конфигурации. Это предназначено для масштабирования и стандартной компиляции PHP 7.

Я создал репозиторий Github, где вы можете увидеть полностью работающий пример.

Буду рад ответить на любые ваши вопросы.

Надеюсь, это кому-то будет полезно! Ваше здоровье!

Ссылка на эту статью в моем блоге: https://www.agustinhoulgrave.com/articles/2018-02/a-guide-to-a-nice-php-console-application