В очередной раз столкнулся с ошибкой "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 )
теперь можно обращаться к этому алиасу из консольного приложения