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.