jdesrosiers/silex-conneg-provider

一个提供HTTP内容协商工具的silex服务提供商。

v1.0.0 2016-06-06 05:58 UTC

This package is auto-updated.

Last update: 2024-08-26 03:21:21 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

该silex-conneg-provider是一个silex服务提供商,它提供了在您的应用程序中进行HTTP内容协商的工具。它允许您声明应用程序可以处理哪些请求和响应格式。如果客户端请求一个应用程序不支持格式的响应,他们将收到一个406 Not Acceptable响应。如果客户端发送一个应用程序不支持格式的请求体,他们将收到一个415 Unsupported Media Type响应。还有一个服务,可以方便地自动序列化响应和反序列化请求,使用JMS SerialzierSymfony Serializer

安装

使用composer安装silex-conneg-provider。该项目使用语义化版本控制

{
    "require": {
        "jdesrosiers/silex-conneg-provider": "~1.0"
    }
}

参数

内容协商

  • conneg.responseFormats: (数组) 支持的响应格式数组。默认为array("html")
  • conneg.requestFormats: (数组) 支持的请求格式数组。默认为array("form")

序列化

  • conneg.defaultFormat: (字符串) 默认为html
  • conneg.serializationContext: (JMS\Serializer\SerializationContext或数组)。可选。
  • conneg.deserializationContext: (JMS\Serializer\DeserializationContext或数组)。可选。

服务

  • conneg: 提供一个具有两个方法的对象:createResponse和deserializeRequest。此服务仅在您已安装序列化服务时可用。
  • createResponse: 它的工作方式与Respose::create相同,但它接受一个对象而不是字符串,并将其序列化为所需的格式。格式由该服务提供商包含的中间件确定。
  • deserializeRequest: 传递一个类名,它将反序列化请求实体,并返回该类的实例。

注册

$app->register(new JDesrosiers\Silex\Provider\ContentNegotiationServiceProvider(), array(
    "conneg.responseFormats" => array("json", "xml"),
    "conneg.requestFormats" => array("json", "xml"),
    "conneg.defaultFormat" => "json",
));

用法

服务提供商添加了中间件,自动执行所有内容协商头验证,并在无法处理请求时适当地响应。您可以使用Request::getRequestFormat方法获取中间件确定的响应格式。

$request->getRequestFormat($defaultFormat);

序列化器用法

conneg服务提供了一些自动序列化响应和反序列化请求的辅助函数。此功能在您可以通过$app["serializer"]访问JMS SerialzierSymfony Serializer的实例时可用。您可以从jdesrosiers/silex-jms-serializer-provider获取JMS Serializer,或从silex内置的SerializerServiceProvider获取Symfony Serializer。

$app->post("/foo", function (Request $request) use ($app) {
    // deserializeRequest takes the class name of a JMS Serializer annotated class and will deserialize
    // the request entity and give you back an instance of that class.
    $requestData = $app["conneg"]->deserializeRequest("FooRequest");

    $response = Foo::create($requestData);

    // createResponse works just like Respose::create, but takes a JMS Serializer annotated object
    // instead of a string and serializes it to the format the user requested.
    return $app["conneg"]->createResponse($response, 201, array(
        "Location" => "/foo/1234",
    ));
});