【问题标题】:Laravel 5 wildcard subdomain + route model bindingLaravel 5 通配符子域 + 路由模型绑定
【发布时间】:2015-07-02 21:58:46
【问题描述】:

所以当你在通配符子域组路由中定义一个资源控制器时类似于这样:

Route::group(array('domain' => '{subdomain}.example.com'), function() {
  Route::resource('users', 'UserController');
});

在 RouteServiceProvider 上

$router->model('user', 'App\User');

在 UserController 的 show 方法上:

public function show($user)
{
    return $user;
}

我得到的是子域名而不是用户资源。这是因为 subdomain 参数被传递给控制器​​方法,我必须像这样更改它们:

public function show($subdomain, $user)
{
    return $user;
}

我只是不想将 subdomain 参数添加到我的应用程序中的每个控制器方法,因为我不会对它做任何事情。我在中间件中使用 subdomain 参数进行一些配置更改。

我该怎么做才能不将子域作为参数传递给控制器​​?

【问题讨论】:

  • 您能找到任何解决方案吗?
  • 我放弃并最终在每个控制器方法中包含子域参数。不过,在某些情况下会派上用场。特别是当我需要将参数传递给视图时。

标签: php laravel


【解决方案1】:

我知道这个问题有些陈旧(并且可能过时),尽管我在搜索另一个路由模型绑定问题的答案时偶然发现了这篇文章。

为了避免需要子域,你可以指定 Laravel 忘记那个路由参数。

您可以在中间件中执行此操作(也可以检查子域),如下所示:

$request->route()->forgetParameter('subdomain');

或者,使用您的代码 sn-p,它看起来类似于以下内容:

Route::group(array('domain' => '{subdomain}.example.com'), function() {
  Route::forgetParameter('subdomain');
  Route::resource('users', 'UserController');
});

但是,我强烈建议将该进程移到中间件中,因为将其放入路由文件中感觉不妥。

【讨论】:

    【解决方案2】:

    在您的控制器功能中,如果您不使用 $dubdomain,您可以忽略它,并确保您像这样输入提示用户

    public function show(User $user)
    {
        return $user;
    }
    

    【讨论】:

    • 谢谢马格斯。这是有道理的,但感觉不是一个好方法。它可能会导致嵌套资源的混乱。我更喜欢简单地让路由器忽略子域参数。
    • 我刚刚测试过,$subdomain如果不用的话可以忽略。因为你有用户,所以你需要输入提示才能解决。
    • 当我输入提示用户时,我得到Argument 1 passed to App\Http\Controllers\UserController::show() must be an instance of App\User, string given。假设该字符串是传递的子域。
    • 那一定是和模型绑定有关的东西,需要深入调查。我能够输入提示并获得解析的 Eloquent 模型值并跳过其他 url 参数。
    • @MargusPala 如果路由服务提供者有模型绑定怎么解决?也许你有这个 $router->bind('users', function($id) { return \App\User::findOrFail($id); }); 并且在方法上已经有类型提示 doSomething(User $user) { ... laravel 再次要求对象并且子域正在取代它。
    猜你喜欢
    • 2021-05-12
    • 2015-07-12
    • 2015-07-25
    • 2015-09-10
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多