bilyiv/request-data-bundle

Represents request data in a structured and useful way.

Installs: 362

Dependents: 0

Suggesters: 0

Stars: 15

Watchers: 2

Forks: 2

Open Issues: 0

Type:symfony-bundle

v1.3.0 2019-03-26 17:19 UTC

README

This bundle allows you to represent request data in a structured and useful way by creating request data classes.

Features:

  • Detecting how to extract data depends on request method and Content-Type header.
  • Representing and normalizing query parameters for the GET request method.
  • Representing form, json, xml request body for the POST, PUT, PATCH request methods.
  • Defining supported formats and throwing exception if the request format is unsupported.
  • Dispatching the finish event when request data is ready.

Installation

Run the following command using Composer:

composer require bilyiv/request-data-bundle

Configuration

The default configuration is the following:

request_data:
    prefix: App\RequestData

Usage

Create a request data class

namespace App\RequestData;

class PostRequestData implements FormatSupportableInterface
{
    public const DEFAULT_AUTHOR = 'none';

    /**
     * @var string
     */
    public $title;

    /**
     * @var string
     */
    public $author = self::DEFAULT_AUTHOR;

    /**
     * {@inheritdoc}
     */
    public static function getSupportedFormats(): array
    {
        return [Formats::FORM, Formats::JSON, Formats::XML];
    }
}

Use it in your controller

namespace App\Controller;

class PostController extends AbstractController
{
    /**
     * @Route("/", name="action")
     */
    public function action(PostRequestData $data)
    {
       return new JsonResponse($data);
    }
}

Make requests

All the following requests will return the same json response:

{
    "title": "Hamlet",
    "author": "William Shakespeare"
}

GET request:

curl -X GET 'https://example.com?title=Hamlet&author=William+Shakespeare'

POST form request:

curl -X POST 'https://example.com' \
     -H 'Content-Type: application/x-www-form-urlencoded' \
     -d 'title=Hamlet&author=William+Shakespeare'

POST json request:

curl -X POST 'https://example.com' \
     -H 'Content-Type: application/json' \
     -d '{"title":"Hamlet","author":"William Shakespeare"}'

POST xml request:

curl -X POST 'https://example.com' \
     -H 'Content-Type: application/xml' \
     -d '<post><title>Hamlet</title><author>William Shakespeare</author></post>'

POST csv request throws an exception because of unsupported format:

curl -X POST 'https://example.com' \
     -H 'Content-Type: application/csv' \
     -d 'Hamlet,William Shakespeare'

License

This bundle is released under the MIT license. See the included LICENSE file for more information.