使用Laravel 5.2中的vinkla / hashids包来阻止URL中的id

时间:2016-06-16 12:28:38

标签: php laravel-5.2 hashids

我在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没有显示,所以我没有正确地覆盖它。

请您告诉我应该如何正确实现此功能?

由于

1 个答案:

答案 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);
}