在 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..
}
}
}
我的站点有大约 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..
}
}
}