xdim222
xdim222

Reputation: 463

How to set view file path in laravel?

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

Answers (4)

kavience
kavience

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

cthiele
cthiele

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

Purvesh
Purvesh

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

lukasgeiter
lukasgeiter

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'),

Method 1: Load both directories

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 ;)

Method 2: Change the view page at runtime

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);

Method 3: Use addLocation but without default path

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

Related Questions