改进 Laravel 中的 if else 条件

improve if else conditions in Laravel

我有一个 Laravel 项目将在两天后上线。 我在后端和前端有很多问题 运行。我正在努力提高应用程序的速度,因为现场制作中会有更多的用户。 在我的控制器中,我经常使用这段代码。

 public function createCutting()
    {
      if (Auth::user()->admin == 0 && Auth::user()->roles()>first()>pivot->role_id == 7) 
        {

            $type_of_cuts = Type::where('field', 2)->get();
            $type_of_damages = Type::where('field', 3)->get();
            $number_of_boxes = Type::where('field', 4)->get();
            $size_of_boxes = Type::where('field', 5)->get();
            return view('web.cutting.working_orders.create', compact('type_of_cuts', 'type_of_damages', 'number_of_boxes', 'size_of_boxes'));
        } else {
            return redirect()->route('working.orders.index')->with('alert', 'You cannot access this page');
        }

和blade视图是这样的

@if ($admin != 1)
       @if ($role_id == 7)
         <a href="{{ route('cutting.working.orders.create') }}" class="btn btn-label-brand btn-bold">
            <i class="la la-plus"></i> Create Cutting</a>
        @endif
       @if ($role_id == 6)
       <a href="{{ route('packaging.working.orders.create') }}" class="btn btn-label-brand btn-bold">
   <i class="la la-plus"></i> Create Packaging</a>
       @endif
       @endif
@endif

看看代码中的 if 条件,我必须先在控制器中的两个地方使用它,然后在 front-end 上使用它(以在控制器中隐藏此方法的链接)。 有没有更好的方法可以在一个地方使用条件而不是 运行 在应用程序中两次使用相同的查询?也许喜欢使用中间件之类的。 此致,

根据您提供的源代码,与改进 if else 条件无关。 您正在尝试通过根据适当的角色向用户授予权限来实施用户访问控制。

要实施用户访问控制,无论您是在开发小型企业应用程序还是企业级应用程序,都不建议为访问控制创建自己的安全性。这种做法很容易被跨站请求伪造

实施用户访问控制的最佳实践要求:

  1. 身份验证:He/she(用户)必须提供 he/she 声称的身份 he/she 是。这通常是通过强制用户提供 his/her 登录表单中的用户名和密码。 这已经由 Laravel 使用默认值 Laravel 实现 授权

  2. Authorization:此处必须授权认证用户才能执行 根据各自的角色执行某些操作。 这就是所谓的用户访问控制。

就安全而言,您不得实施自己的用户访问控制。我会推荐您使用名为 Spatie 的 Laravel-Permission Package,我认为这是 Laravel 的最佳用户访问控制。

易于安装和使用。

  • 它为用户分配角色
  • 它将权限授予不同的角色。

请查看下面的 link 以获得 Spatie 官方文档和安装说明。

https://spatie.be/docs/laravel-permission/v4/installation-laravel

安装包时一定要花时间仔细阅读文档,才不会遗漏任何东西。

除了 Spatie Permission 之外,您还可以使用下面的 link 下载由 Laravel Daily 创建的 Spatie Permission 管理面板 (GUI)。

https://github.com/LaravelDaily/Laravel-CoreUI-AdminPanel

您正在尝试做的是魔术数字和冗长编程的混合体。 这是您的代码:

@if ($admin != 1)
   @if ($role_id == 7)
     <a href="{{ route('cutting.working.orders.create') }}" class="btn btn- 
       label-brand btn-bold">
        <i class="la la-plus"></i> Create Cutting</a>
    @endif
   @if ($role_id == 6)
   <a href="{{ route('packaging.working.orders.create') }}" class="btn btn- 
   label-brand btn-bold">
  <i class="la la-plus"></i> Create Packaging</a>
      @endif
     @endif
   @endif

你应该像这样使用 Spatie Blade 指令:

//if the user is an admin he/she can perform the action.
@hasrole('admin')

   //Granting different admin users different permissions.

   @can('create cutting order')
    // only the admin who can create cutting...
    <a href="{{ route('cutting.working.orders.create') }}"></a>
   @endcan
   
   @can('create packaging order')
    // only the admin who can create packaging...
    <a href="{{ route('packaging.working.orders.create') }}"></a>
   @endcan

@else
//he/she is not an admin, then he/she is not allowed to do anything.

@endhasrole