首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Yii2中为无法访问web的文件夹设置别名

问如何在Yii2中为无法访问web的文件夹设置别名
EN

Stack Overflow用户
提问于 2019-07-19 19:04:34
回答 2查看 880关注 0票数 0

您好,我在我的Yii2 basic应用程序中创建了一个模块。我需要一个路径来在我的视图中显示图像,但是我不能得到正确的路径。我的可通过web访问的目录位于C:/xampp/htdocs/basic中,仅包含Yii2条目脚本和已发布资源文件夹。我的所有应用程序文件都位于一个不可通过web访问的目录C:/xampp/htdocs/gbia中,该目录与我的Yii2条目脚本和已发布资源所在的文件夹处于同一目录级别(或者某些人可能会将其称为“同级目录”)。

我在我的模型中创建了一个上传路径参数,它被控制器中的方法调用。

在研究之后,我在不同的场合尝试了这些方法:

代码语言:javascript
复制
Yii::$app->params['uploadUrl'] = Yii::$app->urlManager->baseUrl . '/uploads/batam/';
Yii::$app->params['uploadUrl'] = Yii::$app->request->baseUrl  . '/uploads/batam/';
Yii::$app->params['uploadUrl'] = Yii::getAlias('@web').'/uploads/batam/';

还有Url::base(),Url::base(true),但是他们都没有返回我的baseUrl。它们只回显/uploads/batam/,没有基URL,就好像基URL返回NULL一样。

最后,我尝试回显Yii::$app->homeUrl;,它返回/

我还在学习,据我所知,@web指的是我们的index.php入口脚本所在的目录,如果我错了,请纠正我。所以我试图通过在我的配置中创建一个新的别名来解决这个问题:

代码语言:javascript
复制
'aliases'=>[
'@batam'=> Yii::$app->getAlias('@webroot') . '/../gbia/uploads/batam',
],

我也尝试过使用getAlias('@web'),但都返回了这个错误:Uncaught Error: Call to a member function getAlias() on null

我也在我的别名中尝试过:

代码语言:javascript
复制
'@batam'=> Yii::$app->basePath.'/../gbia/uploads/batam',

但也失败了。有人能帮上忙吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2019-07-20 09:19:20

别名@webroot和@web在配置文件中不可用。原因是应用程序在需要配置文件后运行,别名是在yii\web\Application的bootstrap()中设置的。查看您的入口脚本文件web\index.php,如果您使用的是基本应用程序,则应如下所示

代码语言:javascript
复制
<?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();

您可以看到,在初始化应用程序之前需要配置文件,因此尚未设置的别名@webroot和@web是不可访问的。

因此,您需要做的是设置要在配置文件中使用的别名,为此,您可以执行以下操作

  • 创建一个名为config/aliases.php.

的文件

  • 在文件中设置所需的别名。Yii::setAlias('@webroot',dirname(dirname(__DIR__)).'/web');

  • 需要config/web.php文件之前的入口脚本index.php中的上述文件,现在您可以访问配置文件中的别名,您的入口脚本现在应类似于

代码语言:javascript
复制
<?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';
require __DIR__ . '/../config/aliases.php';
$config = require __DIR__ . '/../config/web.php';

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

更新

为了将图像上传到文档根目录之外,我建议您在webroot中创建一个符号链接,该符号链接将指向文档根目录外的文件夹,并将您的别名指向该符号链接,这样您就可以将图像保存在文档根目录之外,而不必经历所有这些。

票数 1
EN

Stack Overflow用户

发布于 2019-07-19 21:48:06

您需要在bootstrap.php文件中注册它

代码语言:javascript
复制
Yii::setAlias('@webroot', dirname(dirname(__DIR__)) . '/path/to/webroot');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57111156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档