Laravel 5 change public_path()
Solution 1:
You can override the public path using ioc container :
What worked for me flawlessly was adding to public/index.php
the following three lines:
$app->bind('path.public', function() {
return __DIR__;
});
For more detailed explanation click here
Solution 2:
While accepted answer works for requests coming from HTTP, it will not work for artisan
.
If you need artisan
to know your custom public path, you need to extend Laravel main Application class. I know it sounds scary, but it's actually very simple.
All you need to do is following:
Step 1: In the file: bootstrap/app.php
change the very first declaration of $app
variable
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
to reflect your own custom Application class:
$app = new App\Application(
realpath(__DIR__.'/../')
);
Step 2: Define your custom Application class somewhere. For example in app/Application.php
<?php namespace App;
class Application extends \Illuminate\Foundation\Application
{
}
Congrats! You have extended Laravel core Application class.
Step 3: Overwrite the publicPath
method. Copy and paste Laravel original method to your new class and change it to your needs. In my particular case I did like this:
public function publicPath()
{
return $this->basePath.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'public_html';
}
That's it! You can overwrite any method in Application class the same way.
Solution 3:
I suggest you add it in app/Providers/AppServiceProvider.php
:
public function register()
{
$this->app->bind('path.public', function() {
return realpath(base_path().'/../public_html');
});
}
This affects artisan
as well.
Solution 4:
In laravel 5.6 this work for me ... adding this code to bootstrap/app.php :
$app->bind('path.public', function() {
return realpath(__DIR__.'/../');
});
where __DIR__.'/../' is path to your public folder