Laravel 5.2子域动态路由到控制器

时间:2016-10-13 15:27:23

标签: php laravel routes laravel-5.2

假设我在Laravel 5上有一个带汽车的站点:cars.com

我想设置routes.php,以便用户可以输入浏览器ford.cars.com/somethingOrnothing并转到负责Ford™汽车的控制器(FordController)。 当然我可以使用类似这样的代码:

    Route::group(['middleware' => 'web'], function () {     
        Route::group(['domain' => 'ford.cars.com'], function(\Illuminate\Routing\Router $router) {
            return $router->resource('/', 'FordController');
        });
    });

但我不喜欢为数百个汽车品牌编写和维护路线。

我想写这样的东西:

Route::group(['domain' => '{brand}.cars.com'], function(\Illuminate\Routing\Router $router) {
        return $router->get('/', function($brand) {
            return Route::resource('/', $brand.'Controller');
        });
    });

所以问题是: 是否可以动态设置子域的路由以及如何实现

UPD:
理想的结果是具有完全重复控制器结构的子域。和Route::controller()一样(但现在已弃用)

2 个答案:

答案 0 :(得分:1)

要模仿Route::controller()行为,您可以执行此操作:

Route::group(['domain' => '{carbrand}.your.domain'], function () {
    foreach (['get', 'post'] as $request_method) {
        Route::$request_method(
            '{action}/{one?}/{two?}/{three?}/{four?}',
            function ($carbrand, $action, $one = null, $two = null, $three = null, $four = null) use ($request_method) {
                $controller_classname = '\\App\\Http\\Controllers\\' . Str::title($carbrand).'Controller';
                $action_name = $request_method . Str::title($action);

                if ( ! class_exists($controller_classname) || ! method_exists($controller_classname, $action_name)) {
                    abort(404);
                }

                return App::make($controller_classname)->{$action_name}($one, $two, $three, $four);
            }
        );
    }
});

此路由组应该追踪所有其他路由,因为它会引发404 Not found exception。

答案 1 :(得分:0)

可能这就是你所需要的:

  

子域路由

     

路由组也可用于路由通配符子域。   可以像路由URI一样为子域分配路由参数,   允许您捕获子域的一部分以供您使用   路线或控制器。可以使用域来指定子域   组属性数组上的键:

Route::group(['domain' => '{account}.myapp.com'], function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

自: Laravel 5.2 Documentation

UPD。

如果你想调用你的控制器方法,你可以这样做:

Route::group(['domain' => '{account}.myapp.com'], function () {
    Route::get('user/{id}', function ($account, $id) {
        $controllerName = $account . 'Controller' //...or any other Controller Name resolving logic goes here
        app('App\Http\Controllers\\' . $controllerName)->controllerMethod‌​($id);
    });
});