【问题标题】:How to set alias for a non web-acessible folder in Yii2如何在 Yii2 中为不可访问网络的文件夹设置别名
【发布时间】:2019-07-19 11:04:34
【问题描述】:

您好,我在 Yii2 基本应用程序中制作了一个模块。我需要一条路径来在我的视图中显示图像,但我无法找到正确的路径。我的网络可访问目录位于C:/xampp/htdocs/basic,仅包含 Yii2 入口脚本和已发布资产文件夹。我所有的应用程序文件都位于一个不可通过网络访问的目录C:/xampp/htdocs/gbia,该目录与我的 Yii2 入口脚本和已发布资产所在的文件夹位于同一目录级别(或者有些人可能称之为“同级目录”)。

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

经过研究,我在不同的场合尝试了这些:

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 入口脚本所在的目录,如果我错了,请纠正我。所以我试图通过在我的配置中创建一个新别名来解决这个问题:

'aliases'=>[
'@batam'=> Yii::$app->getAlias('@webroot') . '/../gbia/uploads/batam',
],

也尝试使用getAlias('@web'),但他们都返回此错误:Uncaught Error: Call to a member function getAlias() on null

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

'@batam'=> Yii::$app->basePath.'/../gbia/uploads/batam',

但也失败了。任何人都可以帮忙吗?谢谢!

【问题讨论】:

  • Yii::$app->getAlias('@webroot') 应该是Yii::getAlias('@webroot')
  • @MuhammadOmerAslam 我收到了这个错误:Fatal error: Uncaught yii\base\InvalidArgumentException: Invalid path alias: @webroot in C:\xampp\htdocs\gbia\vendor\yiisoft\yii2\BaseYii.php:154 Stack trace: #0 C:\xampp\htdocs\gbia\config\web.php(21): yii\BaseYii::getAlias('@webroot') #1 C:\xampp\htdocs\basic\index.php(10): require('C:\\xampp\\htdocs...') #2 {main} thrown in C:\xampp\htdocs\gbia\vendor\yiisoft\yii2\BaseYii.php on line 154
  • webroot 路径创建@batam 别名是否正确,而不是使用/,,/ 向上一个目录,而不是像我尝试的那样转到不可Web 访问的目录gbia做什么?
  • 添加了一个答案看看是否有帮助

标签: php yii2


【解决方案1】:

别名 @webroot@web 在配置文件中不可用。原因是应用程序在需要配置文件后运行,并且在yii\web\Applicationbootstrap() 中设置了别名。查看您的入口脚本文件web\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();

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

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

  • 创建一个名为 config/aliases.php 的文件。

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

  • config/web.php 文件之前需要在入口脚本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';
require __DIR__ . '/../config/aliases.php';
$config = require __DIR__ . '/../config/web.php';

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

更新

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

【讨论】:

  • 我按照您所说的进行了路径调整:Yii::setAlias('@webroot',dirname(dirname(__DIR__)); 没有web,因为我删除了文件夹。我回显了我的@webroot,它显示了C:/xampp/htdocs/basic,因为我在http.conf 中设置了我的文档根目录。但是当我在网络配置'@batam'=&gt; Yii::getAlias('@webroot') . '/../gbia/uploads/batam/', 中设置我的别名时,它回显了:/../batam/sitebatam 是我的模块名称,顺便说一句)我正在尝试将别名设置为非网络可访问目录C:/xampp/htdocs/gbia/uploads/batam/,其中我的图像已存储
  • 我尝试了另一种方法,在我的参数中使用 yii2 预定义路径 @app 来上传路径:Yii::$app-&gt;params['uploadUrl2'] =Yii::getAlias('@app'). '/uploads/batam/'; 因为@app 指向我不可访问的目录,但我在控制台中遇到错误:@ 987654347@ 这条路对我来说似乎没问题,但我不知道出了什么问题。这就是我在视图中显示图像的方式:echo Html::img($model-&gt;getImageUrl(), [ 'class'=&gt;'thing','height'=&gt;'auto', 'width'=&gt;'100%', 'max-width'=&gt;'1080px']);
  • 这是我的$model-&gt;getImageUrl() 所做的,只是return Yii::$app-&gt;params['uploadUrl2'] . $image;
  • 我以前从未使用过符号链接,我应该将 symlink() 放在 webroot 的哪个位置?它在我的 Yii 输入脚本index.php 中吗?这是使用它的正确方法吗:symlink ( __DIR__ . '/gbia', $uploadLink ) 其中gbia 是与我的 webroot 位于同一目录级别的文件夹(在 webroot 之外但在同一级别)然后我在配置中创建此别名:@alias =&gt; readlink($uploadLink) . '/uploads/batam/' 其中uploads/batam 是我要保存上传文件的文件夹路径。 readlink($uploadLink) 这里将指向我的 webroot 之外的文件夹。这是正确的吗?
  • 符号链接应该在您的web 目录中,并且应该指向根目录之外的目录@codejunkie
【解决方案2】:

需要在 bootstrap.php 文件中注册

Yii::setAlias('@webroot', dirname(dirname(__DIR__)) . '/path/to/webroot');

【讨论】:

  • 您好,感谢您的回复。我认为@webroot 是一个预定义的别名,它指向 Yii2 入口脚本,因此不再需要设置/注册?我正在尝试通过从@webroot 定义它来制作@batam 别名(它定义了我的非web 可访问目录的路径),然后从那里我进入一个目录,然后访问我的非webgbia 目录跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2015-10-02
  • 2013-08-17
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多