【发布时间】:2015-10-23 21:13:23
【问题描述】:
我正在尝试将public 文件夹移动到其他位置。但是,我找不到修改public_path() 变量的地方。现在,'public_path()' 返回了错误的文件夹路径。
在哪里可以设置public_path() 的变量?
【问题讨论】:
我正在尝试将public 文件夹移动到其他位置。但是,我找不到修改public_path() 变量的地方。现在,'public_path()' 返回了错误的文件夹路径。
在哪里可以设置public_path() 的变量?
【问题讨论】:
您可以使用 ioc 容器覆盖公共路径:
完美地为我工作的是在public/index.php 中添加以下三行:
$app->bind('path.public', function() {
return __DIR__;
});
【讨论】:
public_path 引用到默认公共路径。
虽然接受的答案适用于来自 HTTP 的请求,但不适用于 artisan。
如果您需要artisan 知道您的自定义公共路径,您需要扩展 Laravel 主应用程序类。我知道这听起来很可怕,但实际上很简单。
您只需执行以下操作:
第 1 步: 在文件中:bootstrap/app.php 更改 $app 变量的第一个声明
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
反映您自己的自定义应用程序类:
$app = new App\Application(
realpath(__DIR__.'/../')
);
第 2 步:在某处定义您的自定义应用程序类。例如app/Application.php
<?php namespace App;
class Application extends \Illuminate\Foundation\Application
{
}
恭喜!你已经扩展了 Laravel 核心 Application 类。
第 3 步: 覆盖 publicPath 方法。将 Laravel 原始方法复制并粘贴到您的新类,然后根据您的需要进行更改。在我的特殊情况下,我确实这样做了:
public function publicPath()
{
return $this->basePath.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'public_html';
}
就是这样!您可以用同样的方式覆盖 Application 类中的任何方法。
【讨论】:
Step 3 ... 我应该在 /bootstrap/app.php 的哪个位置放置该覆盖?
Application 类中,它扩展了 Laravel 核心(步骤 2),因此覆盖了 Laravel 核心 publicPath 方法。
'..'.DIRECTORY_SEPARATOR. 我有这个 return $this->basePath.DIRECTORY_SEPARATOR.'public_html' 用于共享主机。
.. 是 Linux 中父目录的名称,而 . 是当前目录。这意味着,我有 public_html 目录从 basePath 上一级,而不是在它里面。
$app->bind('path.public', function() {
return base_path().'/mynewpublic';
});
【讨论】:
建议你添加到app/Providers/AppServiceProvider.php:
public function register()
{
$this->app->bind('path.public', function() {
return realpath(base_path().'/../public_html');
});
}
这也会影响artisan。
【讨论】:
在 laravel 5.6 中,这对我有用...将此代码添加到 bootstrap/app.php :
$app->bind('path.public', function() {
return realpath(__DIR__.'/../');
});
其中 __DIR__.'/../' 是您的公用文件夹的路径
【讨论】:
在我的情况下,在 Laravel 6.0 中工作。
此文件:bootstrap/app.php
......
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__) );
$app->bind('path.public', function() {
return realpath(__DIR__.'/../httpdocs'); });
.....
我更改了public_path()文件夹,这个例子是httpdocs文件夹,你可以放你想要的。
【讨论】:
您是否尝试过更新 filesystems.php
'disks' => [
'public' => [
'driver' => 'local',
'root' => env('PATH_PUBLIC'),
'visibility' => 'public',
'url' => env('SITE_ROOT'),
],
【讨论】: