如何在laravel中设置视图文件路径?

xdi*_*222 4 laravel

我有一个laravel app的目录结构,如下所示:

app/
   admin/
      controllers/
      views/ -> for admin views
   ...
   views/ -> for frontend views
Run Code Online (Sandbox Code Playgroud)

如何在admin中设置控制器的视图路径?我不想使用View::addLocationView::addNamespace因为我可能有相同的视图文件名为admin和frontend,并且不想为每个添加命名空间View::make('namespace::view.file').

我在http://laravel.com/api/4.2/Illuminate/View/View.html中看到有一种setPath方法,但我怎么称呼它?View::setPath引发未定义的方法错误.

luk*_*ter 20

您有两种方法可以实现目标.首先,我们来看看app/config/view.php.这就是定义视图加载的路径的位置.

这是默认值:

'paths' => array(__DIR__.'/../views'),
Run Code Online (Sandbox Code Playgroud)

方法1:加载两个目录

您可以轻松地将管理目录添加到阵列

'paths' => array(
    __DIR__.'/../views',
    __DIR__.'/../admin/views
),
Run Code Online (Sandbox Code Playgroud)

现在最大的缺点是:视图名称必须是唯一的.否则,将首先指定路径中的视图.
由于您不想使用视图命名空间,我想您不需要像这样的语法admin.viewname.你可能更喜欢方法2;)

方法2:在运行时更改视图页面

可以使用该Config::set方法在运行时更改每个Laravel配置.

Config::set('view.paths', array(__DIR__.'/../admin/views'));
Run Code Online (Sandbox Code Playgroud)

显然设置配置不会改变任何东西,因为它在应用程序引导时被加载并在之后被忽略.

要在运行时更改路径,您必须创建一个新的实例FileViewFinder.
这是这样的:

$finder = new \Illuminate\View\FileViewFinder(app()['files'], array(app_path().'/admin/views'));
View::setFinder($finder);
Run Code Online (Sandbox Code Playgroud)

方法3:使用addLocation但没有默认路径

您还可以删除默认路径 app/config/view.php

'paths' => array(),
Run Code Online (Sandbox Code Playgroud)

然后View::addLocation在任何情况下使用(前端和管理员)

View::addLocation(app_path().'/views');
View::addLocation(app_path().'/admin/views');
Run Code Online (Sandbox Code Playgroud)


小智 6

在最新版本 6 中,我这样做:

View::getFinder()
     ->setPaths([
           base_path('themes/frontend/views'), 
           base_path('themes/admin/views')]
     )
Run Code Online (Sandbox Code Playgroud)