如何通过laravel中的模型绑定传递变量?

时间:2015-08-06 19:29:29

标签: php laravel laravel-5

我需要变量“type”

Route::model('type', \App\Models\Document::class, function($type) {

    return (new \App\Models\ShareFactory($type));
});

比返回对象并在其他绑定中使用它

Route::model('key', \App\Models\Document::class, function($key) {

    return $objectFromFactory::where('share_key', $key)->first();
});

毕竟我需要设置将处理请求的控制器

Route::get('share/{type}/{key}', 'ProcessShareController@share');

有可能吗?或者我试图以错误的方式编码?

1 个答案:

答案 0 :(得分:1)

虽然解决方案不能面向未来,但这是可能的。只有在您的分辨率逻辑中,您才使用在当前已解析的参数之前出现在路径中的路径参数,这也将起作用。

当路由参数由路由器解析时,它们的处理顺序与路径中定义的顺序相同。每个已解析的参数都添加到路径参数列表中。

您可以通过调用

来访问已解析参数的列表
$parameters = Route::getCurrentRoute()->parameters();

即使有些参数尚未解决,您也会看到所有路线参数。在解决之前,您将看到URL中的字符串作为其值。

因此,在您的情况下,您需要以下内容:

Route::model('type', \App\Models\Document::class, function($type) {
  return (new \App\Models\ShareFactory($type));
});

Route::model('key', \App\Models\Document::class, function($key) {
  $parameters = Route::getCurrentRoute()->parameters();
  $objectFromFactory = $parameters['type'];
  return $objectFromFactory::where('share_key', $key)->first();
});

警告: 请记住,即使路径中没有 type 参数,也始终会使用上述逻辑解析参数。这可能会导致错误,因为您始终必须确保如果定义一个参数,则还要定义另一个参数。

如上所述,此解决方案不是面向未来的。这里的逻辑依赖于这样的假设:路由参数总是按照它们被定义的顺序处理。虽然我没有看到将来可能发生变化的原因,但无法保证不会发生这种情况。