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

Php 在Laravel Blade中使用@push和@stack根据用户更改路由,php,laravel,blade,Php,Laravel,Blade,我的网站有大约6个不同的角色和大量的路线,它们都是这样的: admin.student.create 协调员。学生。创建 有些用户几乎可以做其他用户可以做的事情,但有一些不同之处,我希望避免在我的视图中复制/粘贴大量代码,如下所示: @if (Auth::user()->role->name == "SuperAdmin") <a href="{{route('admin.group.create')}}">New Group</a> @elseif (Au

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

admin.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

但是它不起作用。

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

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


<!-- your html -->
<a href="{{ $routeGenerator->make('group.create', auth()->user()) }}">New Group</a>
@inject('routeGenerator','App\Services\RouteGeneratorService')
这样,您就可以编写复杂的代码来生成路由,并使视图保持简单

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


哦,好主意!你能举一个小例子说明服务应该做些什么吗?(对laravel来说有点新)-顺便说一句,使用5.2非常感谢!你是我新的个人英雄,非常感谢。再补充一点:正确的html应该是:这样路线将100%工作,非常感谢!哎呀,对不起,我忘了调用route(),我宁愿在服务中调用它,以免每次都在视图中写入它。真的,好主意。另外,如果我想从所有视图(大约100个)调用它,我是否需要向所有视图添加@inject?因为将其添加到基本布局不起作用。您可以使用视图生成器一次在多个视图中注入服务(或任何变量):
 @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

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