我正在使用Laravel开发一个用于移动应用程序的API,并且在嵌套路由上遇到了Route Model Binding的一些问题.该应用程序将有一个独立的sqlite数据库,当网络可用时,它将同步客户端旅程与中央服务器.因此,应用程序中的PK不能用于访问中央服务器上的记录.每个用户都有一个唯一的用户名,该用户名将存储在具有以下列的表中的中央服务器上:
- 用户身份
- 用户名
然后,旅程表将包含以下列:
- journey_id
- 用户身份
- user_journey_id
其中user_journey_id将是客户端设备上的旅程记录的PK.我们的想法是客户可以使用以下内容访问api:http:
//example.com/api/client/UNIQUE_USERNAME/journey/1234
以从中央服务器检索旅程.
我有以下资源设置:
Route::resource('client','ClientController');
Route::resource('client.journey','JourneyController');
Run Code Online (Sandbox Code Playgroud)
并为客户端成功设置路由模型绑定,如下所示:
$router->bind('client', function($value, $route) {
return \App\Client::where('username', '=', $value)->firstOrFail();
});
Run Code Online (Sandbox Code Playgroud)
我在设置嵌套模型绑定时遇到了一些麻烦,因为我需要将客户端username与其结合user_journey_id来检索正确的旅程.有没有办法用路由模型绑定来做到这一点?
或者这应该在控制器中完成,例如:
public function show(Client $client, $user_journey_id)
{
... // have logic here to get the journey.
Run Code Online (Sandbox Code Playgroud)
这就是我目前的做法,但路线模型绑定肯定会使它更容易一些.
我认为您的方法不好,无论如何您都会使用单独的控制器来结束此操作,因为您将来可能需要添加一个身份验证层或更多功能。
将用户名作为 URL 也不好,因为它可能是一个带有特殊字符的字符串,需要对 URL 进行编码,然后进行解码,因此很容易出错。我建议使用 ids,因为它是一个 API。
资源将为每个请求的操作调用特定的方法,我建议使用这些方法。