【问题标题】:Laravel 5.2 subdomain dynamical routes to controllersLaravel 5.2 子域动态路由到控制器
【发布时间】:2016-10-14 04:13:05
【问题描述】:

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

我想设置我的routes.php,以便用户可以在浏览器中键入ford.cars.com/somethingOrnothing 并访问负责福特™ 汽车的控制器 (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');
        });
    });

那么问题来了: 是否可以为子域动态设置路由以及如何实现这一点

更新:
理想的结果是拥有完全重复控制器结构的子域。就像Route::controller() 一样(但现在已弃用)

【问题讨论】:

    标签: php laravel routes laravel-5.2


    【解决方案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 异常。

    【讨论】:

      【解决方案2】:

      这可能就是你需要的:

      子域路由

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

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

      来自: Laravel 5.2 Documentation

      更新。

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

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

      【讨论】:

      • 可能不是。在发布问题之前,我已经阅读了文档并尝试了很多东西。文档中的示例很清楚,如何处理控制器路由以及如何将{account} 参数传递给它们不清楚
      • @Zanshin13 我明白了。作为一种解决方法,您始终可以像这样从路由闭包内部调用控制器方法: app('App\Http\Controllers\YourController')->controllerMethod($account, $id);
      • 理想的结果是拥有完全重复控制器结构的子域。就像Route::controller() 一样(但现在已弃用)。您的解决方案不会让我选择转到我在 url 中拥有的任何控制器方法
      猜你喜欢
      • 2023-03-05
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2014-04-21
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      相关资源
      最近更新 更多