Laravel 可以透過兩種方式進行路由模型繫結。
在模型中指定路由的鍵
/**
* 獲取該模型的路由的自定義鍵名。
*
* @return string
*/
public function getRouteKeyName()
{
return 'slug';
}
在服務提供者中手動進行繫結
Route::bind('post', function ($value) {
return App\Post::where('slug', $value)->first() ?? abort(404);
});
}
如何同時支援 id
和 slug
的路由模型繫結呢?同樣有兩種方式實現。
一是在模型重寫 resolveRouteBinding
方法
/**
* Retrieve the model for a bound value.
*
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value)
{
return $this->where($this->getRouteKeyName(), $value)->first();
}
重寫
/**
* Retrieve the model for a bound value.
*
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value)
{
if( is_numeric($value) ){
return self::findOrFail($value);
} else {
return self::whereSlug($value)->firstOrFail();
}
}
也可以在服務提供者中進行繫結
Route::bind('post', function ($value) {
if( is_numeric($value) ){
return App\Post::findOrFail($value);
} else {
return App\Post::whereSlug($value)->firstOrFail();
}
});
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結