Yii2。路径别名无效

时间:2017-12-21 12:36:37

标签: yii2

我见过类似的问题,但没有找到可行的解决方案。这是我的index.php文件:

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

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

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

(new yii\web\Application($config))->run();

require(__DIR__ . '/../config/aliases.php');

如您所见,它需要config/aliases.php文件,其内容为:

<?php

Yii::setAlias('message_files_root', '@webroot/message_files');
Yii::setAlias('message_files', '@web/message_files');

调用Yii::getAlias('@message_files_root')index.php内正常工作,但当它在控制器文件中时,会显示Invalid path alias: @message_files_root

这是我的控制器的动作(其余代码已完全注释):

public function actionIndex()
{
    var_dump(Yii::getAlias('@message_files_root'));

    $message = new Message();

2 个答案:

答案 0 :(得分:0)

如果从控制器调用Yii :: getAlias()静态方法,则Yii :: setAlias(@web)尚未注册。 你可以参考网络/索引文件。

网/ index.php的

require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php'); --> Yii::setAlias(@web) are not listed here
require(__DIR__ . '/../config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../../common/config/main.php'),
    require(__DIR__ . '/../../common/config/main-local.php'),
    require(__DIR__ . '/../config/main.php'),
    require(__DIR__ . '/../config/main-local.php')
);

$application = new yii\web\Application($config);
//var_dump(Yii::getAlias('@web'));die; --> imitate invoke @web alias fail
$application->run(); --> here both @web alias and aliases from $config got registered.
//var_dump(Yii::getAlias('@web'));die; --> imitate invoke @web alias success

我的猜测是,在默认的@web别名被注册之前,配置首先被注册。这就是为什么从bootrap配置调用@web别名失败的原因。 因此,你需要使用绝对路径作为第二个参数。用这个..

yii2高级模板

Yii::setAlias('@message_files_root', dirname(dirname(__DIR__)) . '/frontend/web/message_files');

yii2基本模板

Yii::setAlias('@message_files_root', dirname(__DIR__) . '/web/message_files');

答案 1 :(得分:0)

我并不是说这是最好的方法,但它的工作方式我希望它能够工作 - 当别名可以包含其他别名时。

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

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

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

$app = new class($config) extends yii\web\Application
{
    protected function bootstrap()
    {
        parent::bootstrap();

        require(__DIR__ . '/../config/aliases.php');
    }
};

$app->run();