我在laravel 5.2上安装并配置了vinkla / hashids的最新版本(2.3.0)。
我不确定如何在我的网址路线上实现其功能。
我想阻止我的网址路径中显示的所有id属性。
例如,http://localhost:8000/profile/3/edit应该成为http://localhost:8000/profile/xyz/edit。
我尝试通过将其添加到App \ Profile.php中来覆盖Illuminate \ Database \ Eloquent \ Model.php上的以下方法 -
public function getRouteKey()
{
dd('getRouteKey method');
return Hashids::encode($id);
}
我的dd没有显示,所以我没有正确地覆盖它。
请您告诉我应该如何正确实现此功能?
由于
答案 0 :(得分:2)
这是我为同样的问题所做的事情:
说你的路线有
Route::get('/profile/{profile}', 'ProfileController@showProfile');
然后在模特中:
// Attribute used for generating routes
public function getRouteKeyName()
{
return 'hashid';
}
// Since "hashid" attribute doesn't "really" exist in
// database, we generate it dynamically when requested
public function getHashidAttribute()
{
return Hashids::encode($this->id);
}
// For easy search by hashid
public function scopeHashid($query, $hashid)
{
return $query->where('id', Hashids::decode($hashid)[0]);
}
最后,您需要绑定路由参数" profile"。你必须首先解码它,然后在数据库中搜索(默认绑定赢了工作)。所以,在app/Providers/RouteServiceProvider.php
:
/**
* Define your route model bindings, pattern filters, etc.
*
* @param \Illuminate\Routing\Router $router
* @return void
*/
public function boot(Router $router)
{
Route::bind('profile', function($hashid, $route) {
try {
return Profile::hashid($hashid)->first();
}
catch (Exception $e) {
abort(404);
}
});
parent::boot($router);
}