使用复合键路由绑定

时间:2016-05-26 17:49:08

标签: php routes laravel-5.2

我正在尝试绑定具有复合键的模型。看一看,我首先定义了我的路线:

Route::get('laptop/{company}/{model}', 'TestController@test');

现在,我定义为我想要解决:

$router->bind('laptop', function ($company, $model) {
    $laptop = ... select laptop where company=$company and ...;
    return $laptop;
});

现在,我看到我是如何注入类以便将笔记本电脑放入控制器:函数来测试分辨率:

function test(Laptop $laptop){
    return 'ok';
}

但是,我收到以下错误:

  

Container.php第839行中的BindingResolutionException:

我认为错误是由$router->bind('laptop'引起的,因为它应匹配url(“company”或“model”)中的唯一占位符。在我的情况下,我迷路了,因为我需要同时匹配两者。

  

注意:我没有使用db / eloquent层。此问题的重点在于如何使用表示唯一对象的多个键来解析路径绑定。

我不确定是否可能,或者我是否遗漏了某些东西。提前感谢您的任何建议。

2 个答案:

答案 0 :(得分:0)

Laravel在eloquent查询中不支持复合键。

您需要使用laravel的查询构建器方法来匹配这两个值。 ie:DB :: select() - > where() - > where() - > get();

只需将select和where条件放在上面。

答案 1 :(得分:0)

如果绑定$router->bind('laptop', ...);,则您的路由参数应为Route::get('{laptop}', ...);。有两种方法可以按照您的预期modelcompany查询笔记本电脑。

最安全的方法是在控制器上查询笔记本电脑:

Route::get('laptop/{company}/{model}', 'TestController@test');

在你TestController.php

function test(Laptop $laptop, $company, $model){
    return $laptop->whereCompany($company)->whereModel($model)->first();
}

另一种解决方案是在路线参数上允许斜杠:

Route::get('laptop/{laptop}', 'TestController@test')->where('laptop', , '(.*)?');

你的绑定功能可能是:

$router->bind('laptop', function ($laptop) {
    $laptop  = explode('/', $laptop);
    $company = current($laptop);
    $model   = end($laptop);

    if ((count($laptop) === 2) && ($result = App\Laptop::whereCompany($company)->whereModel($model)->first()) {
        return $result;
    }

    return abort(404);
}