Я создал консольную команду в console/controllers
с помощью SuggestionController
.
Если я запускаю команду, например, php yii suggestions
, ее работа.
Я хочу знать, как выполнять консольную команду из сети без каких-либо расширений yii2
.
Это можно сделать гораздо проще
$oldApp = \Yii::$app; new \yii\console\Application([ 'id' => 'Command runner', 'basePath' => '@app', 'components' => [ 'db' => $oldApp->db, ], ); \Yii::$app->runAction('migrate/up', ['migrationPath' => '@yii/rbac/migrations/', 'interactive' => false]); \Yii:$app = $oldApp;
Github LINK
Вы можете выполнить команду exec()
своей команде '' 'php yii предложения' '', но это может привести к возникновению проблем с правами пользователя веб-сервера.
Лучше всего использовать расширение ConsoleRunner, например yii2-console-runner или yii2-console-runner-extension, которые делают задание управления заданиями немного более сложным и более безопасным с помощью popen()
.
Всегда будьте в курсе инъекций кода при выполнении exec()
и тому подобное!
Это способ, которым я нашел и использовал некоторое время назад для запуска контроллера / действия yii console (я использовал это для запуска миграции из Интернета).
В действии вашего веб-контроллера:
// default console commands outputs to STDOUT // so this needs to be declared for wep app if (! defined('STDOUT')) { define('STDOUT', fopen('/tmp/stdout', 'w')); } $consoleController = new \yii\console\controllers\SuggestionController; $consoleController->runAction('your action eg. index'); /** * open the STDOUT output file for reading * * @var $message collects the resulting messages of the migrate command to be displayed in a view */ $handle = fopen('/tmp/stdout', 'r'); $message = ''; while (($buffer = fgets($handle, 4096)) !== false) { $message .= $buffer . "\n"; } fclose($handle); return $message;
Я думаю, что это самое простое решение:
$controller = new SuggestionController(Yii::$app->controller->id, Yii::$app); $controller->actionSuggestions();
Начиная с версии Yii2 – 2.0.11.2 – это работает
Сначала давайте проверим правильность контроллера и пространства имен. В этом случае приложение frontend, использующее метод импорта консольного приложения ()
В консоли \ контроллеры \ FhirController
Установите псевдоним, который будет доступен в консоли \ config \ main.php [ДОПОЛНИТЕЛЬНО]
'aliases' => [ '@common' => dirname(__DIR__), '@frontend' => dirname(dirname(__DIR__)) . '/frontend', '@backend' => dirname(dirname(__DIR__)) . '/backend', '@console' => dirname(dirname(__DIR__)) . '/console', ],
Наконец, с внешнего вида, сделайте вызов следующим образом: В этом случае, вызывая маршрут контроллера fhir, тогда import import ()
$consoleController = new console\controllers\FhirController('fhir', Yii::$app); $consoleController->runAction('import');