X

Yii2 - Invalid path alias: @webroot

В очередной раз столкнулся с ошибкой "Invalid path alias: @webroot" в Yii2. Решил сделать заметку, чтобы было проще гуглить..

Полностью данная ошибка выглядит так:

Exception 'yii\base\InvalidParamException' with message 'Invalid path alias: @webroot'
in /public_html/vendor/yiisoft/yii2/BaseYii.php:154

Чаще всего появляется, когда обращаетесь к алиасу в консольном приложении (в контроллере унаследованном от yii\console\Controller)

<?php
namespace app\commands;

use Yii;
use yii\console\Controller;

class TestController extends Controller
{
    public function actionIndex()
    {
        echo Yii::getAlias('@webroot').PHP_EOL;
    }
}

Возникает из-за того, что для консольного приложения (в отличии от веб), этот алиас не определен.

Посмотреть предопределенные алиасы можно так:

<?php
namespace app\commands;

use Yii;
use yii\console\Controller;

class TestController extends Controller
{
    public function actionIndex()
    {
        print_r(Yii::$aliases);
    }
}

результат будет вот такой

Array
(
    [@yii] => Array
        (
            [@yii/swiftmailer] => /public_html/vendor/yiisoft/yii2-swiftmailer
            [@yii/gii] => /public_html/vendor/yiisoft/yii2-gii
            [@yii/faker] => /public_html/vendor/yiisoft/yii2-faker
            [@yii/debug] => /public_html/vendor/yiisoft/yii2-debug
            [@yii/bootstrap] => /public_html/vendor/yiisoft/yii2-bootstrap
            [@yii] => /public_html/vendor/yiisoft/yii2
        )

    [@app] => /public_html
    [@vendor] => /public_html/vendor
    [@bower] => /public_html/vendor/bower
    [@npm] => /public_html/vendor/npm
    [@runtime] => /public_html/runtime
)

исправить можно добавив нужный алиас в конфигурацию, в файл www/config/console.php

$config = [
    'id' => 'basic-console',
    ...
    'aliases' => [
        '@webroot' => dirname(dirname(__FILE__)) . '/web',
    ],
];

если теперь повторить вывод алиасов, то увидите, что @webroot добавился в конец

Array
(
    [@yii] => Array
        (
            [@yii/swiftmailer] => /public_html/vendor/yiisoft/yii2-swiftmailer
            [@yii/gii] => /public_html/vendor/yiisoft/yii2-gii
            [@yii/faker] => /public_html/vendor/yiisoft/yii2-faker
            [@yii/debug] => /public_html/vendor/yiisoft/yii2-debug
            [@yii/bootstrap] => /public_html/vendor/yiisoft/yii2-bootstrap
            [@yii] => /public_html/vendor/yiisoft/yii2
        )

    [@app] => /public_html
    [@vendor] => /public_html/vendor
    [@bower] => /public_html/vendor/bower
    [@npm] => /public_html/vendor/npm
    [@runtime] => /public_html/runtime
    [@webroot] => /public_html/web
)

теперь можно обращаться к этому алиасу из консольного приложения

Категории: Yii
Тэги: consolewebrootyii2