beyondelayer Evet, doğru kullanım. Model binding yaptığınız için $this->post_category
size çözümlenen PostCategory modelini verir. ignore() içinde $this->post_category->id yapmanıza da gerek yok, $this->post_category yeterli.
Model binding kullanmadığınızı ve şöyle bir rota olduğunu düşünün /api/users/{user}?s=1
. Burada, form request içinde $this->route('user')
size {user} segment değerini verir; $this->input('s')
ise s query string parametresinin değerini verir. Bu ikisini de ignore içine koymamanız lazım.
Şurada belirtildiği gibi pattern kullanarak segmentlerin de belirli tipte kullanıldığından emin olun:
https://laravel.com/docs/10.x/routing#parameters-global-constraints
Mesela Route::pattern('user', '[0-9]+');
yaparsanız {user} segmenti kullanılan rotalarda segmentin sayısal bir ifade olduğundan emin olmuş olursunuz, /api/users/{user}
için /api/users/doe
şeklinde ifade geçersiz olur ve 404'e düşer. Bu da ekstra bir güvenlik önlemi.
Özel kural da şöyle olabilir:
class SafeUnique implements Rule
{
public function __construct(
protected string $table,
protected string $column = null,
protected string $ignore = null,
protected string $ignoreColumn = null,
)
{
}
public function passes($attribute, $value)
{
$this->column ??= $attribute;
$this->ignoreColumn ??= 'id';
return DB::table($this->table)
->where($this->column, $value)
->when($this->ignore, function($query, $ignore) {
$query->where($this->ignoreColumn, '<>', $ignore);
})
->doesntExists();
}
public function message()
{
return __('The :attribute has already been taken.', [
'attribute' => $this->column,
]);
}
}
new SafeUnique('post_categories', 'name', $this->input('id')),