我正在尝试将
public
文件夹移动到其他位置。但是,我找不到修改 public_path()
变量的地方。现在,“public_path()”返回错误的文件夹路径。
在哪里可以设置
public_path()
的变量?
您可以使用 ioc 容器覆盖公共路径:
对我来说完美的工作是添加到
public/index.php
以下三行:
$app->bind('path.public', function() {
return __DIR__;
});
虽然接受的答案适用于来自 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 核心应用程序类。
第3步:覆盖
publicPath
方法。将 Laravel 原始方法复制并粘贴到您的新类,然后根据您的需要进行更改。在我的具体情况下,我确实是这样的:
public function publicPath()
{
return $this->basePath.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'public_html';
}
就是这样!您可以以同样的方式覆盖 Application 类中的任何方法。
我建议你添加它在
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 文件夹,你可以随意放置。
$app->bind('path.public', function() {
return base_path().'/mynewpublic';
});
您是否尝试过更新 filesystems.php
'disks' => [
'public' => [
'driver' => 'local',
'root' => env('PATH_PUBLIC'),
'visibility' => 'public',
'url' => env('SITE_ROOT'),
],
在 .env 文件更新
FILESYSTEM_DISK=public
在你的函数代码中直接设置路径就像
$path = 'folder_name';
$request->file->move($path, $fileName);
更改配置/filesystems.php
'public' => [
'driver' => 'local',
'root' => public_path() . '/uploads',
'url' => env('APP_URL').'/public',
'visibility' => 'public',
'throw' => false,
],