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, Π°Π»Π΅ ΠΉΠΎΠ³ΠΎ ΠΎΠ±Ρ€ΠΎΠ±ΠΊΠ° ΠΏΠΎΠ²Π½Ρ–ΡΡ‚ΡŽ Π·Π°Π»Π΅ΠΆΠΈΡ‚ΡŒ Π²Ρ–Π΄ вас.

Наприклад, Π²ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Ρ–Ρ‚ΠΈ використати Π΄Π΅ΠΊΡ–Π»ΡŒΠΊΠ° Ρ€Ρ–Π²Π½Ρ–Π² ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ, Ρ‰ΠΎΠ± прСдставити Π½Π΅ΡƒΡΠΏΡ–ΡˆΠ½Ρ– обмСТСння ΠΏΠΎ-Ρ€Ρ–Π·Π½ΠΎΠΌΡƒ Ρƒ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Ρ–, Π·Π°Π»Π΅ΠΆΠ½ΠΎ Π²Ρ–Π΄ сСрйозності ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ.