我正在尝试将public
文件夹移动到其他位置。但是,我找不到修改public_path()
变量的地方。现在,'public_path()'返回错误的文件夹路径。
我在哪里可以为public_path()
设置变量?
答案 0 :(得分:43)
虽然接受的答案适用于来自HTTP的请求,但它不适用于artisan
。
如果您需要artisan
知道自定义公共路径,则需要扩展Laravel主要的Application类。我知道这听起来很吓人,但实际上非常简单。
您需要做的就是:
第1步:在文件中:bootstrap/app.php
更改$app
变量的第一个声明
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
反映您自己的自定义Application类:
$app = new App\Application(
realpath(__DIR__.'/../')
);
第2步:在某处定义自定义Application类。例如,在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类中的任何方法。
答案 1 :(得分:42)
您可以使用ioc容器覆盖公共路径:
对我来说完美无缺的是在public/index.php
增加了以下三行:
$app->bind('path.public', function() {
return __DIR__;
});
答案 2 :(得分:11)
我建议你将其添加到app/Providers/AppServiceProvider.php
:
public function register()
{
$this->app->bind('path.public', function() {
return realpath(base_path().'/../public_html');
});
}
这也会影响artisan
。
答案 3 :(得分:4)
在laravel 5.6中,此功能对我有用...将此代码添加到bootstrap / app.php中:
$app->bind('path.public', function() {
return realpath(__DIR__.'/../');
});
其中 __ DIR __。'/ .. /'是您的公用文件夹的路径
答案 4 :(得分:1)
$app->bind('path.public', function() {
return base_path().'/mynewpublic';
});
答案 5 :(得分:1)
以我在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 文件夹一起使用,您可以随意放置它。
答案 6 :(得分:0)
您是否尝试过更新filesystems.php
'disks' => [
'public' => [
'driver' => 'local',
'root' => env('PATH_PUBLIC'),
'visibility' => 'public',
'url' => env('SITE_ROOT'),
],