【问题标题】:Add JSON routes for all routes to handle backend requests为所有路由添加 JSON 路由以处理后端请求
【发布时间】:2015-07-29 09:47:51
【问题描述】:

我正在使用 Laravel 5.1,并且正在构建一个可以被视为 JSON 或 HTML 的服务。 reddit 等网站已经采用了这种方法。
示例
普通视图:http://www.reddit.com/r/soccer
JSON 视图:http://www.reddit.com/r/soccer.json

如您所见,他们只需将.json 添加到 URL 中,用户就能以 HTML 或 JSON 的形式看到完全相同的内容。

我现在想在 Laravel 中重现相同的内容,但是我遇到了多个问题。

方法 1 - 可选参数

我尝试的第一件事是为我的所有路线添加可选参数

Route::get('/{type?}', 'HomeController@index');
Route::get('pages/{type?}', 'PageController@index');

但是,我在这里面临的问题是,所有路由都被 HomeController 捕获,这意味着 /pages/?type=json/pages?type=json 被重定向到 HomeController。

方法 2 - 使用命名空间的路由分组

接下来我尝试添加带有命名空间的路由分组,以分离后端和前端

Route::get('pages', 'PageController@index');
Route::group(['prefix' => 'json', 'namespace' => 'Backend'], function(){
    Route::get('pages', 'PageController@index');
});

但是,这也不起作用。当使用api 作为前缀时,它确实有效,但我想要的是我可以将.json 添加到每个 URL 并以 json 格式获取结果。我如何在 Laravel 中实现这一点?

【问题讨论】:

  • 你用的是什么版本的 laravel?
  • 嘿,我使用的是 Laravel 5.1 版

标签: php laravel routing laravel-5 laravel-5.1


【解决方案1】:

您可以在您的参数上应用正则表达式来避免像 HomeController@index 那样的包罗万象的情况:

Route::get('/pages{type?}', 'PageController@index'->where('type', '\.json'));

这样 type 只会匹配,如果它等于 .json

然后,在您的控制器中访问它:

class PageController {
  public function index($type = null) {
    dd($type);
  }
}

然后转到 /pages.json

【讨论】:

  • 不幸的是,只有当我拥有这样的 URL pages?type=.json 而不是这样的 pages.json 时,这才会起作用。此外,我想一次为所有路线使用它,如果可能的话,不要为每条路线添加它。不过感谢您的回答!
  • 不正确。它不能与 ?type=.json 一起使用,因为在与路由匹配时不考虑查询参数(在 ? 之后的参数)。
  • 如果将第二条路由定义为 'pages{type?}' 会怎样?
  • 您可以使用服务器重写将 .json 转换为 ?type=json 以使其对用户不可见,或者使用 laravel 中间件来处理 - 任何偏好?
  • 这其实是个好主意。这样我就可以使用route groups!我可以用/api 对所有内容进行分组,然后,如果最后有.json,只需将'/api' 放在它前面,对吗?这样一来,pages.json 将转到api/pages。这样路由组就会捕捉到它并且 api 方法会被捕捉到!对吗?
猜你喜欢
  • 2013-01-15
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多