我需要变量“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');
有可能吗?或者我试图以错误的方式编码?
答案 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 参数,也始终会使用上述逻辑解析键参数。这可能会导致错误,因为您始终必须确保如果定义一个参数,则还要定义另一个参数。
如上所述,此解决方案不是面向未来的。这里的逻辑依赖于这样的假设:路由参数总是按照它们被定义的顺序处理。虽然我没有看到将来可能发生变化的原因,但无法保证不会发生这种情况。