我见过类似的问题,但没有找到可行的解决方案。这是我的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();
答案 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();