繁体   English   中英

Laravel嵌套路由模型绑定

[英]Laravel nested route model binding

我正在使用Laravel开发与移动应用程序一起使用的API,并且在嵌套路由上存在与路由模型绑定有关的问题。 该应用程序将具有一个独立的sqlite db,它将在网络可用时将客户端旅程与中央服务器同步。 因此,应用程序中的PK不能用于访问中央服务器上的记录。 每个用户都有一个唯一的用户名,该用户名将存储在中央服务器的以下表中:

  • 用户身份
  • 用户名

旅程表将包含以下列:

  • trip_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');

并成功为客户端建立设置路由模型绑定,如下所示:

$router->bind('client', function($value, $route) {
    return \App\Client::where('username', '=', $value)->firstOrFail();
});

我在设置嵌套模型绑定时遇到了麻烦,因为我需要将客户端usernameuser_journey_id结合使用以检索正确的旅程。 有没有办法通过路由模型绑定来做到这一点?
还是应该在控制器中像这样完成:

public function show(Client $client, $user_journey_id)
{
   ... // have logic here to get the journey.

这是我目前的操作方式,但是路由模型绑定肯定会使它变得更容易。

与嵌套路由模型绑定一样,在Laravel中肯定可以将多个URL参数绑定到模型。

一个警告是,您需要为这些特定的路由分别指定路由,而不是像示例中那样使用Laravel的资源控制器。

要使用多个模型绑定注册一条路线,您需要执行以下操作:

路线定义:

Route::get('/api/client/{user}/journey/{journey}', [
  'as' => 'client.journey', 
  'uses' => 'JourneyController@getJourney'
]);

绑定定义:

$router->bind('user', function($value, $route) {
    return \App\Client::where('username', '=', $value)->firstOrFail();
});

$router->bind('journey', function($value, $route) {
    return \App\Journey::where('user_journey_id', '=', $value)->firstOrFail();
});

然后,您将发现两个模型都已解析并注入到controller类中的action方法中:

public function show(User $user, Journey $journey)
{
     //do whatever you need to do here...

这种方法的唯一真正缺点是您必须手动定义路由,而不是使用Laravel的便捷资源控制器。 当然,您可以实现一些自己的逻辑,以使这些路线更易于定义。

我认为您的方法并不好,并且为此您将最终使用单独的控制器来结束,因为您将来可能需要添加auth层或更多功能。

使用用户名是URL还是不好的,因为它可以是带有特殊字符的字符串,这些字符串将被URL编码,然后被解码,因此容易出错。 我建议使用ID,因为它是API。

资源将为每个请求的操作调用一个特定的方法,我建议使用这些方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM