我在域组中拥有所有路由,但我想避免将域作为每个控制器方法中的参数。
所以我想避免在任何地方这样做:
public function show($domain, $id) {}
并希望将其保留为
public function show($id) {}
我能够部分地使用$request->route()->forgetParameter('subdomain')
放置在中间件中,但是在从控制器方法调用redirect()->action('SomeController@show')
的情况下它不起作用。
首先,所有路由都在域组中。
Route::middleware(['some_middleware'])->domain('{subdomain}' .website.com)->group(function () {
// .. All routes
} );
然后,在 some_middleware 我有
public function handle($request, Closure $next) {
// ..
$request->route()->forgetParameter('subdomain');
return $next($request);
}
然后它无法工作:
class SomeController {
public function process()
{
// ...
redirect()->action('SimpleController@show', ['simple' => $id]);
}
}
我得到的错误是:
Missing required parameters for [Route: ] [URI: simples/{simple}].
仅当我明确传入子域变量时才有效。
class SomeController {
public function process()
{
// ...
redirect()->action('SimpleController@show', ['subdomain'=>'some_subdomain', 'simple' => $id]);
}
}
任何人都可以建议"修复"为了这?在此先感谢:)
答案 0 :(得分:0)
您可以为action()
帮助器创建包装器helper:
if (! function_exists('actionSub')) {
function actionSub($name, $parameters)
{
return action($name, $parameters + ['subdomain' => request()->route('subdomain')]);
}
}
然后使用它:
redirect(actionSub('SimpleController@show', ['simple' => $id]));
如果某人有更优雅的解决方案,那么很高兴看到它。
答案 1 :(得分:0)
使用Laravel 5.5+,您可以使用URL :: defaults设置诸如路由助手之类的请求范围的值。
https://laravel.com/docs/5.6/urls#default-values
public function handle($request, Closure $next) {
// ..
$subdomain = $request->route('subdomain');
URL::defaults(['subdomain' => $subdomain]);
$request->route()->forgetParameter('subdomain');
return $next($request);
}