Запуск консоли из браузера

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
gbushmakin
Сообщения: 31
Зарегистрирован: 2019.06.20, 12:38

Запуск консоли из браузера

Сообщение gbushmakin »

Есть необходимость тестировать консольные программы из браузера. Advanced приложение

Создал файл /console.php из директории frontend рядом с входным index.php. Содержание кода:

Код: Выделить всё

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);

require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');

$config = require(__DIR__ . '/../../console/config/main.php');

// ЗДЕСЬ!!! Вставленный нами код
if( isset($_GET['r']) and !empty($_GET['r'])){
    $_SERVER['argv'] =  [
        '~/home/g/testtest/testtest.beget.tech/yii',
        $_GET['r']
    ];
    $_SERVER['argc'] = 2;
}

$application = new yii\console\Application($config);
$exitCode = $application->run();
exit($exitCode);
Запускаю по такой ссылке - http://testtest.beget.tech/console.php?r=hello/index В итоге получаю такую ошибку. Не могу понять в чём проблема.

Код: Выделить всё

An Error occurred while handling another error:
yii\base\InvalidArgumentException: Invalid path alias: @console/controllers in /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/BaseYii.php:154
Stack trace:
#0 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/base/Module.php(257): yii\BaseYii::getAlias('@console/contro...')
#1 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/controllers/HelpController.php(245): yii\base\Module->getControllerPath()
#2 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/controllers/HelpController.php(172): yii\console\controllers\HelpController->getModuleCommands(Object(yii\console\Application))
#3 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/UnknownCommandException.php(77): yii\console\controllers\HelpController->getCommands()
#4 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/ErrorHandler.php(35): yii\console\UnknownCommandException->getSuggestedAlternatives()
#5 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/base/ErrorHandler.php(123): yii\console\ErrorHandler->renderException(Object(yii\console\UnknownCommandException))
#6 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\console\UnknownCommandException))
#7 {main}
Previous exception:
yii\base\InvalidRouteException: Unable to resolve the request "hello/index". in /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/base/Module.php:537
Stack trace:
#0 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/Application.php(180): yii\base\Module->runAction('hello/index', Array)
#1 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/Application.php(147): yii\console\Application->runAction('hello/index', Array)
#2 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/base/Application.php(386): yii\console\Application->handleRequest(Object(yii\console\Request))
#3 /home/g/testtest/testtest.beget.tech/frontend/web/console.php(19): yii\base\Application->run()
#4 {main}

Next yii\console\UnknownCommandException: Unknown command "hello/index". in /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/Application.php:183
Stack trace:
#0 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/Application.php(147): yii\console\Application->runAction('hello/index', Array)
#1 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/base/Application.php(386): yii\console\Application->handleRequest(Object(yii\console\Request))
#2 /home/g/testtest/testtest.beget.tech/frontend/web/console.php(19): yii\base\Application->run()
#3 {main}
gbushmakin
Сообщения: 31
Зарегистрирован: 2019.06.20, 12:38

Re: Запуск консоли из браузера

Сообщение gbushmakin »

Проблема решилась установкой алиаса,

Код: Выделить всё

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);

require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');

Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console');

$config = require(__DIR__ . '/../../console/config/main.php');


// ЗДЕСЬ!!! Вставленный нами код
if( isset($_GET['r']) and !empty($_GET['r'])){
    $_SERVER['argv'] =  [
        '~/home/g/testtest/testtest.beget.tech/yii',
        $_GET['r']
    ];
    $_SERVER['argc'] = 2;
}

$application = new yii\console\Application($config);
$exitCode = $application->run();
exit($exitCode);
НО. Появилась проблема номер 2 - почему то модели никак не обнаруживаются через файл console.php, хотя через саму консоль все скрипты с моделями работают. Пример консольного файла и самой модели

Код: Выделить всё

<?php

namespace console\controllers;
use frontend\models\City;
use yii\console\Controller;

class HelloController extends Controller
{

    public function actionIndex($message = 'hello world')
    {

        $data = City::find();

        echo $message . "\n";
    }
}
Модель:

Код: Выделить всё

<?php

namespace frontend\models;

use Yii;

class City extends \yii\db\ActiveRecord
{

    public static function tableName()
    {
        return 'city';
    }

    public function rules()
    {
        return [
            [['Population'], 'integer'],
            [['Name'], 'string', 'max' => 35],
            [['CountryCode'], 'string', 'max' => 3],
            [['District'], 'string', 'max' => 20],
            [['CountryCode'], 'exist', 'skipOnError' => true, 'targetClass' => Country::className(), 'targetAttribute' => ['CountryCode' => 'Code']],
        ];
    }

    public function attributeLabels()
    {
        return [
            'ID' => 'ID',
            'Name' => 'Name',
            'CountryCode' => 'Country Code',
            'District' => 'District',
            'Population' => 'Population',
        ];
    }

    public function getCountryCode()
    {
        return $this->hasOne(Country::className(), ['Code' => 'CountryCode']);
    }
}
Ошибки:

Код: Выделить всё

Exception 'Error' with message 'Class 'frontend\models\City' not found' in /home/g/testtest/testtest.beget.tech/console/controllers/HelloController.php:13 Stack trace: 
#0 [internal function]: console\controllers\HelloController->actionIndex('hello world') 
#1 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array) 
#2 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/base/Controller.php(157): yii\base\InlineAction->runWithParams(Array) 
#3 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/Controller.php(164): yii\base\Controller->runAction('index', Array) 
#4 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/base/Module.php(528): yii\console\Controller->runAction('index', Array) 
#5 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/Application.php(180): yii\base\Module->runAction('hello/index', Array) 
#6 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/console/Application.php(147): yii\console\Application->runAction('hello/index', Array) 
#7 /home/g/testtest/testtest.beget.tech/vendor/yiisoft/yii2/base/Application.php(386): yii\console\Application->handleRequest(Object(yii\console\Request)) 
#8 /home/g/testtest/testtest.beget.tech/frontend/web/console.php(23): yii\base\Application->run() 
#9 {main}
Пробовал так же модели из common или из console - все так же. По всей видимости файл console.php не обнаруживает модели. Но что исправить или добавить чтобы начали обнаруживаться? Бьюсь уже 2 дня :cry:
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Запуск консоли из браузера

Сообщение skynin »

-- Бьюсь уже 2 дня
Вероятно в console/config/main.php не прописаны алиас frontend

Как и Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console'); надо в main, а не "индексный файл"

или в bootstrap common

Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Ответить