使用Laravel Blade中的@push和@stack根据用户

时间:2017-01-19 16:40:41

标签: php laravel blade

我的网站有大约6个不同的角色,有很多路线,它们都是这样的:

admin.student.create coordinator.student.create

有些用户几乎可以做其他人可以做的事情,但有一些差异,我想避免在我的视图中复制/粘贴大量的代码,如下所示:

@if (Auth::user()->role->name == "SuperAdmin")
 <a href="{{route('admin.group.create')}}">New Group</a>
@elseif (Auth::user()->role->name == "AcademicAdmin")
 <a href="{{route('academic.group.create')}}">New Group</a>
@endif

我想做的是这样的事情:

<a href="{{route('@stack('users').group.create')}}">New Group</a>

和我的users.blade.php视图

 @push
  @if (Auth::user()->role->name == "SuperAdmin")
   admin
  @elseif (Auth::user()->role->name == "AcademicAdmin")
   academic
  @endif

但它没有用。

1 个答案:

答案 0 :(得分:0)

我建议您创建一个简化视图的服务:

@inject('routeGenerator', 'App\Services\RouteGeneratorService')


<!-- your html -->
<a href="{{ $routeGenerator->make('group.create', auth()->user()) }}">New Group</a>

就像那样,您可以制作复杂的代码来生成路线并保持视图简单。

服务示例(服务只是基本PHP类的一个奇特名称):

<?php

namespace App\Services;

use App\User;

class RouteGeneratorService
{
    public function __construct()
    {
        // Inject dependencies here if needed
    }

    public function make(string $route, User $user) : string
    {
        $type = $this->getUserType($user);

        return route("$type.$route");
    }

    public function getUserType(User $user) : string
    {
        switch ($user->role->name) {
            case 'SuperAdmin':
                return 'admin';
            case 'AcademicAdmin':
                return 'academic';
                // and so on..
        }
    }
}