Reputation: 463
I have a directory structure for laravel app like this:
app/
admin/
controllers/
views/ -> for admin views
...
views/ -> for frontend views
How can I set the view path for controllers in admin? I don't want to use View::addLocation
or View::addNamespace
because I might have the same view file name for admin and frontend, and don't want to add a namespace for every View::make('namespace::view.file')
.
I see in http://laravel.com/api/4.2/Illuminate/View/View.html there is a setPath
method, but how do I call it? View::setPath
raised undefined method error.
Upvotes: 8
Views: 42692
Reputation: 11
try it like this
View::addNamespace('admin', app_path() . '/admin/views');
Route::group(['prefix' => 'admin'], function() {
Route::get('/', function() {
return view('admin::index');
});
});
Upvotes: 1
Reputation: 23
In Laravel 5.5, other solutions did not work. In boot method of a service provider
View::getFinder()->prependLocation(
resource_path('views') . '/theme'
);
Upvotes: 2
Reputation: 646
In the latest version 6 i am doing it this ways:
View::getFinder()
->setPaths([
base_path('themes/frontend/views'),
base_path('themes/admin/views')]
)
Upvotes: 6
Reputation: 152860
You have two ways to accomplish your goal. First, let's have a look at app/config/view.php
. That's where the path(s) for view loading are defined.
This is the default:
'paths' => array(__DIR__.'/../views'),
You can easily add the admin directory to the array
'paths' => array(
__DIR__.'/../views',
__DIR__.'/../admin/views
),
Now the big disadvantage of this: view names have to be unique. Otherwise the view in the path specified first will be taken.
Since you don't want to use a view namespace I suppose you don't want a syntax like admin.viewname
either. You'll probably like method 2 more ;)
Every Laravel config can be changed at runtime using the Config::set
method.
Config::set('view.paths', array(__DIR__.'/../admin/views'));
Apparently setting the config won't change anything because it is loaded when the application bootstraps and ignored afterwards.
To change the path at runtime you have to create a new instance of the FileViewFinder
.
Here's how that looks like:
$finder = new \Illuminate\View\FileViewFinder(app()['files'], array(app_path().'/admin/views'));
View::setFinder($finder);
You could also remove the default path in app/config/view.php
'paths' => array(),
And then use View::addLocation
in any case (frontend and admin)
View::addLocation(app_path().'/views');
View::addLocation(app_path().'/admin/views');
Upvotes: 30