Silex restful框架中的格式后缀

时间:2017-02-26 22:10:12

标签: php rest silex

我开始构建支持多种响应格式的RESTful api。我想用Accept标头识别请求的响应格式,或者在请求URL后附加一个文件后缀。

E.g。 /api/endpoint包括Accept: application/json*和。{ /api/endpoint.json应该产生相同的json响应。

/api/endpoint.xml应该导致XML响应。

我没有在Silex中找到任何关于响应格式的文档,所以如何启动并且是否可以允许文件后缀进行格式识别?

谢谢, 帕特里克

1 个答案:

答案 0 :(得分:0)

来自Silex documentation的示例:

use Silex\Application;
use Silex\Provider\SerializerServiceProvider;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$app = new Application();

$app->register(new SerializerServiceProvider());

// only accept content types supported by the serializer via the assert method.
$app->get("/pages/{id}.{_format}", function (Request $request, $id) use ($app) {
// assume a page_repository service exists that returns Page objects. The
// object returned has getters and setters exposing the state.
$page = $app['page_repository']->find($id);
$format = $request->getRequestFormat();

if (!$page instanceof Page) {
    $app->abort("No page found for id: $id");
}

return new Response($app['serializer']->serialize($page, $format), 200, array(
    "Content-Type" => $request->getMimeType($format)
));
})->assert("_format", "xml|json")
  ->assert("id", "\d+");

要默认获取json响应,您可以使用类似于:

的内容
$app->get("/pages/{id}{_separator}{_format}", function (Request $request, $id) use ($app) {
    //...
})->assert("id", "\d+")
  ->value("_separator", ".")
  ->assert("_separator", "\.|\/")
  ->value("_format", "json")
  ->assert("_format", "json|xml");

// /pages/1 => json reponse
// /pages/1.json => json response
// /pages/1.xml => xml response
// /pages/1/json => json response (as a bonus)
// and etc.

另请参阅documentation以全局配置此行为。