【问题标题】:Laravel Route Model Binding: Check if a route parameter exists in modelLaravel 路由模型绑定:检查模型中是否存在路由参数
【发布时间】:2017-07-06 08:43:42
【问题描述】:

我有这条路线:

Route::get('{country}/{federalstate?}/{city?}', ['as' => 'regions.show', 'uses' => 'RegionsController@show']);

接下来我有一个模型国家,其中包含几个国家。

我希望这条路线仅在模型 Country 中存在给定 {country} 时才生效。我想这样做,因为不想为该路由使用前缀。

丑陋的方式是正则表达式。丑陋,因为每次向模型中添加新国家/地区时都必须更新它。

那么完成我想做的事情的最佳方法是什么?

也许这会有所帮助 -> https://laravel.com/docs/5.4/routing#route-model-binding - 但我是初学者,无法使用它。

编辑:

这可能有效:

Route::get('{country?}/{federalstate?}/{city?}', ['as' => 'regions.show', 'uses' => 'RegionsController@show'])->where([
    'country' => 'germany|usa|canada'
]);

但是,正如我所说,每次向数据库添加新国家/地区时,我都必须更改正则表达式。

【问题讨论】:

    标签: php laravel laravel-5 routes


    【解决方案1】:

    这是我现在的解决方案:

    在 AppServiceProvider 中的 boot() 方法中:

    $available_countries = Country::select('slug')->get();
    
    $available_countries = $available_countries->toArray();
    
    $tmp = array();
    
    foreach ($available_countries as $country)
    {
        $tmp[] = $country['slug'];
    }
    
    Config::set('app.available_countries', $tmp);
    

    在我的路线文件中:

    Route::get('{country?}/{federalstate?}/{city?}', ['as' => 'regions', 'uses' => 'RegionsController@index'])->where([
        'country' => implode('|', config('app.available_countries'))
    ]);
    

    【讨论】:

      【解决方案2】:

      正如您所建议的,Route-Model 绑定可能是您最好的选择。您可以从文档中看到,如果您绑定到路由的模型不存在,则该路由将返回 404。

      请注意,Route-Model 绑定中的默认功能需要来自 URL 的 ID。如果要覆盖它,可以执行以下操作:

      /**
       * Get the route key for the model.
       *
       * @return string
       */
      public function getRouteKeyName()
      {
          return 'name';
      }
      

      【讨论】:

      • 404 是问题所在:-/ myurl.com/somecontroller 怎么样 - 我唯一能想到的是,我将发布的路线设置为最后一条路线,但也不是很优雅..
      • 当用户输入一个以不存在的国家/地区开头的网址时,您希望发生什么?
      • 正如我所说,我希望该路由只是活跃的,当国家存在时(没有前缀,{country} 在域根中)。因此,当有人访问 myurl.com/thiscountrydoesnotexist 时,不应应用该路由。
      • 404 是表示“未找到”的 HTTP 代码。因此,当您说“不应应用路由”时,您描述的是服务器应返回 404 的情况。例如,如果您转到 stackoverflow.com/thispagedoesntexist 并打开浏览器控制台,您会看到状态返回的代码是 404。
      • 当没有适合的路由时,当然应该有 404。但我的路由会抓取所有请求并给出 404,如果可能还有其他适合的路由。
      【解决方案3】:

      在我看来,您可以将 Country 作为模型传递给您的控制器。如果你的数据库中没有这样的模型,Laravel 会产生 404 错误。

      【讨论】:

      • 是自动的吗?您能否添加一个code 示例或参考?
      猜你喜欢
      • 2017-01-10
      • 2020-05-05
      • 2016-06-04
      • 2021-05-24
      • 2017-06-22
      • 2018-12-17
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多