Как я могу заставить свои собственные ворота работать в Laravel?

Я пытаюсь создать специальный шлюз, который позволит пользователям из группы «Администратор» получить доступ к странице индекса «Пользователи». Однако он действует прямо противоположно тому, чего я хочу достичь, и я, кажется, не понимаю, в чем я здесь ошибаюсь.

Он всегда возвращает false, независимо от того, принадлежит ли пользователь к группе администраторов или нет.

Помощь приветствуется. Спасибо.

User.php:

      public function AdminTeam(string $team)
{
   return null !== $this->teams()->where('name', $team)->first();
}

AuthServiceProvider.php:

      /**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Gate::define('is-admin', function ($user){
       return $user->AdminTeam('Administrator');
    });
}

UserController.php:

       /**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    if (Gate::allows('is-admin')) {
        return view('admin.users.index', ['users' => User::paginate(10)]);
    }
    dd('you need to be admin!');
    
}

index.blade.php:

      @can('is-admin')
                @foreach($users as $user)
                    <tr>
                        <th scope="row">{{ $user->user_id }}</th>
                        <td>{{ $user->name }}</td>
                        <td>{{ $user->email }}</td>
                        <td>{{ $user->created_at }}</td>
                        <td>{{ $user->updated_at }}</td>
                        <td>
                            <a class="btn btn-sm btn-primary" href="{{ route('admin.users.edit', $user->user_id) }}"
                               role="button">Bearbeiten</a>
                            <button type="button" class="btn btn-sm btn-danger"
                                    onclick="event.preventDefault();
                                        document.getElementById('delete-user-form-{{ $user->user_id }}').submit()">
                                Löschen
                            </button>
                            <form id="delete-user-form-{{ $user->user_id }}"
                                  action="{{ route('admin.users.destroy', $user->user_id) }}" method="POST"
                                  style="display: none">
                                @csrf
                                @method("DELETE")
                            </form>
                        </td>
                    </tr>
                @endforeach
            @endcan

Вывод :

Образ

1 ответ

Решение

Итак, через пару дней отладки я понял, что мой teams() метод должен быть team() внутри модели User, поскольку у пользователя только одна команда, и отношение BelongsTo вернет только одну запись.

Кредиты: https://www.reddit.com/r/laravel/comments/ldvtgd/custom_admin_gate_not_working/ https://laracasts.com/discuss/channels/laravel/admin-gate-not-working?page=1#reply=687840

Вот изменения:

User.php

      public function team()
    {
        return $this->belongsTo(Team::class);
    }

     /**
     * Check if the user belongs to Admin Team
     * @param string $team
     * @return bool
     */

    public function isAdmin(string $team)
    {

        return $this->team()->where('name', $team)->exists();

    }

AuthServiceProvider.php

      public function boot()
    {
        $this->registerPolicies();

        Gate::define('is-admin', function (User $user){
           return $user->isAdmin('Admin');
        });
    }

UserController.php

      public function index()
    {
        if (Gate::allows('is-admin')) {
            return view('admin.users.index', ['users' => User::paginate(10)]);

        }

        dd('you need to be admin!');
        
    }
Другие вопросы по тегам