yalcin Bu route model binding dediğimiz rotadan otomatik model çözümleme özelliği. Mesela Page şeklinde bir modeliniz ve bir tane de RESTful PageController var. Klasik show yöntemi şöyle olacaktır:
public function show($id)
{
$page= Page::findOrFail($id);
return new PageResource($page);
}
Yani önce sayfayı bul sonra yanıt ver şeklinde. Route model binding kullandığınızda ise modeli bulma işlemini Laravel'e yaptırmış oluyorsunuz:
public function show(Page $page)
{
return new PageResource($page);
}
Burada Laravel Page::findOrFail($id) uygulayarak eğer modeli bulursa show yöntemine otomatik enjekte ederek kullanımınıza sunuyor. Böylece daha temiz bir controller elde etmiş oluyorsunuz.
Bu işlemi yaparken elbette Page::findOrFail($id) şeklinde primary key ile sayfayı buluyor. Bu rotaya ulaştığınız URI de zaten /pages/1 şeklinde. Ya biz id değil de başka bir alana göre sayfayı bulmak istiyorsak? Mesela /pages/about-us şeklinde slug göndererek Page modeline ulaşmak istersek? İşte burada {page:slug} yapabiliyorsunuz böylece Laravel Page::findOrFail($id) yapmak yerine Page::where('slug', $slug)->firstOrFail() yaparak modeli buluyor. Eğer bunu daha da özelleştirmek isterseniz RouteServiceProvider::boot() içerisinde:
Route::bind('page', function ($value) {
return Page::where('slug', $value)
->where('active', true)
->has('tags')
->firstOrFail();
});
şeklinde yapabiliyorsunuz.
Page modelini bulamadığı zaman ise ModelNotFoundException fırlatır. Gelen yanıt json istiyorsa bunu json olarak döner; öteki türlü sizi RedirectResponse ile yönlendirir ve 404 sayfası karşılar. Buna da müdahele etmek isterseniz, özellikle json değil de RedirectResponse gerçekleşen durumlarda şöyle yapıyorsunuz:
Route::resource('pages', PageController::class)
->missing(function (Request $request) {
return Redirect::route('pages.index');
});
Bu şekilde Page bulunamadığında sizi belirttiğiniz rotaya yönlendirmesini sağlayabilirsiniz. Mesela şöyle yapılabilir:
Route::resource('pages', PageController::class)
->missing(function (Request $request) {
return Redirect::route('pages.index')->withErrors('Sayfa bulunamadı');
});
pages/index.blade.php sayfasında da şöyle yaparsanız bu hatayı gösterebiliriniz. (Hata oturuma tek seferlik kaydedildiği için bir kere gözükür, sayfayı yenileyince gider)
@if($errors->any())
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $message)
<li>{{ $message }}</li>
@endif
</ul>
</div>
@endif
Kabaca bu, gerisi dokümanlarda.