Laravel 5.x 覆盖特定用户的视图

Laravel 5.x override views for specific users

我正在尝试根据登录用户 theme 覆盖视图。我们有一个themestable,每个用户都有一个theme.

的FK

我的目录结构如下:

- resources
  - themes 
    - my_custom_theme
  - views

我已经创建了自己的 ViewServiceProvider 副本,并且正在扩展原始副本。这工作正常,我正在覆盖 registerViewFinder(),这也工作正常。但是在应用程序周期的这个阶段,auth()->user() 没有设置,所以我无法获得他们的主题。

    /**
     * Register the view finder implementation.
     *
     * @return void
     */
    public function registerViewFinder()
    {
        $this->app->bind('view.finder', function ($app) {

            //dd($app['config']['view.paths']);

            //dd(auth()->user()->theme);

            return new FileViewFinder($app['files'], $app['config']['view.paths']);
        });
    }

我想根据登录用户主题生成一个路径,这样它就可以从这个目录加载。 resources/themes/my_custom_theme.

如果我无权访问此处的用户,预期的处理方式是什么?

非常感谢

我能够通过使用路由中间件覆盖视图来实现这一点。在此之前的任何内容都无法访问 Auth::user().

<?php
namespace App\Http\Middleware;

use Illuminate\View\FileViewFinder;

class SwitchTheme
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, \Closure $next, $guard = null)
    {
        if (auth()->check()) {
            $paths = \Config::get('view.paths');
            $base = resource_path('themes');
            $theme = auth()->user()->theme;

            // add custom view path to the top of the path stack
            array_unshift($paths, "$base/$theme");

            // create a new instance of the Laravel FileViewFinder and set.
            $finder = new FileViewFinder(app()['files'], $paths);
            app()['view']->setFinder($finder);
        }

        return $next($request);
    }
}

我获取现有的视图路径数组,并从数据库中检索用户主题。取消移动新路径,在我的例子中是 resource_path/theme_name.

我找不到重置路径的方法,使用 $finder->addLocation 会将您的主题路径放在堆栈底部,这样它就不会被覆盖。在这种情况下,我需要创建一个新的 FileViewFinder 实例,为其提供新的路径数组,然后覆盖 app()['view'].

上的现有查找器

简单易用,只需一个中间件。

要加载,只需将 \App\Http\Middleware\SwitchTheme::class 添加到 Kernel.php

中的 $middlewareGroups 数组