Как я могу заставить свои собственные ворота работать в 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!');
}