Laravel 5: 如何创建绑定多个参数的路由器模型
Laravel 5: How to create a router model binding on multiple parameters
到目前为止,我知道如何在单个参数上创建路由器模型绑定,如下所示:
// RouteServiceProvider.php
$router->model('subject_slug', 'App\Subject', function($slug) {
return Subject::where('slug', $slug)->firstOrFail();
});
上面的可以这样使用:
// routes.php
Route::get('/{subject_slug}', 'MenuController@showSubject');
在控制器中:
public function showSubject(Subject $subject) {
....
}
但有时我需要指定多个参数才能获得正确的模型。
例如考虑以下路线:
Route::get('/{subject_slug}/{topic_slug}/', 'MenuController@showTopic');
以及对应的控制器:
public function showTopic(Subject $subject, Topic $topic) {
....
}
但是要获得 Topic
的正确模型,我需要知道 Subject
。例如:
// !!! Invalid laravel code !!!
$router->model('topic_slug', 'App\Topic, function($subject_slug, $topic_slug) {
// ERROR: $subject_slug is obviously not defined!
return Topic::where([
'subject_slug' => $subject_slug,
'slug' => $topic_slug,
])->firstOrFail();
});
如何为 Topic
创建路由器模型绑定,请记住我需要知道它之前的 Subject
参数才能获取正确的 Topic
。
是否有更好的替代方法?
更新
目前我的控制器中的 showTopic
方法是这样的:
public function showTopic(Subject $subject, $topic_slug) {
$topic = Topic::where([
'subject_slug' => $subject_slug,
'slug' => $topic_slug,
])->firstOrFail();
// ...
}
而且我没有为 topic_slug
绑定路由器模型。
这按预期工作,但我想利用路由器模型绑定!
原来我的做法有点问题。我不太喜欢使用模型绑定,而使用像这样的普通绑定会更好:
$router->bind('topic_slug', function($slug, Route $route) {
$subject = $route->parameter('subject_slug');
return Topic::where([
'subject_slug' => $subject->slug,
'slug' => $slug,
])->firstOrFail();
});
此外,我之前使用的模型绑定完全错误,因为第 3 个函数应该是 "not found behaviour"(不用于附加逻辑)!
到目前为止,我知道如何在单个参数上创建路由器模型绑定,如下所示:
// RouteServiceProvider.php
$router->model('subject_slug', 'App\Subject', function($slug) {
return Subject::where('slug', $slug)->firstOrFail();
});
上面的可以这样使用:
// routes.php
Route::get('/{subject_slug}', 'MenuController@showSubject');
在控制器中:
public function showSubject(Subject $subject) {
....
}
但有时我需要指定多个参数才能获得正确的模型。
例如考虑以下路线:
Route::get('/{subject_slug}/{topic_slug}/', 'MenuController@showTopic');
以及对应的控制器:
public function showTopic(Subject $subject, Topic $topic) {
....
}
但是要获得 Topic
的正确模型,我需要知道 Subject
。例如:
// !!! Invalid laravel code !!!
$router->model('topic_slug', 'App\Topic, function($subject_slug, $topic_slug) {
// ERROR: $subject_slug is obviously not defined!
return Topic::where([
'subject_slug' => $subject_slug,
'slug' => $topic_slug,
])->firstOrFail();
});
如何为 Topic
创建路由器模型绑定,请记住我需要知道它之前的 Subject
参数才能获取正确的 Topic
。
是否有更好的替代方法?
更新
目前我的控制器中的 showTopic
方法是这样的:
public function showTopic(Subject $subject, $topic_slug) {
$topic = Topic::where([
'subject_slug' => $subject_slug,
'slug' => $topic_slug,
])->firstOrFail();
// ...
}
而且我没有为 topic_slug
绑定路由器模型。
这按预期工作,但我想利用路由器模型绑定!
原来我的做法有点问题。我不太喜欢使用模型绑定,而使用像这样的普通绑定会更好:
$router->bind('topic_slug', function($slug, Route $route) {
$subject = $route->parameter('subject_slug');
return Topic::where([
'subject_slug' => $subject->slug,
'slug' => $slug,
])->firstOrFail();
});
此外,我之前使用的模型绑定完全错误,因为第 3 个函数应该是 "not found behaviour"(不用于附加逻辑)!