Laravel域组,无需将域参数传递给控制器

时间:2018-01-23 14:20:43

标签: laravel laravel-5.5

我在域组中拥有所有路由,但我想避免将域作为每个控制器方法中的参数。

所以我想避免在任何地方这样做:

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]);
    }
}

任何人都可以建议"修复"为了这?在此先感谢:)

2 个答案:

答案 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);
}