Запуск із командного рядка - історично сформованих - (legacy) PHP додатків
Квест →Як хакнути форму
phpcli
Уявіть, що у вас є програми, які працюють вже якийсь час, але є кілька поширених випадків, у яких ви вирішуєте, що потрібний CLI інтерфейс:
- Ви запускаєте різні cron завдання, які виконують HTTP виклики до деякого API для запуску різних завдань на вашому веб-сайті (наприклад, надсилання пошти тощо)
- У вас є деякі операції, які ви хочете автоматизувати (за допомогою chef або чогось подібного), а через HTTP-запит не можна зробити це красиво
- Ви хочете додати команди "супермега користувача" (наприклад, скидання пароля), які можуть бути виконані з командного рядка замість "зламування" бази даних
- Додайте сюди причину.
Так як ми можемо це зробити? особливо не перевинувши все наново?
Уявіть, що у вашому додатку вже є клас, що описує бізнес-логіку, а також у вас є форма, в якій ви можете відредагувати кілька значень, відправити їх на сервер, а вони використовуються в додатку
тепер нам потрібно супроводити конфігураційні значення з командного рядка файлом з описом JSON, приблизно так:
Тобто ми хочемо отримати можливість виконувати приблизно таку команду:
Отже, нам потрібні такі кроки:
- Завантажити JSON-файл у масив
- Викликати Example_Admin_ProcessConfigurationValues::process з цим масивом
- Готово
Symfony Console Component на допомогу
Замість того, щоб винаходити все знову, ми можемо використовувати компоненти Symfony. Я припускаю, що ви вже використовували комп'ютер і у вас єcomposer.json файл, що виглядає якось так:
Тоді ви можете просто скористатися Symfony Console Component для виконання вашої програми з командного рядка. Потрібно тільки додати symfony/console як нову залежність:
І тоді ви зможете створити нову консольну команду як у наступному прикладі:
А тепер цю команду треба зареєструвати. Давайте створимо скрипт cli.php, який буде вхідною точкою з командного рядка і додамо до нього реєстрацію команди.
Тепер, якщо ви запустите cli.php з командного рядка, побачите:
і щоб виконати щойно створену команду, потрібно просто зробити: