Новое в Symfony 4.3: JSON валидатор

JSON, пожалуй, наиболее часто используемый формат в приложениях, разработанных с помощью Symfony. Вы, вероятно, делаете запросы к API JSON и отправляете/получаете полезные данные JSON в своих проектах. Вот почему Symfony предоставляет класс JsonResponse, способ построения аутентификации JSON, полную поддержку JSON в компоненте Serializer, помощник json() для контроллеров и т. д.

В Symfony 4.3 улучшили компонент Validator, добавив новое ограничение Json, которое можно применять к свойствам и получателям, и обеспечили, чтобы данное содержимое было допустимым содержимым JSON:

Annotation

// src/Entity/Book.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Book
{
    /**
     * @Assert\Json(message = "This is not valid JSON")
     */
     protected $chapters;
}

YAML

# config/validator/validation.yaml
App\Entity\Book:
    properties:
        chapters:
            - Json:
                message: 'This is not valid JSON'

XML

<!-- config/validator/validation.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
    <class name="App\Entity\Book">
         <property name="chapters">
            <constraint name="Json">
                <option name="message">This is not valid JSON</option>
            </constraint>
        </property>
    </class>
</constraint-mapping>

PHP

// src/Entity/Book.php
namespace App\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;

class Book
{
    protected $chapters;

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('chapters', new Assert\Json(array(
            'message' => 'This is not valid JSON',
        )));
    }
}