2

我正在尝试实现这个包 - https://github.com/vinkla/hashids来混淆 URL 中的所有 id。

我创建了一个全新安装的 laravel 5.2 并创建了一个名为 Orange.php 的模型,其中填充了表格-

INSERT INTO `oranges` (`id`, `orange_name`) VALUES(1, 'test1'),(2, 'test2'),(3, 'test3');

我将以下内容添加到 routes.php-

Route::bind('id', function ($id, $route) {
return Hashids::decode($id)[0];
});

Route::resource('orange', 'OrangeController');

Route::model('orange', 'App\Orange');

我还通过向 Orange.php 添加以下函数来覆盖 getRouteKey-

public function getRouteKey()
{
return Hashids::encode($this->getKey());
}

因此 getRouteKey 应该对 ID 进行编码以显示 URL,例如 3 转到 hgfdh,然后我的路由绑定应该通过“id”通配符将自身应用于任何使用 id 参数的路由,以在这种情况下解码 OrangeController.php 的 ID。

尝试加载 http://localhost:8000/orange/3-时收到以下两个错误

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'orange_name:"test3"' in 'where clause'

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'orange_name:"test3"' in 'where clause' (SQL: select count(*) as aggregate from `oranges` where `orange_name` = test3 and `orange_name:"test3"` <> {"id":3 and `created_at:"2016-06-23 09:30:39"` = updated_at:"2016-06-23 09:30:39"})

我认为这个错误与 -

 Route::model('orange', 'App\Orange');

它是否试图绑定 Orange 的实例而不是 Orange 的 $id?如果是这样,我如何绑定 $id?

如果我注释掉 Route::model 定义我得到-

NotFoundHttpException in Handler.php line 103:
No query results for model [App\Orange].
4

1 回答 1

0

Laravel 具有“路由模型”绑定机制。因此,在您的路线中,您可能会期待一个混淆的 id,但在bind方法中,您应该得到一个适当的model实例,如下所示:

Route::bind('orange', function($value)
{
    $id = Hashids::decode($value)[0];

    return Orange::findOrFail($id);
});

这是一个很好的例子,可能会有所帮助。

于 2016-06-23T18:10:28.017 回答