Валідація вхідних параметрів

Summary

Classname

Assertions

Namespace

Ufo\RpcObject\RPC

Target

parameter

Constructor

use Symfony\Component\Validator\Constraint;

/**
 * Assertions constructor.
 *
 * @param Constraint[] $assertions
 * @param string $constructorArgs
 */
public function __construct(
    array $assertions, 
    public string $constructorArgs = ''
)
{
    // ...
}

Валідація вхідних параметрів

Замість того, щоб перевіряти чи відповідають вимогам бізнес-логіки параметри, що зайшли до вашого API методу, ви можете застосувати потужний механізм Symfony Validation, а точніше ви можете вказати вимоги до кожного параметру і RPC API Server сам провалідує вхідні дані, а в разі невідповідності поверне клієнту помилку (докладніше про обробку помилок).

Для того, щоб скористатися цією можливістю, ви маєте додати до параметра, який хочете провалідувати, атрибут #[RPC\Assertions], який являє собою контейнер-адаптер, що передає RPC серверу ваші очікування щодо вмісту параметра.

RPC\Assertions приймає абсолютно всі класи, що наслідують Symfony Constraint, і навіть ваші власні реалізації. Перелік тих, що вже є в Symfony.

namespace App\Api\Procedures;  
  
use Symfony\Component\Validator\Constraints as Assert;  
use Ufo\JsonRpcBundle\ApiMethod\Interfaces\IRpcService;  
use Ufo\RpcObject\RPC;  
  
class ExampleApi implements IRpcService  
{  
    public function sendEmail(  
        #[RPC\Assertions([  
            new Assert\Email(),  
        ])]  
        string $email,  
        #[RPC\Assertions([  
            new Assert\NotBlank(),  
            new Assert\Length(max: 100),  
        ])]  
        string $subject,  
        #[RPC\Assertions([  
            new Assert\NotBlank(),  
            new Assert\Length(min: 10),  
        ])]  
        string $text  
    ): bool   
    {  
        // some logic send email  
        return true;  
    }  
}

Помилка валідації

Усі порушення по всіх параметрах повертаються однією помилкою -32602 (ConstraintsImposedException). Повідомлення по кожному параметру лежать в error.data. Так само (з версії 10.1) повертаються відсутні обов'язкові параметри, параметри неправильного типу і значення, з яких не вдалося створити DTO.

{
    "jsonrpc": "2.0",
    "id": 1,
    "error": {
        "code": -32602,
        "message": "Invalid Data for call method: ExampleApi.sendEmail",
        "data": {
            "email": "This value is not a valid email address.",
            "text": "Required parameter \"text\" not passed"
        }
    }
}

Помилки всередині колекцій DTO прив'язуються до конкретного елемента (data[param][key]).

Обмеження в документації

Обмеження потрапляють у JSON Schema параметра в документації (наприклад, Length → minLength/maxLength, Choice з enum-callback → enum). Якщо в налаштуваннях увімкнено docs.validations.symfony_asserts, до параметра додається ще й перелік обмежень Symfony (x-ufo-assertions).

Вбудовані генератори схеми є для All, Choice, Collection, Date, Email, EqualTo, GreaterThan, GreaterThanOrEqual, Length, NotBlank, NotNull, Optional, Range, Regex, Uuid; інші обмеження перевіряються, але в схемі не відображаються.

Для власних обмежень можна додати генератор схеми: сервіс з тегом rpc.constraint, що реалізує Ufo\JsonRpcBundle\Validations\JsonSchema\Generate\Interfaces\IConstraintGenerator.