在 Laravel Blade 中使用 @push 和 @stack 根据用户更改路由

using @push and @stack in Laravel Blade to change a route based on user

我的站点有大约 6 个不同的角色和大量的路由,它们都是这样的:

admin.student.create coordinator.student.create

一些用户几乎可以做其他人可以做的事情,但有一些不同,我想避免在我看来必须 copy/paste 大量的代码,如下所示:

@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

但是没用。

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

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


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

像这样,您可以编写复杂的代码来生成路线并保持视图简单。

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

<?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..
        }
    }
}