【问题标题】:How to set view file path in laravel?如何在 laravel 中设置视图文件路径?
【发布时间】:2015-02-12 00:54:07
【问题描述】:

我有一个 laravel 应用程序的目录结构,如下所示:

app/
   admin/
      controllers/
      views/ -> for admin views
   ...
   views/ -> for frontend views

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

我在http://laravel.com/api/4.2/Illuminate/View/View.html 中看到有一个setPath 方法,但是我该如何调用它呢? View::setPath 引发未定义的方法错误。

【问题讨论】:

  • 如果这就是你的意思,也许可以尝试一些符号链接,不知道确切的目标是什么
  • 我的目标是将管理视图和前端视图分开。
  • 然后在标准视图目录中创建“admin”文件夹,不是吗?然后你引用像 admin/mystuff 之类的视图
  • 我想为控制器、视图等设置一个单独的管理目录。我认为这比在每个控制器和视图中都有管理子目录更干净。
  • 你们喜欢复杂的...

标签: laravel


【解决方案1】:

这样试试


View::addNamespace('admin', app_path() . '/admin/views');

Route::group(['prefix' => 'admin'], function() {
  Route::get('/', function() {
    return view('admin::index');
  });
});

【讨论】:

    【解决方案2】:

    在 Laravel 5.5 中,其他解决方案不起作用。在服务提供者的引导方法中

    View::getFinder()->prependLocation(
     resource_path('views') . '/theme'
    );
    

    【讨论】:

      【解决方案3】:

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

      View::getFinder()
           ->setPaths([
                 base_path('themes/frontend/views'), 
                 base_path('themes/admin/views')]
           )
      

      【讨论】:

        【解决方案4】:

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

        这是默认设置:

        'paths' => array(__DIR__.'/../views'),
        

        方法一:加载两个目录

        您可以轻松地将管理目录添加到数组中

        'paths' => array(
            __DIR__.'/../views',
            __DIR__.'/../admin/views
        ),
        

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

        方法二:运行时改变视图页面

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

        Config::set('view.paths', array(__DIR__.'/../admin/views'));
        

        显然设置配置不会改变任何东西,因为它是在应用程序启动时加载并在之后被忽略的。

        要在运行时更改路径,您必须创建 FileViewFinder 的新实例。
        看起来是这样的:

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

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

        您也可以删除app/config/view.php中的默认路径

        'paths' => array(),
        

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

        View::addLocation(app_path().'/views');
        View::addLocation(app_path().'/admin/views');
        

        【讨论】:

        • 感谢您的回复。我认为方法1与View::addLocation相同。我尝试了方法2但它似乎不起作用,我将Config::set放在控制器__construct中,但laravel似乎忽略了这一点(意味着laravel仍然从'原始'路径加载视图文件)。
        • 对不起...当您不测试您在 SO 上发布的内容时会发生这种情况。看看更新的答案。这次我什至测试了它;)
        • 非常感谢您的回答和很好的解释!
        • 我现在打算用方法3,但是我想我以后会考虑用方法2,因为当我有另一个视图目录时,方法3可能会引发另一个问题(虽然可能性较小)在一个模块(前端/管理员)中,无论如何方法2看起来更“正确的方法”来做这个恕我直言:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多