我有两个模型,Thread
和Post
,并且在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
秒,那么上面的路线应该Post
与index
一起解析,而不是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是否为此提供了更好的解决方案?
答案 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();
});