Add Public to asset path in Laravel
For the latest version of Laravel - Laravel 5.8, there is a key in config/app.php with name asset_url. The value of this key determines the value that the asset() method returns. Normally, you should set the value of this key to the base url of your website if all your asset folders are in the default location (this default location is the public folder under the root directory of your Laravel installation).
For example if your website url is "https://www.example.com" and you want to access the asset path public/assets/css/sample.css under the root folder, set the asset_url in config/app.php like this:
'asset_url' => env('ASSET_URL', 'https://www.example.com'),
and use the asset function like this:
asset('assets/css/sample.css')
Thereafter, reconfigure your cache by running this within your laravel installation folder:
php artisan config:cache
This will update the bootstrap/cache/config.php file. If you check your browser, the generated url for your asset would be "https://www.example.com/assets/css/sample.css".
One way you can have a valid url like: "https://www.example.com/public/assets/css/sample.css" is by creating another folder named public inside your already existing public folder - which is non-intuitive for me. However, if you do this, then you have to include this path when using the asset function:
asset('public/assets/css/sample.css')
Before Laravel 5.7.14
Take a look at Illuminate\Routing\UrlGenerator
class and its asset($path, $secure = null)
method. This class is being put to container by url
key. What you can do is:
- Add your own class, extending
UrlGenerator
; - Add
asset($path, $secure = null)
method to your own class, making it return whatever you need; - Create a service provider and register it in
config/app.php
; - In your service provider's
register()
method, bind your new classto the container byurl
key.
This way, you don't touch core files at all and your Laravel application is still update friendly.
Update for Laravel 5.7.14 and later
As other answers state, there is the ASSET_URL
.env option, which makes it much easier to change the public path. Laravel introduced it in Laravel 5.7.14, which was released about 3 years after my original answer.