laravel 4 - 具有两个绑定模型的路线

时间:2014-02-18 10:25:07

标签: php laravel laravel-4

我需要检查{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;
});

3 个答案:

答案 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}的子类别。

祝你好运!