Литий: как получить доступ к действию через командную строку?

Я пытаюсь запустить действие через CLI. Действие UsersController::test()

Итак, я запускаю это: php libraries/lithium/console/lithium.php \\app\\controllers\\UsersController test

Но я продолжаю сталкиваться с этой ошибкой: PHP Fatal error: Call to undefined method lithium\console\Request::get() in /var/www/example.com/libraries/lithium/action/Controller.php on line 154

Что я делаю не так?


person Housni    schedule 05.02.2013    source источник


Ответы (1)


Для справки см. http://li3.me/docs/lithium/console.

Насколько я знаю, вызывать контроллеры напрямую из командной строки нельзя. Хотя судя по вашей ошибке, он пытается что-то сделать.

Вместо этого создайте класс, унаследованный от \lithium\console\Command, и поместите его в namespace app\extensions\command. Например, назовите этот класс Users. Внутри этого класса создайте метод с именем test(), который будет запускаться при вызове вашей команды через cli.

Теперь, когда вы запускаете li3 (или lithic.php), он должен вывести все доступные команды, и вы должны увидеть свою в списке. Вы бы вызвали li3 users test, и это должно запустить его, если вы добавили lithium/console/li3 в свой путь к корзине. Или вы можете вызвать php -f path/to/lithium.php -- users test, что должно сделать то же самое. Если вы пропустили test, он будет искать метод с именем run() в вашем классе app\extensions\console\Users и вызывать его.

Потенциально вы могли бы создать экземпляр вашего контроллера и вызвать метод test(), но, как вы видели, класс Request, доступный при запуске из веб-браузера, отличается от класса Request при запуске из командной строки. Вероятно, было бы лучше взять бизнес-логику в методе вашего контроллера и переместить ее в другой класс, а затем передать параметры запроса из вашего контроллера в этот метод. Затем из класса консольных команд вы аналогичным образом вызвали бы тот же централизованный метод.

person rmarscher    schedule 06.02.2013
comment
Это верно. Веб-системы и системы командной строки разделены и имеют два разных Request класса. Предложенное здесь решение также является правильным. - person Nate Abele; 06.02.2013
comment
Блестяще, спасибо! Это гораздо лучшее решение, чем я имел в виду. - person Housni; 06.02.2013