debiyach Mesela Gate kullandınız:
Gate::define('update-post', function (User $user, Post $post) {
// Kullanıcı admin veya fixer ise güncelleme yetkileri var. Sadece fixer slug ve
// is_active alanlarını değiştirme yetkisi var. Bunu gate dışında yapacağız.
if($user->isAdmin() || $user->isFixer()) {
return true;
}
// Kullanıcı editör ise sadece kendine ait olan ve is_active true olan kayıtları
// düzenleme yetkisine sahip.
if($user->isEditor()) {
return $user->id === $post->user_id
&& $post->is_active === true;
}
return false;
});
PostController::update():
public function update(UpdatePostRequest $request, $id)
{
$post = Post::findOrFail($id);
// Şartlara uymazsa 403 dönecek...
Gate::authorize('update-post', $post);
$data = $request->validated();
// Kullanıcı fixer ise sadece izin verilen ayarları güncellemesini sağlayacağız.
if($user->isFixer()) {
$data = Arr::only($data, ['slug', 'is_active']);
}
$post->update($data);
// ...
}
Fixer için UpdatePostRequest içinde ayrı bir rules dizisi de oluşturabilirsiniz:
public function rules(): array
{
// Standart kurallar.
$rules = [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
'slug' => 'string',
];
// Kullanıcı admin ise ayrıca is_active verebilir.
if ($this->user()->isAdmin()) {
$rules['is_active'] = 'boolean';
}
// Fixer sadece is_active ve slug alanlarını güncelleyebilir.
if ($this->user()->isFixer()) {
$rules = [
'is_active' => 'boolean',
'slug' => 'string',
];
}
return $rules;
}
public function update(UpdatePostRequest $request, $id)
{
$post = Post::findOrFail($id);
Gate::authorize('update-post', $post);
$post->update($request->validated());
// ...
}