0

我正在构建一个 json api。通过 routing.yml 配置文件可以很好地管理格式:

user_info:
  url: /users/:user_id
  class: sfRequestRoute
  param: { module: user, action: details, sf_format: json }
  requirements:
    user_id: \d+
    sf_method: [GET]

现在我想确保发送到我的应用程序的任何请求都将以 json 格式返回结果(例如:“/dummy”应该在 json 中返回错误)。我在同一个文件的末尾使用以下默认路线走上正轨:

default:
  url: /*
  param: { sf_format: json }

当我路由到一个不存在的页面或模块时,这会正确呈现一个 json... 错误!生成的 html 页面是 404,现在使用此路由我得到 500(服务器错误)。如何保持与默认 html 页面中的行为类似的行为,只需将呈现更改为 json 输出?

编辑 - 遵循 1Ed 说明

所以我编辑了我的 factory.yml,在我的 api 项目中创建了一个默认模块,在我的默认操作中添加了下面提到的 executeError404 函数......然后我设置了相应的 Error404Success.php 页面......

出于某种原因,我仍然需要路由,我对其进行了修改以避免 :module 和 :action 关键字:

default_index:
  url:   /:a

default:
  url: /:a/:b/*

我在这里!我的 404 页面为整个 api 的 json 格式 :) 非常感谢!

4

1 回答 1

1

此默认路由将执行模块的index操作default(默认情况下)。您应该将indexSuccess.json.php模板文件添加到默认模块或修改default/index操作以尽早返回 json 响应。

如果您只想在此默认路由匹配时每次返回 404,您可以将默认操作更改为error404in factories.yml

all:
  routing:
    class: sfPatternRouting
    param:
      generate_shortest_url:            true
      extra_parameters_as_query_string: true
      default_action:                   error404

或者您可以像这样将默认 404 操作的请求格式显式设置为 json

public function executeError404(sfWebRequest $request)
{
  $request->setRequestFormat('json');
}

您可以删除默认路由。

我建议不要使用这些默认路由,因为它们很难跟踪到站点的所有可能的 URL。您应该为每个特定操作创建单独的路由或使用路由集合。

于 2013-03-05T11:40:15.960 回答