使用路径段名称的显式模型绑定

时间:2017-01-24 23:29:14

标签: laravel laravel-5.3

我有两个模型,ThreadPost,并且在Thread方法中定义了关系(一个Post有很多posts() s) Thread模型。 Thread通过slug字段解析:

// in Thread.php...
public function getRouteKeyName()
{
    return 'slug';
}

现在,每个Post都有一个index字段,从1开始 - 它标识了序列中Post的位置。例如,在

/threads/some_thread_slug/posts/4

路由定义为

Route::get('threads/{thread}/posts/{post}, '.....');

4不是Post的ID,而是Post与相同Post的其他thread_id相关的索引。换句话说,如果带有Thread标题的some_thread_slug有10 Post秒,那么上面的路线应该Postindex一起解析,而不是id)4:

// Thread $thread is automatically resolved through the 'slug' field...
$post = $thread->posts()->where('index', $index)->first() // $post->index == 4

目标是通过Post解决index问题。我当然可以通过RouteSerivceProvider调整它,但问题是我无法访问父Thread slug:

Route::bind('post', function (int $index) {
    // Hmmm.. How do I know which Thread this $index relates to?
    // By no means are these indices unique!
});

到目前为止,我的解决方案是通过直接访问网址组件(例如Thread)并获取相应的模型来查找父some_thread_slug。但这很危险,因为Request::segment()中的索引并不总是相同的。 Laravel是否为此提供了更好的解决方案?

1 个答案:

答案 0 :(得分:2)

callable方法的Route::bind()参数可以接受第二个参数,该参数是Illuminate\Routing\Route类的一个实例。您可以使用该实例从路由Thread获取parameters

示例:

Route::bind('post', function (int $index, Route $route) {
    $thread = $route->parameter('thread');

    return $thread->posts()->where('index', $index)->first();
});