Laravel 5.x 覆盖特定用户的视图
Laravel 5.x override views for specific users
我正在尝试根据登录用户 theme
覆盖视图。我们有一个themes
table,每个用户都有一个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
数组
我正在尝试根据登录用户 theme
覆盖视图。我们有一个themes
table,每个用户都有一个theme
.
我的目录结构如下:
- 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
数组