如何在Laravel的Blade中有条件地包含视图?

4
我将尝试根据定义要渲染的视图时设置的变量来包含一些视图。 这是我渲染视图时的情况:
switch (Auth::user()->role) {
      case 'ADMINISTRADOR':
        return View::make('admin');
        break;

      case 'CAPTURISTA':
        return View::make('capturista');
        break;

      case 'GERENTE DE DEPARTAMENTO':
        return View::make('gerente');
        break;

      case 'SUPERVISOR DE COMPRAS':
        return View::make('supervisor', array('supervisor'=>true));
        break;

      case 'GERENTE ADMINISTRATIVO':
        return View::make('administrativo');
        break;
    }

我尝试了很多方法来加载一些视图,但仅当supervisor为真时才加载(最终是否根据我的代码设置而定)。

我尝试过的方法

@if(isset($supervisor))
  @include('includes.boss.supervisor.delivers_modal')
  @include('includes.boss.supervisor.prices_modal')
  @include('includes.boss.supervisor.providers_modal')
@endif

@if({{isset($supervisor)}})
  @include('includes.boss.supervisor.delivers_modal')
  @include('includes.boss.supervisor.prices_modal')
  @include('includes.boss.supervisor.providers_modal')
@endif

<?php if(isset($message)) : ?>
    @section('message')
        <p>hey all</p>
    @endsection
<?php endif; ?>

我曾尝试为每个视图设置supervisor变量,分别将其设为false和true。

  @if($supervisor)
          @include('includes.boss.supervisor.delivers_modal')
          @include('includes.boss.supervisor.prices_modal')
          @include('includes.boss.supervisor.providers_modal')
  @endif

这些方法都没效果,我该怎么做才能实现呢?

* 以防万一,我正在使用会话(sessions)...


https://github.com/romanbican/roles - Peter
1
你可以将所有的代码放在一个Blade文件中,并通过if条件语句进行分离,例如:@if($user->role == Admin) show this @elseif($user->role == xxx) show this @endif。如果你的角色包含特定的Blade代码,你也可以使用它们,例如:@roleadmin show this @endrole - mafortis
2个回答

8

自Laravel 5.4起,您可以使用@includeWhen。根据文档的描述:

Including Sub-Views

If you would like to @include a view depending on a given boolean condition, you may use the @includeWhen directive:

@includeWhen($boolean, 'view.name', ['some' => 'data'])

1
为什么不为每个视图创建一个路由,而不是显示特定的视图,然后根据用户角色,将其重定向到其中一个页面?
switch (Auth::user()->role) {
   case 'ADMINISTRADOR':
     return redirect('administrador');

   case 'CAPTURISTA':
     return redirect('capturista');
...

然后在 routes.php 文件中:
Route::get('administrador', function() {
   return view('admin');
   // for L4:  View::make('admin');
});

//and one more for each role...

如果您使用的是Laravel 4,您需要使用Redirect facade,例如:Redirect::to(..);
在您的routes.php文件中,您需要为每个视图创建一个路由。您可以过滤这些路由以确保用户具有尝试访问的角色。更多关于Laravel 4.2过滤器的信息,请参见此处http://laravel.com/docs/4.2/routing#route-filters和此处http://laravel.com/docs/4.2/controllers#controller-filters 对于Laravel 5,请使用middlware检查用户是否具有权限:http://laravel.com/docs/5.0/middleware

谢谢你的回答,说实话,这是一个愚蠢的错误导致它失败了。你能否在每个点上都附上代码来扩展你的答案,以便对其他人有价值? - diegoaguilar
我认为路由和重定向开关已经足够了。你有什么更多的想法可以添加吗? - hfingler
答案现在有L5代码,为L4用户添加了注释。 - hfingler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接