我需要检查{subcategory}
是否有父类别{category}
。我如何在第二次绑定中获得{category}
的模型?
我试过了$route->getParameter('category');
。 Laravel抛出FatalErrorException
消息“达到最大功能嵌套级别'100',中止!”。
Route::bind('category', function ($value) {
$category = Category::where('title', $value)->first();
if (!$category || $category->parent_id) {
App::abort(404);
}
return $category;
});
Route::bind('subcategory', function ($value, $route) {
if ($value) {
$category = Category::where('title', $value)->first();
if ($category) {
return $category;
}
App::abort(404);
}
});
Route::get('{category}/{subcategory?}', 'CategoriesController@get');
更新
现在我做了这个,但我认为这不是最好的解决方案。
Route::bind('category', function ($value) {
$category = Category::where('title', $value)->whereNull('parent_id')->first();
if (!$category) {
App::abort(404);
}
Route::bind('subcategory', function ($value, $route) use ($category) {
if ($value) {
$subcategory = Category::where('title', $value)->where('parent_id', $category->id)->first();
if (!$subcategory) {
App::abort(404);
}
return $subcategory;
}
});
return $category;
});
答案 0 :(得分:3)
你可以尝试这个并且应该可行,代码是自我解释的(询问是否需要解释):
Route::bind('category', function ($value) {
$category = Category::where('title', $value)->first();
if (!$category || $category->parent_id) App::abort(404);
return $category;
});
Route::bind('subcategory', function ($value, $route) {
$category = $route->parameter('category');
$subcategory = Category::where('title', $value)->whereParentId($category->id);
return $subcategory->first() ?: App::abort(404); // shortcut of if
});
Route::get('{category}/{subcategory?}', 'CategoriesController@get');
更新(正如OP
声明的那样,parameter
类中没有Route
方法可用:
/**
* Get a given parameter from the route.
*
* @param string $name
* @param mixed $default
* @return string
*/
public function getParameter($name, $default = null)
{
return $this->parameter($name, $default);
}
/**
* Get a given parameter from the route.
*
* @param string $name
* @param mixed $default
* @return string
*/
public function parameter($name, $default = null)
{
return array_get($this->parameters(), $name) ?: $default;
}
答案 1 :(得分:1)
我现在无法为你测试这个,但是闭包函数会收到$ value和$ route。
最后一个是'\ Illuminate \ Routing \ Route'(http://laravel.com/api/class-Illuminate.Routing.Route.html)的实例,也许您可以使用getParameter()
方法检索一些数据....
答案 2 :(得分:1)
我最近遇到了同样的问题,同时试图在我的会话模型中自动验证我的故事存在。所以,我尝试使用模型绑定检查我的会话模型中的Story模型是否存在。
这是我的解决方案
$router->bind('stories', function($value, $route) {
$routeParameters = $route->parameters();
$story = Story::where('id', $value)->where('poker_session_id', $routeParameters['poker_sessions']->id)->first();
if (!$story) {
throw new NotFoundHttpException;
}
return $story;
});
您实际上可以使用$ route-> parameters()获取路由参数,该参数返回一个数组。在我的例子中,“poker_sessions”键包含一个我想要的PokerSession模型。
请注意,只有当您拥有/ category / {category} / subcategory / {subcategory}网址时才使用此功能。没有任何{category}的子类别。
祝你好运!