Callback
ΠΠ°ΡΠ° ΠΎΠ½ΠΎΠ²Π»Π΅Π½Π½Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»Π°Π΄Ρ 2024-06-29
Callback
Π¦ΡΠ»Ρ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ Callback - ΡΡΠ²ΠΎΡΠΈΡΠΈ ΠΏΠΎΠ²Π½ΡΡΡΡ ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΡΠΊΡ ΠΏΡΠ°Π²ΠΈΠ»Π° Π²Π°Π»ΡΠ΄Π°ΡΡΡ ΡΠ° ΠΏΡΠΈΠ·Π½Π°ΡΠΈΡΠΈ Π±ΡΠ΄Ρ-ΡΠΊΡ ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ Π²Π°Π»ΡΠ΄Π°ΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈΠΌ ΠΏΠΎΠ»ΡΠΌ Π²Π°ΡΠΎΠ³ΠΎ ΠΎΠ±ΚΌΡΠΊΡΡ. Π―ΠΊΡΠΎ Π²ΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠ΅ Π²Π°Π»ΡΠ΄Π°ΡΡΡ Π· ΡΠΎΡΠΌΠ°ΠΌΠΈ, ΡΠ΅ ΠΎΠ·Π½Π°ΡΠ°Ρ, ΡΠΎ Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·ΡΠΎΠ±ΠΈΡΠΈ ΡΠ°ΠΊ, ΡΠΎΠ± ΡΡ ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΡΠΊΡ ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ Π²ΡΠ΄ΠΎΠ±ΡΠ°ΠΆΠ°Π»ΠΈΡΡ ΠΏΠΎΡΡΡ Π· ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈΠΌ ΠΏΠΎΠ»Π΅ΠΌ, Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π·Π²Π΅ΡΡ Ρ Π²Π°ΡΠΎΡ ΡΠΎΡΠΌΠΈ.
Π¦Π΅ΠΉ ΠΏΡΠΎΡΠ΅Ρ ΠΏΡΠ°ΡΡΡ ΡΠ»ΡΡ ΠΎΠΌ Π²ΠΊΠ°Π·Π°Π½Π½Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Π±ΠΎ Π±ΡΠ»ΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΡΠ² Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ, ΠΊΠΎΠΆΠ½ΠΈΠΉ Π· ΡΠΊΠΈΡ Π±ΡΠ΄Π΅ Π²ΠΈΠΊΠ»ΠΈΠΊΠ°Π½ΠΎ ΠΏΡΠ΄ ΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡ Π²Π°Π»ΡΠ΄Π°ΡΡΡ. ΠΠΎΠΆΠ½ΠΈΠΉ Π· ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΡΠ² ΠΌΠΎΠΆΠ΅ Π·ΡΠΎΠ±ΠΈΡΠΈ ΡΠΎ Π·Π°Π²Π³ΠΎΠ΄Π½ΠΎ, Π²ΠΊΠ»ΡΡΠ½ΠΎ Π·Ρ ΡΡΠ²ΠΎΡΠ΅Π½Π½ΡΠΌ ΡΠ° ΠΏΡΠΈΠ·Π½Π°ΡΠ΅Π½Π½ΡΠΌ ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ Π²Π°Π»ΡΠ΄Π°ΡΡΡ.
Note
ΠΠ΅ΡΠΎΠ΄ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ ΡΠ°ΠΌ ΠΏΠΎ ΡΠΎΠ±Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ Π½Π΅ΡΡΠΏΡΡΠ½ΠΈΠΌ Π°Π±ΠΎ ΠΏΠΎΠ²Π΅ΡΠ½ΡΡΠΈ ΡΠΊΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½Π½Ρ. ΠΠ°ΠΌΡΡΡΡ ΡΡΠΎΠ³ΠΎ, ΡΠΊ Π²ΠΈ ΠΏΠΎΠ±Π°ΡΠΈΡΠ΅ Ρ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ, ΠΌΠ΅ΡΠΎΠ΄ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ ΠΌΠ°Ρ Π·Π΄ΡΠ±Π½ΡΡΡΡ Π½Π°ΠΏΡΡΡΠΌΡ Π΄ΠΎΠ΄Π°ΡΠΈ "ΠΏΠΎΡΡΡΠ΅Π½Π½Ρ" Π²Π°Π»ΡΠ΄Π°ΡΠΎΡΠ°.
?????????????? ?? | ????? ??? ???????????/?????? |
???? | Callback |
????????? | CallbackValidator |
ΠΠΎΠ½ΡΡΠ³ΡΡΠ°ΡΡΡ
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// src/Entity/Author.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class Author
{
#[Assert\Callback]
public function validate(ExecutionContextInterface $context, mixed $payload): void
{
// ...
}
}
ΠΠ΅ΡΠΎΠ΄ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ
ΠΠ΅ΡΠΎΠ΄Ρ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡΡ ΡΠΏΠ΅ΡΡΠ°Π»ΡΠ½ΠΈΠΉ ΠΎΠ±ΚΌΡΠΊΡ ExecutionContextInterface
.
ΠΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠΈ "ΠΏΠΎΡΡΡΠ΅Π½Π½Ρ" ΠΏΡΡΠΌΠΎ Π² ΡΡΠΎΠΌΡ ΠΎΠ±ΚΌΡΠΊΡΡ ΡΠ° Π²ΠΈΠ·Π½Π°ΡΠΈΡΠΈ, Π΄ΠΎ ΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ
ΠΌΠ°ΡΡΡ Π±ΡΡΠΈ ΠΏΡΠΈΠΏΠΈΡΠ°Π½Ρ ΡΡ ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
// ...
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class Author
{
// ...
private string $firstName;
public function validate(ExecutionContextInterface $context, mixed $payload): void
{
// ΡΠΊΠΈΠΌΠΎΡΡ ΡΠΈΠ½ΠΎΠΌ Ρ Π²Π°Ρ Ρ ΠΌΠ°ΡΠΈΠ² "ΡΠ°Π»ΡΡΠΈΠ²ΠΈΡ
ΡΠΌΠ΅Π½"
$fakeNames = [/* ... */];
// ΠΏΠ΅ΡΠ΅Π²ΡΡΠΈΡΠΈ, ΡΠΈ Ρ ΡΠΌΚΌΡ Π΄ΡΠΉΡΠ½ΠΎ ΡΠ°Π»ΡΡΠΈΠ²ΠΈΠΌ
if (in_array($this->getFirstName(), $fakeNames)) {
$context->buildViolation('This name sounds totally fake!')
->atPath('firstName')
->addViolation();
}
}
}
Π‘ΡΠ°ΡΠΈΡΠ½Ρ Π·Π²ΠΎΡΠΎΡΠ½Ρ Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ
ΠΠΈ ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°ΡΠΈ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ Π·Ρ ΡΡΠ°ΡΠΈΡΠ½ΠΈΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ. Π’Π°ΠΊ ΡΠΊ ΡΡΠ°ΡΠΈΡΠ½Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π½Π΅ ΠΌΠ°ΡΡΡ Π΄ΠΎΡΡΡΠΏΡ Π΄ΠΎ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΎΠ±ΚΌΡΠΊΡΠ°, Π²ΠΎΠ½ΠΈ ΠΎΡΡΠΈΠΌΡΡΡΡ ΠΎΠ±ΚΌΡΠΊΡ Π² ΡΠΊΠΎΡΡΡ ΠΏΠ΅ΡΡΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ:
1 2 3 4 5 6 7 8 9 10 11 12 13
public static function validate(mixed $value, ExecutionContextInterface $context, mixed $payload): void
{
// ΡΠΊΠΈΠΌΠΎΡΡ ΡΠΈΠ½ΠΎΠΌ Ρ Π²Π°Ρ Ρ ΠΌΠ°ΡΠΈΠ² "ΡΠ°Π»ΡΡΠΈΠ²ΠΈΡ
ΡΠΌΠ΅Π½"
$fakeNames = [/* ... */];
// ΠΏΠ΅ΡΠ΅Π²ΡΡΠΈΡΠΈ, ΡΠΈ Ρ ΡΠΌΚΌΡ Π΄ΡΠΉΡΠ½ΠΎ ΡΠ°Π»ΡΡΠΈΠ²ΠΈΠΌ
if (in_array($value->getFirstName(), $fakeNames)) {
$context->buildViolation('This name sounds totally fake!')
->atPath('firstName')
->addViolation()
;
}
}
ΠΠΎΠ²Π½ΡΡΠ½Ρ Π·Π²ΠΎΡΠΎΡΠ½Ρ Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ ΡΠ° Π·Π°ΠΌΠΈΠΊΠ°Π½Π½Ρ
Π―ΠΊΡΠΎ Π²ΠΈ Ρ
ΠΎΡΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΠ½Π°ΡΠΈ ΡΡΠ°ΡΠΈΡΠ½ΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ, ΡΠΊΠΈΠΉ Π½Π΅ Π·Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡΡ Ρ
ΠΊΠ»Π°ΡΡ ΠΎΠ±ΚΌΡΠΊΡΠ°, ΡΠΎ Π²Π°Π»ΡΠ΄ΡΡΡΡΡΡ, Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠΎΠ½ΡΡΠ³ΡΡΡΠ²Π°ΡΠΈ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ ΡΠ°ΠΊ, ΡΠΎΠ± Π²ΠΎΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΈ
Π²ΠΈΠΊΠ»ΠΈΠΊΠ°Π½Π΅ ΠΌΠ°ΡΠΈΠ²Ρ, ΡΠΊ ΡΠ΅ ΠΏΡΠ΄ΡΡΠΈΠΌΡΠΌΡΡΡΡΡ PHP-ΡΡΠ½ΠΊΡΡΡΡ call_user_func.
Π£ΡΠ²ΡΡΡ, ΡΠΎΠ² Π²Π°ΡΠ° ΡΡΠ½ΠΊΡΡΡ Π²Π°Π»ΡΠ΄Π°ΡΡΡ - Acme\Validator::validate()
:
1 2 3 4 5 6 7 8 9 10 11
namespace Acme;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class Validator
{
public static function validate(mixed $value, ExecutionContextInterface $context, mixed $payload): void
{
// ...
}
}
ΠΠΎΡΡΠΌ Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°ΡΠΈ Π½Π°ΡΡΡΠΏΠ½Ρ ΠΊΠΎΠ½ΡΡΠ³ΡΡΠ°ΡΡΡ Π΄Π»Ρ Π²ΠΈΠΊΠ»ΠΈΠΊΡ ΡΡΠΎΠ³ΠΎ Π²Π°Π»ΡΠ΄Π°ΡΠΎΡΠ°:
1 2 3 4 5 6 7 8 9 10
// src/Entity/Author.php
namespace App\Entity;
use Acme\Validator;
use Symfony\Component\Validator\Constraints as Assert;
#[Assert\Callback([Validator::class, 'validate'])]
class Author
{
}
Note
ΠΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ Callback Π½Π΅ ΠΏΡΠ΄ΡΡΠΈΠΌΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½Ρ ΡΡΠ½ΠΊΡΡΡ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ, Ρ Π²ΠΊΠ°Π·Π°ΡΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½Ρ ΡΡΠ½ΠΊΡΡΡ Π°Π±ΠΎ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ΡΠ²ΡΡΡ Π² ΡΠΊΠΎΡΡΡ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ ΡΠ°ΠΊΠΎΠΆ Π½Π΅ΠΌΠΎΠΆΠ»ΠΈΠ²ΠΎ. Π©ΠΎΠ± Π²Π°Π»ΡΠ΄ΡΠ²Π°ΡΠΈ, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠΈ ΡΠ΅ΡΠ²ΡΡ, Π²ΠΈ ΠΌΠ°ΡΡΠ΅ ΡΡΠ²ΠΎΡΠΈΡΠΈ ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΡΠΊΠ΅ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ Π²Π°Π»ΡΠ΄Π°ΡΡΡ ΡΠ° Π΄ΠΎΠ΄Π°ΡΠΈ ΡΠ΅ Π½ΠΎΠ²Π΅ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ Ρ Π²Π°Ρ ΠΊΠ»Π°Ρ.
ΠΡΠΈ ΠΊΠΎΠ½ΡΡΠ³ΡΡΠ°ΡΡΡ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ ΡΠ΅ΡΠ΅Π· PHP, Π²ΠΈ ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΠ΅ΡΠ΅ΠΏ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π·Π°ΠΌΠΈΠΊΠ°Π½Π½Ρ Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// src/Entity/Author.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Mapping\ClassMetadata;
class Author
{
public static function loadValidatorMetadata(ClassMetadata $metadata): void
{
$callback = function (mixed $value, ExecutionContextInterface $context, mixed $payload): void {
// ...
};
$metadata->addConstraint(new Assert\Callback($callback));
}
}
Caution
ΠΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ Closure
ΡΠ°Π·ΠΎΠΌ Π· ΠΊΠΎΠ½ΡΡΠ³ΡΡΠ°ΡΡΡΡ Π°ΡΡΠΈΠ±ΡΡΡ Π²ΡΠ΄ΠΊΠ»ΡΡΡΡΡ ΠΊΠ΅Ρ Π°ΡΡΠΈΠ±ΡΡΡ Π΄Π»Ρ
ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡ/Π²Π»Π°ΡΡΠΈΠ²ΠΎΡΡΡ/ΠΌΠ΅ΡΠΎΠ΄Ρ, ΡΠ°ΠΊ ΡΠΊ Closure
Π½Π΅ ΠΌΠΎΠΆΠ½Π° ΠΊΠ΅ΡΡΠ²Π°ΡΠΈ. ΠΠ»Ρ ΠΊΡΠ°ΡΠΎΡ
ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½ΠΎ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΠ°ΡΠΈΡΠ½ΠΎΠ³ΠΎ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ.
ΠΠΏΡΡΡ
callback
ΡΠΈΠΏ: string
, array
Π°Π±ΠΎ Closure
[ΠΎΠΏΡΡΡ Π·Π° Π·Π°ΠΌΠΎΠ²ΡΡΠ²Π°Π½Π½ΡΠΌ ]
ΠΠΏΡΡΡ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ ΠΏΡΠΈΠΉΠΌΠ°Ρ ΡΡΠΈ ΡΡΠ·Π½ΠΈΡ ΡΠΎΡΠΌΠ°ΡΠΈ Π΄Π»Ρ Π²ΠΊΠ°Π·Π°Π½Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ:
- Π ΡΠ΄ΠΎΠΊ, ΡΠΎ ΠΌΡΡΡΠΈΡΡ ΡΠΌΚΌΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π°Π±ΠΎ ΡΡΠ°ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ;
- ΠΠΈΠΊΠ»ΠΈΡΠ½Π΅ ΠΌΠ°ΡΠΈΠ²Ρ Ρ ΡΠΎΡΠΌΠ°ΡΡ
array('<Class>', '<method>')
; - ΠΠ°ΠΌΠΈΠΊΠ°Π½Π½Ρ.
ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½Ρ Π·Π²ΠΎΡΠΎΡΠ½Ρ Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ ΠΎΡΡΠΈΠΌΡΡΡΡ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ExecutionContextInterface Π² ΡΠΊΠΎΡΡΡ ΡΠ΄ΠΈΠ½ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ.
Π‘ΡΠ°ΡΠΈΡΠ½Ρ Π°Π±ΠΎ Π·Π°ΠΌΠΈΠΊΠ°ΡΡΡ Π·Π²ΠΎΡΠΎΡΠ½Ρ Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ ΠΎΡΡΠΈΠΌΡΡΡΡ Π²Π°Π»ΡΠ΄ΠΎΠ²Π°Π½ΠΈΠΉ ΠΎΠ±ΚΌΡΠΊΡ Π² ΡΠΊΠΎΡΡΡ ΠΏΠ΅ΡΡΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, Π° Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ExecutionContextInterface - Π² ΡΠΊΠΎΡΡΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ.
ΠΠ°ΡΠ° ΠΎΠ½ΠΎΠ²Π»Π΅Π½Π½Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»Π°Π΄Ρ 2023-09-24
groups
ΡΠΈΠΏ: array
| string
Π·Π° Π·Π°ΠΌΠΎΠ²ΡΡΠ²Π°Π½Π½ΡΠΌ: null
ΠΠΈΠ·Π½Π°ΡΠ°Ρ Π³ΡΡΠΏΡ Π°Π±ΠΎ Π³ΡΡΠΏΠΈ Π²Π°Π»ΡΠ΄Π°ΡΡΡ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ. ΠΡΠΎΡΠΈΡΠ°ΠΉΡΠ΅ Π±ΡΠ»ΡΡΠ΅ ΠΏΡΠΎ Π³ΡΡΠΏΠΈ Π²Π°Π»ΡΠ΄Π°ΡΡΡ.
ΠΠ°ΡΠ° ΠΎΠ½ΠΎΠ²Π»Π΅Π½Π½Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»Π°Π΄Ρ 2024-05-29
payload
ΡΠΈΠΏ: mixed
Π·Π° Π·Π°ΠΌΠΎΠ²ΡΡΠ²Π°Π½Π½ΡΠΌ: null
Π¦Ρ ΠΎΠΏΡΡΡ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π°, ΡΠΎΠ± Π΄ΠΎΠ΄Π°ΡΠΈ Π΄ΠΎΠ²ΡΠ»ΡΠ½Ρ Π΄Π°Π½Ρ, ΡΠΏΠ΅ΡΠΈΡΡΡΠ½Ρ Π΄Π»Ρ Π΄ΠΎΠΌΠ΅Π½Ρ, Π΄ΠΎ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ. Π‘ΠΊΠΎΠ½ΡΡΠ³ΡΡΠΎΠ²Π°Π½Π΅ ΠΊΠΎΡΠΈΡΠ½Π΅ Π½Π°Π²Π°Π½ΡΠ°ΠΆΠ΅Π½Π½Ρ Π½Π΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ Validator, Π°Π»Π΅ ΠΉΠΎΠ³ΠΎ ΠΎΠ±ΡΠΎΠ±ΠΊΠ° ΠΏΠΎΠ²Π½ΡΡΡΡ Π·Π°Π»Π΅ΠΆΠΈΡΡ Π²ΡΠ΄ Π²Π°Ρ.
ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Ρ ΠΎΡΡΡΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°ΡΠΈ Π΄Π΅ΠΊΡΠ»ΡΠΊΠ° ΡΡΠ²Π½ΡΠ² ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ, ΡΠΎΠ± ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠΈ Π½Π΅ΡΡΠΏΡΡΠ½Ρ ΠΎΠ±ΠΌΠ΅ΠΆΠ΅Π½Π½Ρ ΠΏΠΎ-ΡΡΠ·Π½ΠΎΠΌΡ Ρ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Ρ, Π·Π°Π»Π΅ΠΆΠ½ΠΎ Π²ΡΠ΄ ΡΠ΅ΡΠΉΠΎΠ·Π½ΠΎΡΡΡ ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ.