Запуск із командного рядка - історично сформованих - (legacy) PHP додатків

Квест →Як хакнути форму

phpcli

Уявіть, що у вас є програми, які працюють вже якийсь час, але є кілька поширених випадків, у яких ви вирішуєте, що потрібний CLI інтерфейс:

  • Ви запускаєте різні cron завдання, які виконують HTTP виклики до деякого API для запуску різних завдань на вашому веб-сайті (наприклад, надсилання пошти тощо)
  • У вас є деякі операції, які ви хочете автоматизувати (за допомогою chef або чогось подібного), а через HTTP-запит не можна зробити це красиво
  • Ви хочете додати команди "супермега користувача" (наприклад, скидання пароля), які можуть бути виконані з командного рядка замість "зламування" бази даних
  • Додайте сюди причину.

Так як ми можемо це зробити? особливо не перевинувши все наново?

Уявіть, що у вашому додатку вже є клас, що описує бізнес-логіку, а також у вас є форма, в якій ви можете відредагувати кілька значень, відправити їх на сервер, а вони використовуються в додатку

тепер нам потрібно супроводити конфігураційні значення з командного рядка файлом з описом JSON, приблизно так:

Тобто ми хочемо отримати можливість виконувати приблизно таку команду:

Отже, нам потрібні такі кроки:

  1. Завантажити JSON-файл у масив
  2. Викликати Example_Admin_ProcessConfigurationValues::process з цим масивом
  3. Готово

Symfony Console Component на допомогу

Замість того, щоб винаходити все знову, ми можемо використовувати компоненти Symfony. Я припускаю, що ви вже використовували комп'ютер і у вас єcomposer.json файл, що виглядає якось так:

Тоді ви можете просто скористатися Symfony Console Component для виконання вашої програми з командного рядка. Потрібно тільки додати symfony/console як нову залежність:

І тоді ви зможете створити нову консольну команду як у наступному прикладі:

А тепер цю команду треба зареєструвати. Давайте створимо скрипт cli.php, який буде вхідною точкою з командного рядка і додамо до нього реєстрацію команди.

Тепер, якщо ви запустите cli.php з командного рядка, побачите:

і щоб виконати щойно створену команду, потрібно просто зробити: