diff --git a/README.md b/README.md
index a99a2a1a27eb623e0ddd8d1dc6f8e9ad995da46f..362f2960e4d28895dde5c1c00ddbf88f7ef11f76 100644
--- a/README.md
+++ b/README.md
@@ -41,6 +41,21 @@
 
 ## Инструкция
 
+## Kafka
+<details>
+<summary>Инструкция</summary>
+
+1. Создание топика
+   1. Запустить команду - `make create-kafka-topic`
+2. Запуск воркера
+   1. Перейти в командную строку php - `make shell`
+   2. Запустить команду - `bin/console messenger:consume send_transport`
+3. Остановка воркера
+   1. Перейти в командную строку php - `make shell`
+   2. Запустить команду - `bin/console messenger:stop-workers`
+
+</details>
+
 ## Настройка Xdebug (PHPStorm)
 <details>
 <summary>Инструкция</summary>
diff --git a/app/config/packages/security.yaml b/app/config/packages/security.yaml
index 37c76cf6cff9308a7408e42bc197bad85b5666ed..ffde54bbe1acd25dc1c8a6462b46234216df4561 100644
--- a/app/config/packages/security.yaml
+++ b/app/config/packages/security.yaml
@@ -49,9 +49,9 @@ security:
         - { path: ^/api/register/send, roles: ROLE_USER }
         - { path: ^/api/register/check, roles: ROLE_USER }
 
+        - { path: ^/api/password/reset/check, roles: PUBLIC_ACCESS }
         - { path: ^/api/password/reset, roles: ROLE_USER }
         - { path: ^/api/password/send, roles: PUBLIC_ACCESS }
-        - { path: ^/api/password/reset/check, roles: PUBLIC_ACCESS }
 
         - { path: ^/api/profile/recovery, roles: PUBLIC_ACCESS }
         - { path: ^/api/profile/recovery/check, roles: PUBLIC_ACCESS }
diff --git a/app/config/services.yaml b/app/config/services.yaml
index 43d8e480779bb893f7497d9388dd953ee6539801..02884eb17e3bae4741b0165e463a6f60db3e9f74 100644
--- a/app/config/services.yaml
+++ b/app/config/services.yaml
@@ -25,67 +25,10 @@ services:
             - '../src/Entity/'
             - '../src/Kernel.php'
 
-    # Сервисы действий
-    App\Service\Action\ActionServiceInterface $registerService: '@App\Service\Action\Classes\Register'
-
-    App\Service\Action\ActionServiceInterface $profileService: '@App\Service\Action\Classes\GetProfile'
-
-    App\Service\Action\ActionServiceInterface $deleteProfileService: '@App\Service\Action\Classes\DeleteProfile'
-
-    App\Service\Action\ActionServiceInterface $recoveryProfileService: '@App\Service\Action\Classes\RecoveryProfile'
-
-    App\Service\Action\ActionServiceInterface $checkRegisterService: '@App\Service\Action\Classes\CheckRegisterCode'
-
-    App\Service\Action\ActionServiceInterface $checkRecoveryService: '@App\Service\Action\Classes\CheckRecoveryCode'
-
-    App\Service\Action\ActionServiceInterface $sendRegisterService: '@App\Service\Action\Classes\SendRegisterCode'
-
-    App\Service\Action\ActionServiceInterface $sendPasswordCodeService: '@App\Service\Action\Classes\SendResetPasswordCode'
-
-    App\Service\Action\ActionServiceInterface $resetPasswordCodeService: '@App\Service\Action\Classes\ResetPasswordCode'
-
-    App\Service\Action\ActionServiceInterface $resetPasswordService: '@App\Service\Action\Classes\ResetPassword'
-
-    App\Service\Action\ActionServiceInterface $profileChangeService: '@App\Service\Action\Classes\ChangeProfile'
-
-    App\Service\Action\ActionServiceInterface $resetEmailService: '@App\Service\Action\Classes\ResetEmail'
-
-    App\Service\Action\ActionServiceInterface $deleteImageService: '@App\Service\Action\Classes\DeleteImage'
-
-    App\Service\Action\ActionServiceInterface $saveImageService: '@App\Service\Action\Classes\SaveImage'
-
     App\Service\Action\Classes\SaveImage:
         arguments:
             $targetDirectory: '%images_directory%'
 
-    App\Service\Action\ActionServiceInterface: '@App\Service\Action\Classes\None'
-
-
-    # Сервисы Dto
-    App\Service\Dto\DtoServiceInterface $registerDto: '@App\Service\Dto\Classes\RegisterDto'
-
-    App\Service\Dto\DtoServiceInterface $registerCodeDto: '@App\Service\Dto\Classes\RegisterCodeDto'
-
-    App\Service\Dto\DtoServiceInterface $recoveryCodeDto: '@App\Service\Dto\Classes\RecoveryCodeDto'
-
-    App\Service\Dto\DtoServiceInterface $passwordResetDto: '@App\Service\Dto\Classes\ResetPasswordCodeDto'
-
-    App\Service\Dto\DtoServiceInterface $passwordDto: '@App\Service\Dto\Classes\ChangePasswordDto'
-
-    App\Service\Dto\DtoServiceInterface $profileDto: '@App\Service\Dto\Classes\ChangeProfileDto'
-
-    App\Service\Dto\DtoServiceInterface $recoveryDto: '@App\Service\Dto\Classes\RecoveryDto'
-
-    App\Service\Dto\DtoServiceInterface $imageDto: '@App\Service\Dto\Classes\ImageDto'
-
-    App\Service\Dto\DtoServiceInterface: '@App\Service\Dto\Classes\NoneDto'
-
-
-    # Сервисы ответа
-    App\Service\Response\ResponseServiceInterface $profileResponse: '@App\Service\Response\Classes\ProfileResponse'
-
-    App\Service\Response\ResponseServiceInterface: '@App\Service\Response\Classes\Response'
-
 
     # Сервис отправки
     App\Service\Send\SendService:
@@ -93,13 +36,9 @@ services:
             $confirmType: '%confirm_type%'
             $fromEmail: '%from_email%'
 
-    App\Service\Send\SendServiceInterface $codeSendService: '@App\Service\Send\Classes\CodeSendService'
-
-    App\Service\Send\SendServiceInterface $registerCodeSendService: '@App\Service\Send\Classes\Code\RegisterCodeSendService'
-
-    App\Service\Send\SendServiceInterface $recoveryCodeSendService: '@App\Service\Send\Classes\Code\RecoveryCodeSendService'
-
-    App\Service\Send\SendServiceInterface $passwordCodeSendService: '@App\Service\Send\Classes\Code\PasswordCodeSendService'
+    App\Listeners\KernelExceptionListener:
+        tags:
+            - { name: kernel.event_listener, event: kernel.exception }
 
     # События JWT авторизации
     acme_api.event.authentication_success_listener:
diff --git a/app/src/Controller/AuthController.php b/app/src/Controller/AuthController.php
index 9135e2a08ee0da5238ccdd9314ee8d5c057210b5..cc257a82f2799eadc67f039c17c7b204cbce74fa 100644
--- a/app/src/Controller/AuthController.php
+++ b/app/src/Controller/AuthController.php
@@ -11,6 +11,7 @@ use App\Service\Dto\Classes\ResetPasswordCodeDto;
 use App\Service\Response\Classes\Response;
 use Nelmio\ApiDocBundle\Annotation\Model;
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\Routing\Attribute\Route;
 use OpenApi\Attributes as OA;
@@ -31,18 +32,20 @@ class AuthController extends AbstractController
         content: new OA\JsonContent(ref: new Model(type: RegisterDto::class))
     )]
     public function register(
-        ActionServiceInterface $registerService
+        #[Autowire(service: 'action.register')]
+        ActionServiceInterface $actionService
     ): JsonResponse
     {
-        return $registerService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/register/send', name: 'register_send', methods: ['GET'])]
     public function sendRegisterCode(
-        ActionServiceInterface $sendRegisterService,
+        #[Autowire(service: 'action.register.send')]
+        ActionServiceInterface $actionService,
     ): JsonResponse
     {
-        return $sendRegisterService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/register/check', name: 'register_check', methods: ['POST'])]
@@ -50,36 +53,46 @@ class AuthController extends AbstractController
         content: new OA\JsonContent(ref: new Model(type: RegisterCodeDto::class))
     )]
     public function checkRegisterCode(
-        ActionServiceInterface $checkRegisterService
+        #[Autowire(service: 'action.register.code')]
+        ActionServiceInterface $actionService
     ): JsonResponse
     {
-        return $checkRegisterService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/password/reset', name: 'password_reset', methods: ['POST'])]
     #[OA\RequestBody(
         content: new OA\JsonContent(ref: new Model(type: ChangePasswordDto::class))
     )]
-    public function resetPassword(ActionServiceInterface $resetPasswordService): JsonResponse
+    public function resetPassword(
+        #[Autowire(service: 'action.reset.password.change')]
+        ActionServiceInterface $actionService
+    ): JsonResponse
     {
-        return $resetPasswordService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/password/send', name: 'password_send', methods: ['POST'])]
     #[OA\RequestBody(
         content: new OA\JsonContent(ref: new Model(type: RecoveryDto::class))
     )]
-    public function sendResetPassword(ActionServiceInterface $sendPasswordCodeService): JsonResponse
+    public function sendResetPassword(
+        #[Autowire(service: 'action.reset.password.send')]
+        ActionServiceInterface $actionService
+    ): JsonResponse
     {
-        return $sendPasswordCodeService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/password/reset/check', name: 'password_reset_check', methods: ['POST'])]
     #[OA\RequestBody(
         content: new OA\JsonContent(ref: new Model(type: ResetPasswordCodeDto::class))
     )]
-    public function resetCheckPassword(ActionServiceInterface $resetPasswordCodeService): JsonResponse
+    public function resetCheckPassword(
+        #[Autowire(service: 'action.reset.password.code')]
+        ActionServiceInterface $actionService
+    ): JsonResponse
     {
-        return $resetPasswordCodeService->getResponse();
+        return $actionService->getResponse();
     }
 }
diff --git a/app/src/Controller/ProfileController.php b/app/src/Controller/ProfileController.php
index dda47fcff78a10ff0f4f31820c0df1f3e3453be4..2f9448814b83803201199e561c3edde09a81374d 100644
--- a/app/src/Controller/ProfileController.php
+++ b/app/src/Controller/ProfileController.php
@@ -11,6 +11,7 @@ use App\Service\Response\Classes\ProfileResponse;
 use App\Service\Response\Classes\Response;
 use Nelmio\ApiDocBundle\Annotation\Model;
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\Routing\Attribute\Route;
 use OpenApi\Attributes as OA;
@@ -28,10 +29,11 @@ class ProfileController extends AbstractController
         )
     )]
     public function profile(
-        ActionServiceInterface $profileService
+        #[Autowire(service: 'action.profile')]
+        ActionServiceInterface $actionService
     ): JsonResponse
     {
-        return $profileService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/profile/delete', name: 'profile_delete', methods: ['GET'])]
@@ -43,10 +45,11 @@ class ProfileController extends AbstractController
         )
     )]
     public function deleteProfile(
-        ActionServiceInterface $deleteProfileService,
+        #[Autowire(service: 'action.profile.delete')]
+        ActionServiceInterface $actionService,
     ): JsonResponse
     {
-        return $deleteProfileService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/profile/recovery', name: 'profile_recovery', methods: ['POST'])]
@@ -61,10 +64,11 @@ class ProfileController extends AbstractController
         )
     )]
     public function recoveryProfile(
-        ActionServiceInterface $recoveryProfileService,
+        #[Autowire(service: 'action.recovery.send')]
+        ActionServiceInterface $actionService,
     ): JsonResponse
     {
-        return $recoveryProfileService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/profile/recovery/check', name: 'profile_recovery_check', methods: ['POST'])]
@@ -79,10 +83,11 @@ class ProfileController extends AbstractController
         )
     )]
     public function recoveryCodeProfile(
-        ActionServiceInterface $checkRecoveryService,
+        #[Autowire(service: 'action.recovery.code')]
+        ActionServiceInterface $actionService,
     ): JsonResponse
     {
-        return $checkRecoveryService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/profile/change', name: 'profile_change', methods: ['POST'])]
@@ -97,10 +102,11 @@ class ProfileController extends AbstractController
         )
     )]
     public function changeProfile(
-        ActionServiceInterface $profileChangeService,
+        #[Autowire(service: 'action.profile.change')]
+        ActionServiceInterface $actionService,
     ): JsonResponse
     {
-        return $profileChangeService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/profile/reset/email', name: 'profile_reset_email', methods: ['GET'])]
@@ -112,10 +118,11 @@ class ProfileController extends AbstractController
         )
     )]
     public function resetLastConfirmEmail(
-        ActionServiceInterface $resetEmailService,
+        #[Autowire(service: 'action.reset.email')]
+        ActionServiceInterface $actionService,
     ): JsonResponse
     {
-        return $resetEmailService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/profile/image', name: 'profile_image', methods: ['POST'])]
@@ -130,10 +137,11 @@ class ProfileController extends AbstractController
         )
     )]
     public function saveImage(
-        ActionServiceInterface $saveImageService,
+        #[Autowire(service: 'action.profile.image.save')]
+        ActionServiceInterface $actionService,
     ): JsonResponse
     {
-        return $saveImageService->getResponse();
+        return $actionService->getResponse();
     }
 
     #[Route('/profile/image/delete', name: 'profile_image_delete', methods: ['GET'])]
@@ -145,9 +153,10 @@ class ProfileController extends AbstractController
         )
     )]
     public function deleteImage(
-        ActionServiceInterface $deleteImageService,
+        #[Autowire(service: 'action.profile.image.delete')]
+        ActionServiceInterface $actionService,
     ): JsonResponse
     {
-        return $deleteImageService->getResponse();
+        return $actionService->getResponse();
     }
 }
diff --git a/app/src/Entity/User.php b/app/src/Entity/User.php
index 2082aa3a28ce85026058de1428e4346b9e05a6e3..348b043e42771781be5de044820ca04043e80c65 100644
--- a/app/src/Entity/User.php
+++ b/app/src/Entity/User.php
@@ -87,7 +87,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
         return $this->id;
     }
 
-    #[Groups(['all', 'profile', 'edit', 'card', 'detail'])]
+    #[Groups(['all', 'profile', 'edit', 'card', 'detail', 'listen'])]
     public function getEmail(): ?string
     {
         return $this->email;
@@ -146,7 +146,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
     /**
      * @see PasswordAuthenticatedUserInterface
      */
-    #[Groups(['all'])]
+    #[Groups(['all', 'listen'])]
     public function getPassword(): string
     {
         return $this->password;
@@ -168,7 +168,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
         // $this->plainPassword = null;
     }
 
-    #[Groups(['all', 'profile', 'edit'])]
+    #[Groups(['all', 'profile', 'edit', 'listen'])]
     public function getName(): ?string
     {
         return $this->name;
@@ -181,7 +181,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
         return $this;
     }
 
-    #[Groups(['all', 'profile', 'edit'])]
+    #[Groups(['all', 'profile', 'edit', 'listen'])]
     public function getSurname(): ?string
     {
         return $this->surname;
@@ -194,7 +194,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
         return $this;
     }
 
-    #[Groups(['all', 'profile', 'edit'])]
+    #[Groups(['all', 'profile', 'edit', 'listen'])]
     public function getPatronymic(): ?string
     {
         return $this->patronymic;
@@ -207,7 +207,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
         return $this;
     }
 
-    #[Groups(['all', 'profile', 'edit'])]
+    #[Groups(['all', 'profile', 'edit', 'listen'])]
     public function getPhoneNumber(): ?string
     {
         return $this->phone_number;
@@ -220,7 +220,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
         return $this;
     }
 
-    #[Groups(['all', 'profile', 'edit'])]
+    #[Groups(['all', 'profile', 'edit', 'listen'])]
     public function getImage(): ?UserImage
     {
         return $this->image;
@@ -243,7 +243,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
         return $this;
     }
 
-    #[Groups(['all', 'profile', 'edit'])]
+    #[Groups(['all', 'profile', 'edit', 'listen'])]
     public function isConfirm(): ?bool
     {
         return $this->confirm;
@@ -256,7 +256,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
         return $this;
     }
 
-    #[Groups(['all', 'profile', 'edit'])]
+    #[Groups(['all', 'profile', 'edit', 'listen'])]
     public function isDeleted(): ?bool
     {
         return $this->deleted;
@@ -353,7 +353,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
      * @return self
      */
     #[Ignore()]
-    public static function createByArray(array $data, array $groups = ['edit']): ?self
+    public static function createByArray(array $data, array $groups = ['listen']): ?self
     {
         try {
             $normalizer = new ObjectNormalizer(
@@ -380,7 +380,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
     }
 
     #[Ignore()]
-    public function newCopy(array $groups = ['edit']): ?self
+    public function newCopy(array $groups = ['listen']): ?self
     {
         $normalizer = new ObjectNormalizer(
             new ClassMetadataFactory(new AttributeLoader()),
diff --git a/app/src/Entity/UserHistory.php b/app/src/Entity/UserHistory.php
index 887b4b90da1be7d3b2bae3294a28824783b87b5a..3cf93def581c33585fe33a42911b65e3b4db13c4 100644
--- a/app/src/Entity/UserHistory.php
+++ b/app/src/Entity/UserHistory.php
@@ -129,6 +129,9 @@ class UserHistory
         $type = $this->getType();
 
         switch ($field = $this->getField()) {
+            case 'password':
+                $text = 'Пароль изменен';
+                break;
             case 'image':
                 switch ($type) {
                     case self::TYPE_CREATE:
diff --git a/app/src/Listeners/KernelExceptionListener.php b/app/src/Listeners/KernelExceptionListener.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9ef3ccaf9ddbb5ca66d428ee6d4a6ce3a95c5ca
--- /dev/null
+++ b/app/src/Listeners/KernelExceptionListener.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Listeners;
+
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Event\ExceptionEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+class KernelExceptionListener
+{
+    public static function getSubscribedEvents()
+    {
+        return [
+            KernelEvents::EXCEPTION => 'onKernelException',
+        ];
+    }
+
+    public function onKernelException(ExceptionEvent $event)
+    {
+        $response = new \App\Service\Response\Classes\Response();
+        $response->setStatusCode(Response::HTTP_FORBIDDEN);
+        $response->addError($event->getThrowable()->getMessage());
+        $event->setResponse($response->getResponse());
+    }
+}
\ No newline at end of file
diff --git a/app/src/Listeners/UserListener.php b/app/src/Listeners/UserListener.php
index 7af6d636b158c0c349558825fff9db75d920e888..9c2ae4299124bfa4d6c582e9a76f4a342c3a141e 100644
--- a/app/src/Listeners/UserListener.php
+++ b/app/src/Listeners/UserListener.php
@@ -107,6 +107,12 @@ class UserListener
                     $newUserHistory->setField('confirm');
                     $user->addUserHistory($newUserHistory);
                 }
+                if ($userExists->getPassword() !== $user->getPassword()) {
+                    $newUserHistory = new UserHistory();
+                    $newUserHistory->setType(UserHistory::TYPE_UPDATE);
+                    $newUserHistory->setField('password');
+                    $user->addUserHistory($newUserHistory);
+                }
             }
         } else {
             $newUserHistory = new UserHistory();
diff --git a/app/src/Service/Action/ActionServiceInterface.php b/app/src/Service/Action/ActionServiceInterface.php
index 0f16176eb57cd3c57ce0817780ead00ca2c2a3d4..f3e7391efa2de1748977f76a248ef86f5b0038d5 100644
--- a/app/src/Service/Action/ActionServiceInterface.php
+++ b/app/src/Service/Action/ActionServiceInterface.php
@@ -2,6 +2,10 @@
 
 namespace App\Service\Action;
 
+use App\Service\Dto\DtoServiceInterface;
+use App\Service\Response\ResponseServiceInterface;
+use App\Service\Send\SendServiceInterface;
+use Doctrine\Persistence\ManagerRegistry;
 use Symfony\Component\HttpFoundation\JsonResponse;
 
 interface ActionServiceInterface
@@ -11,4 +15,14 @@ interface ActionServiceInterface
     public function runAction(): void;
 
     public function validate(): bool;
+
+    public function customValidate(): bool;
+
+    public function initResponse(ResponseServiceInterface $responseService): void;
+
+    public function initDto(DtoServiceInterface $dtoService): void;
+
+    public function initDoctrine(ManagerRegistry $doctrine): void;
+
+    public function initSend(SendServiceInterface $sendService): void;
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/BaseActionService.php b/app/src/Service/Action/BaseActionService.php
index 97235c59f78a0c2c3b5068bcdb3336896b18dd8c..df831f0f045346abc7fb36203557f3553a27863b 100644
--- a/app/src/Service/Action/BaseActionService.php
+++ b/app/src/Service/Action/BaseActionService.php
@@ -2,21 +2,54 @@
 
 namespace App\Service\Action;
 
+use App\Service\Dto\DtoServiceInterface;
 use App\Service\Response\Classes\Response;
 use App\Service\Response\ResponseServiceInterface;
+use App\Service\Send\SendServiceInterface;
+use Doctrine\Persistence\ManagerRegistry;
 use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Contracts\Service\Attribute\Required;
 
 abstract class BaseActionService implements ActionServiceInterface
 {
     protected ?ResponseServiceInterface $responseService;
 
-    public function __construct(
-        ResponseServiceInterface $baseResponseService,
-    )
+    protected ?DtoServiceInterface $dtoService;
+
+    protected ?ManagerRegistry $doctrine;
+
+    protected ?SendServiceInterface $sendService;
+
+    #[Required]
+    public function initResponse(
+        ResponseServiceInterface $responseService
+    ): void
+    {
+        $this->responseService = $responseService;
+    }
+
+    #[Required]
+    public function initDto(
+        DtoServiceInterface $dtoService
+    ): void
     {
-        $this->responseService = $baseResponseService;
+        $this->dtoService = $dtoService;
     }
 
+    #[Required]
+    public function initDoctrine(ManagerRegistry $doctrine): void
+    {
+        $this->doctrine = $doctrine;
+    }
+
+    #[Required]
+    public function initSend(SendServiceInterface $sendService): void
+    {
+        $this->sendService = $sendService;
+    }
+
+    abstract public function needDto(): bool;
+
     public function getResponse(): JsonResponse
     {
         if ($this->validate()) {
@@ -31,4 +64,33 @@ abstract class BaseActionService implements ActionServiceInterface
         $response->addError('Ошибка получения ответа');
         return $response->getResponse();
     }
+
+    protected function getDto(): ?DtoServiceInterface
+    {
+        if ($this->dtoService) {
+            return $this->dtoService->getClass();
+        }
+
+        return null;
+    }
+
+    public function validate(): bool
+    {
+        $valid = true;
+
+        if ($this->needDto() && $this->dtoService) {
+            $valid = $this->dtoService->validate($this->responseService);
+        }
+
+        if ($valid) {
+            $valid = $this->customValidate();
+        }
+
+        return $valid;
+    }
+
+    public function customValidate(): bool
+    {
+        return true;
+    }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/ChangeProfile.php b/app/src/Service/Action/Classes/ChangeProfile.php
index 62d1ef0f2c9dafa26813a204376cbf7c3cf4d53c..9c155d8fedd7b5f2924e42efd68f6658c35cc2ec 100644
--- a/app/src/Service/Action/Classes/ChangeProfile.php
+++ b/app/src/Service/Action/Classes/ChangeProfile.php
@@ -3,32 +3,37 @@
 namespace App\Service\Action\Classes;
 
 use App\Entity\User;
-use App\Service\Action\BaseActionService;
+use App\Service\Action\UserBaseActionService;
 use App\Service\Dto\Classes\ChangeProfileDto;
 use App\Service\Dto\DtoServiceInterface;
 use App\Service\Response\ResponseServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
-use Symfony\Bundle\SecurityBundle\Security;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
+use Symfony\Contracts\Service\Attribute\Required;
 
-class ChangeProfile extends BaseActionService
+#[AsAlias(id: 'action.profile.change', public: true)]
+class ChangeProfile extends UserBaseActionService
 {
-    private ?User $user;
-
-    public function __construct(
-        private ResponseServiceInterface $profileResponse,
-        private DtoServiceInterface      $profileDto,
-        private ManagerRegistry          $doctrine,
-        Security                         $security
-    )
+    #[Required] public function initResponse(
+        #[Autowire(service: 'response.profile')]
+        ResponseServiceInterface $responseService
+    ): void
     {
-        $this->user = $security->getUser();
-        parent::__construct($profileResponse);
+        parent::initResponse($responseService);
+    }
+
+    #[Required] public function initDto(
+        #[Autowire(service: 'dto.profile.change')]
+        DtoServiceInterface $dtoService
+    ): void
+    {
+        parent::initDto($dtoService);
     }
 
     public function runAction(): void
     {
         /** @var ChangeProfileDto $dto */
-        $dto = $this->profileDto->getClass();
+        $dto = $this->getDto();
 
         /** @var ?User $userExists */
         $userExists = $this->doctrine->getRepository(User::class)
@@ -36,11 +41,11 @@ class ChangeProfile extends BaseActionService
 
         if ($userExists !== null) {
             if ($userExists->getEmail() === $dto->email) {
-                $this->profileResponse->addError('Email занят другим пользователем');
+                $this->responseService->addError('Email занят другим пользователем');
             } elseif ($userExists->getPhoneNumber() === $dto->phoneNumber) {
-                $this->profileResponse->addError('Номер телефона занят другим пользователем');
+                $this->responseService->addError('Номер телефона занят другим пользователем');
             } else {
-                $this->profileResponse->addError('Email или номер телефона занят другим пользователем');
+                $this->responseService->addError('Email или номер телефона занят другим пользователем');
             }
         } else {
             $changed = false;
@@ -65,7 +70,7 @@ class ChangeProfile extends BaseActionService
                 $changed = true;
             }
 
-            if ($dto->email !== null  && $dto->email !== $this->user->getEmail()) {
+            if ($dto->email !== null && $dto->email !== $this->user->getEmail()) {
                 $this->user->setEmail($dto->email);
                 $changed = true;
             }
@@ -75,22 +80,28 @@ class ChangeProfile extends BaseActionService
                     $em = $this->doctrine->getManager();
                     $em->persist($this->user);
                     $em->flush();
-                    $this->profileResponse->setData($this->user);
+                    $this->responseService->setData($this->user);
                 } catch (\Exception $e) {
-                    $this->profileResponse->addError('Ошибка сохранения профиля');
+                    $this->responseService->addError('Ошибка сохранения профиля');
                 }
             } else {
-                $this->profileResponse->setData($this->user);
+                $this->responseService->setData($this->user);
             }
         }
     }
 
-    public function validate(): bool
+    public function checkDelete(): bool
     {
-        if ($this->user === null) {
-            $this->profileResponse->addError('Вы не авторизованы');
-            return false;
-        }
-        return $this->profileDto->validate($this->profileResponse);
+        return true;
+    }
+
+    public function checkConfirm(): bool
+    {
+        return false;
+    }
+
+    public function needDto(): bool
+    {
+        return true;
     }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/CheckRecoveryCode.php b/app/src/Service/Action/Classes/CheckRecoveryCode.php
index 4a1d3a0e1dc4e6b63e8f529408de91d75dad2510..afdfff91a5629a1f008c6fb13d7c6a65c8f5d717 100644
--- a/app/src/Service/Action/Classes/CheckRecoveryCode.php
+++ b/app/src/Service/Action/Classes/CheckRecoveryCode.php
@@ -6,20 +6,22 @@ use App\Entity\User;
 use App\Service\Action\BaseActionService;
 use App\Service\Dto\Classes\RecoveryCodeDto;
 use App\Service\Dto\DtoServiceInterface;
-use App\Service\Response\ResponseServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
+use Symfony\Contracts\Service\Attribute\Required;
 
+#[AsAlias(id: 'action.recovery.code', public: true)]
 class CheckRecoveryCode extends BaseActionService
 {
-    public function __construct(
-        private DtoServiceInterface      $recoveryCodeDto,
-        private ResponseServiceInterface $response,
-        private ManagerRegistry          $doctrine,
-    )
+    #[Required] public function initDto(
+        #[Autowire(service: 'dto.recovery.code')]
+        DtoServiceInterface $dtoService
+    ): void
     {
-        parent::__construct($response);
+        parent::initDto($dtoService);
     }
 
+
     /**
      * Восстановление учетной записи по коду
      *
@@ -28,7 +30,7 @@ class CheckRecoveryCode extends BaseActionService
     public function runAction(): void
     {
         /** @var RecoveryCodeDto $dto */
-        $dto = $this->recoveryCodeDto->getClass();
+        $dto = $this->getDto();
         /** @var User $userExists */
         $userExists = $this->doctrine->getRepository(User::class)
             ->findOneByUniq($dto->email, $dto->phoneNumber);
@@ -38,7 +40,7 @@ class CheckRecoveryCode extends BaseActionService
             $code = $dto->code;
             $registerCode = $userExists->getRegisterCode();
             if ($registerCode === null) {
-                $this->response->addError('Код подтверждения не отправлен');
+                $this->responseService->addError('Код подтверждения не отправлен');
             } else {
                 if ($registerCodeDate = $registerCode->getDate()) {
                     if ($registerCode->getCode() === $code && $currentDate->getTimestamp() < $registerCodeDate->getTimestamp()) {
@@ -48,24 +50,24 @@ class CheckRecoveryCode extends BaseActionService
                             $em->persist($userExists);
                             $em->remove($registerCode);
                             $em->flush();
-                            $this->response->addMessage('Профиль восстановлен');
+                            $this->responseService->addMessage('Профиль восстановлен');
                         } catch (\Exception $exception) {
-                            $this->response->addError('Ошибка восстановления профиля');
+                            $this->responseService->addError('Ошибка восстановления профиля');
                         }
                     } else {
-                        $this->response->addError('Код недействителен');
+                        $this->responseService->addError('Код недействителен');
                     }
                 } else {
-                    $this->response->addError('Код недействителен');
+                    $this->responseService->addError('Код недействителен');
                 }
             }
         } else {
-            $this->response->addError('Пользователь не найден');
+            $this->responseService->addError('Пользователь не найден');
         }
     }
 
-    public function validate(): bool
+    public function needDto(): bool
     {
-        return $this->recoveryCodeDto->validate($this->response);
+        return true;
     }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/CheckRegisterCode.php b/app/src/Service/Action/Classes/CheckRegisterCode.php
index 6411a739d7732a6fc467909d29b56d7be1a389d3..3a26d7f78af4e23eb4880cb87e821d7827027812 100644
--- a/app/src/Service/Action/Classes/CheckRegisterCode.php
+++ b/app/src/Service/Action/Classes/CheckRegisterCode.php
@@ -2,35 +2,24 @@
 
 namespace App\Service\Action\Classes;
 
-use App\Entity\User;
-use App\Service\Action\BaseActionService;
-use App\Service\Dto\Classes\RegisterCodeDto;
+use App\Service\Action\UserBaseActionService;
 use App\Service\Dto\DtoServiceInterface;
-use App\Service\Response\ResponseServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
-use Symfony\Bundle\SecurityBundle\Security;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
+use Symfony\Contracts\Service\Attribute\Required;
 
-class CheckRegisterCode extends BaseActionService
+#[AsAlias(id: 'action.register.code', public: true)]
+class CheckRegisterCode extends UserBaseActionService
 {
-    private ?User $user;
-
-    /**
-     * @param RegisterCodeDto $registerCodeDto
-     * @param ResponseServiceInterface $response
-     * @param ManagerRegistry $doctrine
-     * @param Security $security
-     */
-    public function __construct(
-        private DtoServiceInterface      $registerCodeDto,
-        private ResponseServiceInterface $response,
-        private ManagerRegistry          $doctrine,
-        Security                         $security,
-    )
+    #[Required] public function initDto(
+        #[Autowire(service: 'dto.register.code')]
+        DtoServiceInterface $dtoService
+    ): void
     {
-        $this->user = $security->getUser();
-        parent::__construct($response);
+        parent::initDto($dtoService);
     }
 
+
     /**
      * Подтверждение регистрации по коду
      *
@@ -39,10 +28,10 @@ class CheckRegisterCode extends BaseActionService
     public function runAction(): void
     {
         $currentDate = new \DateTime();
-        $code = $this->registerCodeDto->getClass()->code;
+        $code = $this->getDto()->code;
         $registerCode = $this->user->getRegisterCode();
         if ($registerCode === null) {
-            $this->response->addError('Код подтверждения не отправлен');
+            $this->responseService->addError('Код подтверждения не отправлен');
         } else {
             if ($registerCodeDate = $registerCode->getDate()) {
                 if ($registerCode->getCode() === $code && $currentDate->getTimestamp() < $registerCodeDate->getTimestamp()) {
@@ -52,25 +41,31 @@ class CheckRegisterCode extends BaseActionService
                         $em->persist($this->user);
                         $em->remove($registerCode);
                         $em->flush();
-                        $this->response->addMessage('Регистрация подтверждена');
+                        $this->responseService->addMessage('Регистрация подтверждена');
                     } catch (\Exception $exception) {
-                        $this->response->addError('Ошибка подтверждения регистрации');
+                        $this->responseService->addError('Ошибка подтверждения регистрации');
                     }
                 } else {
-                    $this->response->addError('Код недействителен');
+                    $this->responseService->addError('Код недействителен');
                 }
             } else {
-                $this->response->addError('Код недействителен');
+                $this->responseService->addError('Код недействителен');
             }
         }
     }
 
-    public function validate(): bool
+    public function needDto(): bool
     {
-        if ($this->user === null) {
-            $this->response->addError('Вы не авторизованы');
-            return false;
-        }
-        return $this->registerCodeDto->validate($this->response);
+        return true;
+    }
+
+    public function checkDelete(): bool
+    {
+        return true;
+    }
+
+    public function checkConfirm(): bool
+    {
+        return false;
     }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/DeleteImage.php b/app/src/Service/Action/Classes/DeleteImage.php
index 6431f4f1b95ddecaa4ca9758412932f96403d725..ff32f3dd6a18dd45bb6378438c2a1ef2999ccf1f 100644
--- a/app/src/Service/Action/Classes/DeleteImage.php
+++ b/app/src/Service/Action/Classes/DeleteImage.php
@@ -2,27 +2,13 @@
 
 namespace App\Service\Action\Classes;
 
-use App\Entity\User;
 use App\Entity\UserHistory;
-use App\Service\Action\BaseActionService;
-use App\Service\Response\ResponseServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
-use Symfony\Bundle\SecurityBundle\Security;
+use App\Service\Action\UserBaseActionService;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 
-class DeleteImage extends BaseActionService
+#[AsAlias(id: 'action.profile.image.delete', public: true)]
+class DeleteImage extends UserBaseActionService
 {
-    private ?User $user;
-
-    public function __construct(
-        private ResponseServiceInterface $response,
-        private ManagerRegistry          $doctrine,
-        Security                         $security
-    )
-    {
-        $this->user = $security->getUser();
-        parent::__construct($response);
-    }
-
     public function runAction(): void
     {
         $image = $this->user->getImage();
@@ -37,25 +23,27 @@ class DeleteImage extends BaseActionService
                 $this->user->addUserHistory($newUserHistory);
                 $em->remove($image);
                 $em->flush();
-                $this->response->addMessage('Изображение удалено');
+                $this->responseService->addMessage('Изображение удалено');
             } catch (\Exception $exception) {
-                $this->response->addError('Ошибка удаления изображения');
+                $this->responseService->addError('Ошибка удаления изображения');
             }
         } else {
-            $this->response->addError('Нет изображения');
+            $this->responseService->addError('Нет изображения');
         }
     }
 
-    public function validate(): bool
+    public function needDto(): bool
+    {
+        return false;
+    }
+
+    public function checkDelete(): bool
     {
-        if ($this->user === null) {
-            $this->response->addError('Вы не авторизованы');
-            return false;
-        }
-        if ($this->user->isDeleted()) {
-            $this->response->addError('Профиль удален');
-            return false;
-        }
         return true;
     }
+
+    public function checkConfirm(): bool
+    {
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/DeleteProfile.php b/app/src/Service/Action/Classes/DeleteProfile.php
index 9408091b647b146ae3c0851f15af1fd2eb73fbca..d50a89492dd7fcf3edbb338530f4e2179895fd37 100644
--- a/app/src/Service/Action/Classes/DeleteProfile.php
+++ b/app/src/Service/Action/Classes/DeleteProfile.php
@@ -2,26 +2,12 @@
 
 namespace App\Service\Action\Classes;
 
-use App\Entity\User;
-use App\Service\Action\BaseActionService;
-use App\Service\Response\ResponseServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
-use Symfony\Bundle\SecurityBundle\Security;
+use App\Service\Action\UserBaseActionService;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 
-class DeleteProfile extends BaseActionService
+#[AsAlias(id: 'action.profile.delete', public: true)]
+class DeleteProfile extends UserBaseActionService
 {
-    private ?User $user;
-
-    public function __construct(
-        private ResponseServiceInterface $response,
-        Security                         $security,
-        private ManagerRegistry          $doctrine,
-    )
-    {
-        $this->user = $security->getUser();
-        parent::__construct($response);
-    }
-
     /**
      * Деактивация учетной записи
      *
@@ -34,23 +20,24 @@ class DeleteProfile extends BaseActionService
             $em = $this->doctrine->getManager();
             $em->persist($this->user);
             $em->flush();
-            $this->response->addMessage('Профиль удален');
+            $this->responseService->addMessage('Профиль удален');
         } catch (\Exception $exception) {
-            $this->response->addError('Ошибка удаления профиля');
+            $this->responseService->addError('Ошибка удаления профиля');
         }
     }
 
-    public function validate(): bool
+    public function needDto(): bool
     {
-        if ($this->user === null) {
-            $this->response->addError('Вы не авторизованы');
-            return false;
-        }
+        return false;
+    }
 
-        if ($this->user->isDeleted()) {
-            $this->response->addError('Профиль уже удален');
-            return false;
-        }
+    public function checkDelete(): bool
+    {
         return true;
     }
+
+    public function checkConfirm(): bool
+    {
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/GetProfile.php b/app/src/Service/Action/Classes/GetProfile.php
index 8a98a3a812026af5270f5f6fa502d8a80c13f014..73a47bf0851bad47fcae37d1412153187a346fea 100644
--- a/app/src/Service/Action/Classes/GetProfile.php
+++ b/app/src/Service/Action/Classes/GetProfile.php
@@ -2,32 +2,24 @@
 
 namespace App\Service\Action\Classes;
 
-use App\Entity\User;
-use App\Service\Action\BaseActionService;
-use App\Service\Response\Classes\ProfileResponse;
+use App\Service\Action\UserBaseActionService;
 use App\Service\Response\ResponseServiceInterface;
-use Symfony\Bundle\SecurityBundle\Security;
-use Symfony\Component\Security\Http\Attribute\CurrentUser;
-use Symfony\Component\Serializer\SerializerInterface;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
+use Symfony\Contracts\Service\Attribute\Required;
 
-class GetProfile extends BaseActionService
+#[AsAlias(id: 'action.profile', public: true)]
+class GetProfile extends UserBaseActionService
 {
-    private ?User $user;
-
-    /**
-     * @param ProfileResponse $profileResponse
-     * @param Security $security
-     */
-    public function __construct(
-        private ResponseServiceInterface $profileResponse,
-        Security                         $security
-    )
+    #[Required]
+    public function initResponse(
+        #[Autowire(service: 'response.profile')]
+        ResponseServiceInterface $responseService
+    ): void
     {
-        $this->user = $security->getUser();
-        parent::__construct($profileResponse);
+        parent::initResponse($responseService);
     }
 
-
     /**
      * Получение профиля пользователя
      *
@@ -37,19 +29,21 @@ class GetProfile extends BaseActionService
      */
     public function runAction(): void
     {
-        $this->profileResponse->setData($this->user);
+        $this->responseService->setData($this->user);
     }
 
-    public function validate(): bool
+    public function checkDelete(): bool
     {
-        if ($this->user === null) {
-            $this->profileResponse->addError('Вы не авторизованы');
-            return false;
-        }
-        if ($this->user->isDeleted()) {
-            $this->profileResponse->addError('Профиль удален');
-            return false;
-        }
         return true;
     }
+
+    public function checkConfirm(): bool
+    {
+        return false;
+    }
+
+    public function needDto(): bool
+    {
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/None.php b/app/src/Service/Action/Classes/None.php
index f891845a8ff2c574291898571514b90712f2e7d3..4dea60206f8c6cc8c43d9124a652d0b6c5d17fb0 100644
--- a/app/src/Service/Action/Classes/None.php
+++ b/app/src/Service/Action/Classes/None.php
@@ -3,7 +3,9 @@
 namespace App\Service\Action\Classes;
 
 use App\Service\Action\BaseActionService;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 
+#[AsAlias]
 class None extends BaseActionService
 {
 
@@ -12,11 +14,16 @@ class None extends BaseActionService
 
     }
 
-    public function validate(): bool
+    public function customValidate(): bool
     {
         if ($this->responseService) {
             $this->responseService->addError('Действие не выбрано');
         }
         return false;
     }
+
+    public function needDto(): bool
+    {
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/RecoveryProfile.php b/app/src/Service/Action/Classes/RecoveryProfile.php
index d6e7e685f7b1f849bf7786e6f220388dac497188..7cad30652be3e7f54a944eabb985983a952a14e2 100644
--- a/app/src/Service/Action/Classes/RecoveryProfile.php
+++ b/app/src/Service/Action/Classes/RecoveryProfile.php
@@ -6,27 +6,31 @@ use App\Entity\User;
 use App\Service\Action\BaseActionService;
 use App\Service\Dto\Classes\RecoveryDto;
 use App\Service\Dto\DtoServiceInterface;
-use App\Service\Response\ResponseServiceInterface;
 use App\Service\Send\SendServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
+use Symfony\Contracts\Service\Attribute\Required;
 
+#[AsAlias(id: 'action.recovery.send', public: true)]
 class RecoveryProfile extends BaseActionService
 {
-    /**
-     * @param DtoServiceInterface $recoveryDto
-     * @param ResponseServiceInterface $response
-     * @param ManagerRegistry $doctrine
-     */
-    public function __construct(
-        private DtoServiceInterface      $recoveryDto,
-        private ResponseServiceInterface $response,
-        private ManagerRegistry          $doctrine,
-        private SendServiceInterface     $recoveryCodeSendService
-    )
+    #[Required] public function initDto(
+        #[Autowire(service: 'dto.recovery.send')]
+        DtoServiceInterface $dtoService
+    ): void
+    {
+        parent::initDto($dtoService);
+    }
+
+    #[Required] public function initSend(
+        #[Autowire(service: 'send.code.recovery')]
+        SendServiceInterface $sendService
+    ): void
     {
-        parent::__construct($response);
+        parent::initSend($sendService);
     }
 
+
     /**
      * Отправка кода восстановления учетной записи
      *
@@ -35,26 +39,26 @@ class RecoveryProfile extends BaseActionService
     public function runAction(): void
     {
         /** @var RecoveryDto $dto */
-        $dto = $this->recoveryDto->getClass();
+        $dto = $this->getDto();
         /** @var User $userExists */
         $userExists = $this->doctrine->getRepository(User::class)
             ->findOneByUniq($dto->email, $dto->phoneNumber);
 
         if ($userExists !== null) {
             if (!$userExists->isDeleted()) {
-                $this->response->addError('Профиль не удален');
+                $this->responseService->addError('Профиль не удален');
             } else {
-                $this->recoveryCodeSendService->setUser($userExists);
-                $this->recoveryCodeSendService->setResponse($this->response);
-                $this->recoveryCodeSendService->send();
+                $this->sendService->setUser($userExists);
+                $this->sendService->setResponse($this->responseService);
+                $this->sendService->send();
             }
         } else {
-            $this->response->addError('Пользователь не найден');
+            $this->responseService->addError('Пользователь не найден');
         }
     }
 
-    public function validate(): bool
+    public function needDto(): bool
     {
-        return $this->recoveryDto->validate($this->response);
+        return true;
     }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/Register.php b/app/src/Service/Action/Classes/Register.php
index 12291099361a1fcd81da1acc3222a6ca75e74793..42117d6bfe3717b81439a2a896067a6afebf5878 100644
--- a/app/src/Service/Action/Classes/Register.php
+++ b/app/src/Service/Action/Classes/Register.php
@@ -4,37 +4,43 @@ namespace App\Service\Action\Classes;
 
 use App\Entity\User;
 use App\Service\Action\BaseActionService;
-use App\Service\Dto\Classes\RegisterDto;
 use App\Service\Dto\DtoServiceInterface;
-use App\Service\Response\ResponseServiceInterface;
-use App\Service\Send\Classes\Code\RegisterCodeSendService;
-use App\Service\Send\Classes\CodeSendService;
-use App\Service\Send\SendService;
 use App\Service\Send\SendServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
 use ReflectionClass;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
 use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
+use Symfony\Contracts\Service\Attribute\Required;
 
+#[AsAlias(id: 'action.register', public: true)]
 class Register extends BaseActionService
 {
     /**
-     * @param RegisterDto $registerDto
-     * @param ResponseServiceInterface $response
      * @param UserPasswordHasherInterface $passwordHasher
-     * @param ManagerRegistry $doctrine
-     * @param RegisterCodeSendService $registerCodeSendService
      */
     public function __construct(
-        private DtoServiceInterface         $registerDto,
-        private ResponseServiceInterface    $response,
         private UserPasswordHasherInterface $passwordHasher,
-        private ManagerRegistry             $doctrine,
-        private SendServiceInterface        $registerCodeSendService,
     )
     {
-        parent::__construct($response);
     }
 
+    #[Required] public function initDto(
+        #[Autowire(service: 'dto.register')]
+        DtoServiceInterface $dtoService
+    ): void
+    {
+        parent::initDto($dtoService);
+    }
+
+    #[Required] public function initSend(
+        #[Autowire(service: 'send.code.register')]
+        SendServiceInterface $sendService
+    ): void
+    {
+        parent::initSend($sendService);
+    }
+
+
     /**
      * Регистрация
      *
@@ -42,20 +48,21 @@ class Register extends BaseActionService
      */
     public function runAction(): void
     {
+        $dto = $this->getDto();
         $user = $this->createUser();
-        if ($user !== null) {
+        if ($user !== null && $dto) {
             $userExists = $this->doctrine->getRepository(User::class)
                 ->findOneByUniq($user->getEmail(), $user->getPhoneNumber());
 
             if ($userExists) {
-                $this->response->addError('Пользователь уже существует');
+                $this->responseService->addError('Пользователь уже существует');
             } else {
                 try {
                     $user->setDeleted(false);
                     $user->setConfirm(false);
                     $hashedPassword = $this->passwordHasher->hashPassword(
                         $user,
-                        $this->registerDto->getClass()->password ?: ''
+                        $dto->password ?: ''
                     );
                     $user->setPassword($hashedPassword);
 
@@ -63,30 +70,18 @@ class Register extends BaseActionService
 
                     $em->persist($user);
                     $em->flush();
-                    $this->response->addMessage('Пользователь зарегистрирован');
+                    $this->responseService->addMessage('Пользователь зарегистрирован');
 
-                    $this->registerCodeSendService->setUser($user);
-                    $this->registerCodeSendService->setResponse($this->response);
-                    $this->registerCodeSendService->send();
+                    $this->sendService->setUser($user);
+                    $this->sendService->setResponse($this->responseService);
+                    $this->sendService->send();
                 } catch (\Exception $exception) {
-                    dd($exception);
-                    $this->response->addError('Ошибка регистрации пользователя');
+                    $this->responseService->addError('Ошибка регистрации пользователя');
                 }
-
             }
         }
     }
 
-    /**
-     * Валидация
-     *
-     * @return bool
-     */
-    public function validate(): bool
-    {
-        return $this->registerDto->validate($this->response);
-    }
-
     /**
      * Создание пользователя из Dto
      *
@@ -96,7 +91,7 @@ class Register extends BaseActionService
     {
         $user = null;
 
-        $data = $this->registerDto->toArray();
+        $data = $this->dtoService->toArray();
 
         if ($data) {
             $user = new User();
@@ -112,9 +107,14 @@ class Register extends BaseActionService
                 }
             }
         } else {
-            $this->response->addError('Ошибка получения данных');
+            $this->responseService->addError('Ошибка получения данных');
         }
 
         return $user;
     }
+
+    public function needDto(): bool
+    {
+        return true;
+    }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/ResetEmail.php b/app/src/Service/Action/Classes/ResetEmail.php
index 07f270936f12e74a1f28385799c969bc9c8e2e6a..cd5e06c91f979ff9e94950e898957f6d32ceb2f7 100644
--- a/app/src/Service/Action/Classes/ResetEmail.php
+++ b/app/src/Service/Action/Classes/ResetEmail.php
@@ -2,62 +2,45 @@
 
 namespace App\Service\Action\Classes;
 
-use App\Entity\User;
-use App\Service\Action\BaseActionService;
-use App\Service\Response\ResponseServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
-use Symfony\Bundle\SecurityBundle\Security;
+use App\Service\Action\UserBaseActionService;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 
-class ResetEmail extends BaseActionService
+#[AsAlias(id: 'action.reset.email', public: true)]
+class ResetEmail extends UserBaseActionService
 {
-    private ?User $user;
-
-    /**
-     * @param ResponseServiceInterface $response
-     * @param ManagerRegistry $doctrine
-     * @param Security $security
-     */
-    public function __construct(
-        private ResponseServiceInterface $response,
-        private ManagerRegistry          $doctrine,
-        Security                         $security
-    )
-    {
-        $this->user = $security->getUser();
-        parent::__construct($response);
-    }
-
     public function runAction(): void
     {
         if ($email = $this->user->getLastConfirmEmail()) {
             if ($email === $this->user->getEmail()) {
-                $this->response->addMessage('Подтвержденный email уже установлен');
+                $this->responseService->addMessage('Подтвержденный email уже установлен');
             } else {
                 try {
                     $this->user->setEmail($email);
                     $em = $this->doctrine->getManager();
                     $em->persist($this->user);
                     $em->flush();
-                    $this->response->addMessage('Установлен email: ' . $email);
+                    $this->responseService->addMessage('Установлен email: ' . $email);
                 } catch (\Exception $e) {
-                    $this->response->addError('Ошибка сохранения email');
+                    $this->responseService->addError('Ошибка сохранения email');
                 }
             }
         } else {
-            $this->response->addError('Нет последнего подтвержденного email');
+            $this->responseService->addError('Нет последнего подтвержденного email');
         }
     }
 
-    public function validate(): bool
+    public function needDto(): bool
+    {
+        return false;
+    }
+
+    public function checkDelete(): bool
     {
-        if ($this->user === null) {
-            $this->response->addError('Вы не авторизованы');
-            return false;
-        }
-        if ($this->user->isDeleted()) {
-            $this->response->addError('Профиль удален');
-            return false;
-        }
         return true;
     }
+
+    public function checkConfirm(): bool
+    {
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/ResetPassword.php b/app/src/Service/Action/Classes/ResetPassword.php
index ec611ab5ae2fe36a51ee1409dfd5d6f1afd57b3c..21d0e7b7a5e70b132e6dd5d2f2d127d5afaa392d 100644
--- a/app/src/Service/Action/Classes/ResetPassword.php
+++ b/app/src/Service/Action/Classes/ResetPassword.php
@@ -2,35 +2,36 @@
 
 namespace App\Service\Action\Classes;
 
-use App\Entity\User;
-use App\Service\Action\BaseActionService;
+use App\Service\Action\UserBaseActionService;
 use App\Service\Dto\Classes\ChangePasswordDto;
 use App\Service\Dto\DtoServiceInterface;
-use App\Service\Response\ResponseServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
-use Symfony\Bundle\SecurityBundle\Security;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
 use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
+use Symfony\Contracts\Service\Attribute\Required;
 
-class ResetPassword extends BaseActionService
+#[AsAlias(id: 'action.reset.password.change', public: true)]
+class ResetPassword extends UserBaseActionService
 {
-    private ?User $user;
-
     public function __construct(
-        private ResponseServiceInterface    $response,
         private UserPasswordHasherInterface $passwordHasher,
-        private DtoServiceInterface         $passwordDto,
-        private ManagerRegistry             $doctrine,
-        Security                         $security
     )
     {
-        $this->user = $security->getUser();
-        parent::__construct($response);
     }
 
+    #[Required] public function initDto(
+        #[Autowire(service: 'dto.password.change')]
+        DtoServiceInterface $dtoService
+    ): void
+    {
+        parent::initDto($dtoService);
+    }
+
+
     public function runAction(): void
     {
         /** @var ChangePasswordDto $dto */
-        $dto = $this->passwordDto->getClass();
+        $dto = $this->getDto();
 
         if ($this->passwordHasher->isPasswordValid($this->user, $dto->oldPassword)) {
             $hashedPassword = $this->passwordHasher->hashPassword(
@@ -43,21 +44,27 @@ class ResetPassword extends BaseActionService
                 $em = $this->doctrine->getManager();
                 $em->persist($this->user);
                 $em->flush();
-                $this->response->addMessage('Пароль изменен');
+                $this->responseService->addMessage('Пароль изменен');
             } catch (\Exception $exception) {
-                $this->response->addError('Ошибка изменения пароля');
+                $this->responseService->addError('Ошибка изменения пароля');
             }
         } else {
-            $this->response->addError('Текущий пароль неверен');
+            $this->responseService->addError('Текущий пароль неверен');
         }
     }
 
-    public function validate(): bool
+    public function needDto(): bool
     {
-        if ($this->user === null) {
-            $this->response->addError('Вы не авторизованы');
-            return false;
-        }
-        return $this->passwordDto->validate($this->response);
+        return true;
+    }
+
+    public function checkDelete(): bool
+    {
+        return true;
+    }
+
+    public function checkConfirm(): bool
+    {
+        return false;
     }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/ResetPasswordCode.php b/app/src/Service/Action/Classes/ResetPasswordCode.php
index bc5ecd44c7d8979b4682c0d2dc5b010e9fc157fe..8368ef22541f04c7708f84046e5044928c6ae659 100644
--- a/app/src/Service/Action/Classes/ResetPasswordCode.php
+++ b/app/src/Service/Action/Classes/ResetPasswordCode.php
@@ -6,27 +6,34 @@ use App\Entity\User;
 use App\Service\Action\BaseActionService;
 use App\Service\Dto\Classes\ResetPasswordCodeDto;
 use App\Service\Dto\DtoServiceInterface;
-use App\Service\Response\ResponseServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
 use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
+use Symfony\Contracts\Service\Attribute\Required;
 
+#[AsAlias(id: 'action.reset.password.code', public: true)]
 class ResetPasswordCode extends BaseActionService
 {
 
     public function __construct(
-        private ResponseServiceInterface    $response,
         private UserPasswordHasherInterface $passwordHasher,
-        private DtoServiceInterface         $passwordResetDto,
-        private ManagerRegistry             $doctrine
     )
     {
-        parent::__construct($response);
     }
 
+    #[Required] public function initDto(
+        #[Autowire(service: 'dto.password.code')]
+        DtoServiceInterface $dtoService
+    ): void
+    {
+        parent::initDto($dtoService);
+    }
+
+
     public function runAction(): void
     {
         /** @var ResetPasswordCodeDto $dto */
-        $dto = $this->passwordResetDto->getClass();
+        $dto = $this->getDto();
         /** @var User $userExists */
         $userExists = $this->doctrine->getRepository(User::class)
             ->findOneByUniq($dto->email, $dto->phoneNumber);
@@ -36,7 +43,7 @@ class ResetPasswordCode extends BaseActionService
             $code = $dto->code;
             $registerCode = $userExists->getRegisterCode();
             if ($registerCode === null) {
-                $this->response->addError('Код подтверждения не отправлен');
+                $this->responseService->addError('Код подтверждения не отправлен');
             } else {
                 if ($registerCodeDate = $registerCode->getDate()) {
                     if ($registerCode->getCode() === $code && $currentDate->getTimestamp() < $registerCodeDate->getTimestamp()) {
@@ -50,24 +57,24 @@ class ResetPasswordCode extends BaseActionService
                             $em->persist($userExists);
                             $em->remove($registerCode);
                             $em->flush();
-                            $this->response->addMessage('Пароль изменен');
+                            $this->responseService->addMessage('Пароль изменен');
                         } catch (\Exception $exception) {
-                            $this->response->addError('Ошибка изменения пароля');
+                            $this->responseService->addError('Ошибка изменения пароля');
                         }
                     } else {
-                        $this->response->addError('Код недействителен');
+                        $this->responseService->addError('Код недействителен');
                     }
                 } else {
-                    $this->response->addError('Код недействителен');
+                    $this->responseService->addError('Код недействителен');
                 }
             }
         } else {
-            $this->response->addError('Пользователь не найден');
+            $this->responseService->addError('Пользователь не найден');
         }
     }
 
-    public function validate(): bool
+    public function needDto(): bool
     {
-        return $this->passwordResetDto->validate($this->response);
+        return true;
     }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/SaveImage.php b/app/src/Service/Action/Classes/SaveImage.php
index 4e437de826790ba72f8a0c9561c5437d74c9537d..36fb0f90eb745bf09d4387779fc99f716ef20bb2 100644
--- a/app/src/Service/Action/Classes/SaveImage.php
+++ b/app/src/Service/Action/Classes/SaveImage.php
@@ -2,21 +2,21 @@
 
 namespace App\Service\Action\Classes;
 
-use App\Entity\User;
 use App\Entity\UserHistory;
 use App\Entity\UserImage;
-use App\Service\Action\BaseActionService;
+use App\Service\Action\UserBaseActionService;
 use App\Service\Dto\Classes\ImageDto;
 use App\Service\Dto\DtoServiceInterface;
-use App\Service\Response\ResponseServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
-use Symfony\Bundle\SecurityBundle\Security;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
 use Symfony\Component\HttpFoundation\File\Exception\FileException;
 use Symfony\Component\HttpFoundation\File\UploadedFile;
 use Symfony\Component\Mime\MimeTypes;
 use Symfony\Component\String\Slugger\SluggerInterface;
+use Symfony\Contracts\Service\Attribute\Required;
 
-class SaveImage extends BaseActionService
+#[AsAlias(id: 'action.profile.image.save', public: true)]
+class SaveImage extends UserBaseActionService
 {
     // Доступные расширения файлов
     public const IMAGE_EXTENSIONS = [
@@ -24,21 +24,22 @@ class SaveImage extends BaseActionService
         'png'
     ];
 
-    private ?User $user;
-
     public function __construct(
         private string                   $targetDirectory,
-        private DtoServiceInterface      $imageDto,
-        private ResponseServiceInterface $response,
-        private SluggerInterface         $slugger,
-        private ManagerRegistry          $doctrine,
-        Security                         $security
+        private SluggerInterface         $slugger
     )
     {
-        $this->user = $security->getUser();
-        parent::__construct($response);
     }
 
+    #[Required] public function initDto(
+        #[Autowire(service: 'dto.image')]
+        DtoServiceInterface $dtoService
+    ): void
+    {
+        parent::initDto($dtoService);
+    }
+
+
     public function runAction(): void
     {
         $file = $this->saveFile();
@@ -62,32 +63,19 @@ class SaveImage extends BaseActionService
             try {
                 $em->persist($file);
                 $em->flush();
-                $this->response->addMessage('Изображение сохранено');
+                $this->responseService->addMessage('Изображение сохранено');
             } catch (\Exception $exception) {
-                $this->response->addError('Ошибка сохранения файла пользователя');
+                $this->responseService->addError('Ошибка сохранения файла пользователя');
             }
         } else {
-            $this->response->addError('Ошибка сохранения файла');
-        }
-    }
-
-    public function validate(): bool
-    {
-        if ($this->user === null) {
-            $this->response->addError('Вы не авторизованы');
-            return false;
-        }
-        if ($this->user->isDeleted()) {
-            $this->response->addError('Профиль удален');
-            return false;
+            $this->responseService->addError('Ошибка сохранения файла');
         }
-        return $this->imageDto->validate($this->response);
     }
 
     public function saveFile(): ?UserImage
     {
         /** @var ImageDto $dto */
-        $dto = $this->imageDto->getClass();
+        $dto = $this->getDto();
 
         $matches = [];
         if (!preg_match('/^data:([a-z0-9][a-z0-9\!\#\$\&\-\^\_\+\.]{0,126}\/[a-z0-9][a-z0-9\!\#\$\&\-\^\_\+\.]{0,126}(;[a-z0-9\-]+\=[a-z0-9\-]+)?)?(;base64)?,([a-z0-9\!\$\&\\\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$)/i', $dto->data ?: '', $matches)) {
@@ -99,11 +87,11 @@ class SaveImage extends BaseActionService
             $mimeTypes = new MimeTypes();
             $types = $mimeTypes->getExtensions($extension);
             if (empty($types)) {
-                $this->response->addError('Неизвестное расширения файла');
+                $this->responseService->addError('Неизвестное расширения файла');
                 return null;
             }
             if (empty(array_intersect($types, self::IMAGE_EXTENSIONS))) {
-                $this->response->addError('Файл расширения "'. reset($types) .'" недоступен для загрузки. Доступные расширения: ' . implode(', ', self::IMAGE_EXTENSIONS) . '.');
+                $this->responseService->addError('Файл расширения "'. reset($types) .'" недоступен для загрузки. Доступные расширения: ' . implode(', ', self::IMAGE_EXTENSIONS) . '.');
                 return null;
             }
 
@@ -113,7 +101,7 @@ class SaveImage extends BaseActionService
 
             $decoded = base64_decode($content);
             if (!$decoded) {
-                $this->response->addError('Ошибка декодирования файла');
+                $this->responseService->addError('Ошибка декодирования файла');
                 return null;
             }
 
@@ -141,4 +129,19 @@ class SaveImage extends BaseActionService
 
         return null;
     }
+
+    public function needDto(): bool
+    {
+        return true;
+    }
+
+    public function checkDelete(): bool
+    {
+        return true;
+    }
+
+    public function checkConfirm(): bool
+    {
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/SendRegisterCode.php b/app/src/Service/Action/Classes/SendRegisterCode.php
index 8796d952e6a260513518843afe80fbb9ff51a4ae..135e2f94ae7f6fca37bbfe4894b58ff4e002ee71 100644
--- a/app/src/Service/Action/Classes/SendRegisterCode.php
+++ b/app/src/Service/Action/Classes/SendRegisterCode.php
@@ -2,30 +2,21 @@
 
 namespace App\Service\Action\Classes;
 
-use App\Entity\User;
-use App\Service\Action\BaseActionService;
-use App\Service\Response\ResponseServiceInterface;
-use App\Service\Send\Classes\Code\RegisterCodeSendService;
+use App\Service\Action\UserBaseActionService;
 use App\Service\Send\SendServiceInterface;
-use Symfony\Bundle\SecurityBundle\Security;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
+use Symfony\Contracts\Service\Attribute\Required;
 
-class SendRegisterCode extends BaseActionService
+#[AsAlias(id: 'action.register.send', public: true)]
+class SendRegisterCode extends UserBaseActionService
 {
-    private ?User $user;
-
-    /**
-     * @param ResponseServiceInterface $response
-     * @param RegisterCodeSendService $registerCodeSendService
-     * @param Security $security
-     */
-    public function __construct(
-        private ResponseServiceInterface $response,
-        private SendServiceInterface     $registerCodeSendService,
-        Security                         $security
-    )
+    #[Required] public function initSend(
+        #[Autowire(service: 'send.code.register')]
+        SendServiceInterface $sendService
+    ): void
     {
-        $this->user = $security->getUser();
-        parent::__construct($response);
+        parent::initSend($sendService);
     }
 
 
@@ -38,22 +29,33 @@ class SendRegisterCode extends BaseActionService
      */
     public function runAction(): void
     {
-        $this->registerCodeSendService->setUser($this->user);
-        $this->registerCodeSendService->setResponse($this->response);
-        $this->registerCodeSendService->send();
+        $this->sendService->setUser($this->user);
+        $this->sendService->setResponse($this->responseService);
+        $this->sendService->send();
     }
 
-    public function validate(): bool
+    public function customValidate(): bool
     {
-        if ($this->user === null) {
-            $this->response->addError('Вы не авторизованы');
-            return false;
-        }
         if ($this->user->isConfirm()) {
-            $this->response->addError('Учетная запись уже подтверждена');
+            $this->responseService->addError('Учетная запись уже подтверждена');
             return false;
         }
 
         return true;
     }
+
+    public function needDto(): bool
+    {
+        return false;
+    }
+
+    public function checkDelete(): bool
+    {
+        return true;
+    }
+
+    public function checkConfirm(): bool
+    {
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/Classes/SendResetPasswordCode.php b/app/src/Service/Action/Classes/SendResetPasswordCode.php
index 7426d9bf2de3588d848eb4624e424502b660a674..6984819805fd56f83681d4e41b1540059271402e 100644
--- a/app/src/Service/Action/Classes/SendResetPasswordCode.php
+++ b/app/src/Service/Action/Classes/SendResetPasswordCode.php
@@ -6,41 +6,50 @@ use App\Entity\User;
 use App\Service\Action\BaseActionService;
 use App\Service\Dto\Classes\RecoveryDto;
 use App\Service\Dto\DtoServiceInterface;
-use App\Service\Response\ResponseServiceInterface;
 use App\Service\Send\SendServiceInterface;
-use Doctrine\Persistence\ManagerRegistry;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
+use Symfony\Contracts\Service\Attribute\Required;
 
+#[AsAlias(id: 'action.reset.password.send', public: true)]
 class SendResetPasswordCode extends BaseActionService
 {
-    public function __construct(
-        private ResponseServiceInterface $response,
-        private DtoServiceInterface      $recoveryDto,
-        private ManagerRegistry          $doctrine,
-        private SendServiceInterface     $passwordCodeSendService
-    )
+    #[Required] public function initDto(
+        #[Autowire(service: 'dto.recovery.send')]
+        DtoServiceInterface $dtoService
+    ): void
     {
-        parent::__construct($response);
+        parent::initDto($dtoService);
     }
 
+    #[Required] public function initSend(
+        #[Autowire(service: 'send.code.password')]
+        SendServiceInterface $sendService
+    ): void
+    {
+        parent::initSend($sendService);
+    }
+
+
     public function runAction(): void
     {
         /** @var RecoveryDto $dto */
-        $dto = $this->recoveryDto->getClass();
+        $dto = $this->getDto();
         /** @var User $userExists */
         $userExists = $this->doctrine->getRepository(User::class)
             ->findOneByUniq($dto->email, $dto->phoneNumber);
 
         if ($userExists !== null) {
-            $this->passwordCodeSendService->setUser($userExists);
-            $this->passwordCodeSendService->setResponse($this->response);
-            $this->passwordCodeSendService->send();
+            $this->sendService->setUser($userExists);
+            $this->sendService->setResponse($this->responseService);
+            $this->sendService->send();
         } else {
-            $this->response->addError('Пользователь не найден');
+            $this->responseService->addError('Пользователь не найден');
         }
     }
 
-    public function validate(): bool
+    public function needDto(): bool
     {
-        return $this->recoveryDto->validate($this->response);
+        return true;
     }
 }
\ No newline at end of file
diff --git a/app/src/Service/Action/UserBaseActionService.php b/app/src/Service/Action/UserBaseActionService.php
new file mode 100644
index 0000000000000000000000000000000000000000..c6b201999fc70f1c267c0e5acc5ff63b0eadf4ab
--- /dev/null
+++ b/app/src/Service/Action/UserBaseActionService.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Service\Action;
+
+use App\Entity\User;
+use Symfony\Bundle\SecurityBundle\Security;
+use Symfony\Contracts\Service\Attribute\Required;
+
+abstract class UserBaseActionService extends BaseActionService
+{
+    protected ?User $user;
+
+    #[Required]
+    public function initUser(Security $security): void
+    {
+        $this->user = $security->getUser();
+    }
+
+    abstract public function checkDelete(): bool;
+
+    abstract public function checkConfirm(): bool;
+
+    public function customValidate(): bool
+    {
+        if ($this->user === null) {
+            $this->responseService->addError('Вы не авторизованы');
+            return false;
+        }
+
+        if ($this->checkDelete() && $this->user->isDeleted()) {
+            $this->responseService->addError('Профиль удален');
+            return false;
+        }
+
+        if ($this->checkConfirm() && !$this->user->isConfirm()) {
+            $this->responseService->addError('Профиль не подтвержден');
+            return false;
+        }
+
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/app/src/Service/Dto/BaseDto.php b/app/src/Service/Dto/BaseDto.php
index b3abff01ee86261b7fceff8c91974fb7a09bd1c7..363af9757865249aafbea400550fbf5999a32af0 100644
--- a/app/src/Service/Dto/BaseDto.php
+++ b/app/src/Service/Dto/BaseDto.php
@@ -5,6 +5,7 @@ namespace App\Service\Dto;
 use App\Service\Response\ResponseServiceInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
 use Symfony\Component\Serializer\Annotation\Ignore;
 use Symfony\Component\Serializer\Encoder\JsonEncoder;
@@ -90,11 +91,13 @@ abstract class BaseDto implements DtoServiceInterface
             if (count($aErrors) > 0) {
                 foreach ($aErrors as $error) {
                     $response->addError($error->getMessage());
+                    $response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
                 }
                 $bValid = false;
             }
         } else {
             $response->addError("Данные не получены");
+            $response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
             $bValid = false;
         }
 
diff --git a/app/src/Service/Dto/Classes/ChangePasswordDto.php b/app/src/Service/Dto/Classes/ChangePasswordDto.php
index f15145b0aee769de86dd347d8efb27358e0f6c39..952993f9c85869e568900b3f597117961dc6b297 100644
--- a/app/src/Service/Dto/Classes/ChangePasswordDto.php
+++ b/app/src/Service/Dto/Classes/ChangePasswordDto.php
@@ -4,11 +4,13 @@ namespace App\Service\Dto\Classes;
 
 use App\Service\Dto\BaseDto;
 use App\Validators\PasswordValidator;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Validator\Constraints as Assert;
 
 #[Assert\Callback([PasswordValidator::class, 'validateRepeatPassword'])]
 #[Assert\Callback([PasswordValidator::class, 'validateNewPassword'])]
 #[Assert\Callback([PasswordValidator::class, 'validatePassword'])]
+#[AsAlias(id: 'dto.password.change', public: true)]
 class ChangePasswordDto extends BaseDto
 {
     #[Assert\NotBlank(
diff --git a/app/src/Service/Dto/Classes/ChangeProfileDto.php b/app/src/Service/Dto/Classes/ChangeProfileDto.php
index 129af968e3620c90eaaa31a52821a520859556f0..9ab7166bdf741d52a40f33c496a505f930d8716c 100644
--- a/app/src/Service/Dto/Classes/ChangeProfileDto.php
+++ b/app/src/Service/Dto/Classes/ChangeProfileDto.php
@@ -3,8 +3,10 @@
 namespace App\Service\Dto\Classes;
 
 use App\Service\Dto\BaseDto;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Validator\Constraints as Assert;
 
+#[AsAlias(id: 'dto.profile.change', public: true)]
 class ChangeProfileDto extends BaseDto
 {
     #[Assert\Email(
diff --git a/app/src/Service/Dto/Classes/ImageDto.php b/app/src/Service/Dto/Classes/ImageDto.php
index 5f47f0d1126976f34e12b55118f124aabbe107de..51ade144be4fd64900241ddc0b78e02b20486187 100644
--- a/app/src/Service/Dto/Classes/ImageDto.php
+++ b/app/src/Service/Dto/Classes/ImageDto.php
@@ -3,8 +3,10 @@
 namespace App\Service\Dto\Classes;
 
 use App\Service\Dto\BaseDto;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Validator\Constraints as Assert;
 
+#[AsAlias(id: 'dto.image', public: true)]
 class ImageDto extends BaseDto
 {
     #[Assert\NotBlank(
diff --git a/app/src/Service/Dto/Classes/NoneDto.php b/app/src/Service/Dto/Classes/NoneDto.php
index bb31bf37f77c28d15f2f9e35e2c76e074ad9a959..37981d8ad8b86630b172e86284e952e46f282d8c 100644
--- a/app/src/Service/Dto/Classes/NoneDto.php
+++ b/app/src/Service/Dto/Classes/NoneDto.php
@@ -3,7 +3,9 @@
 namespace App\Service\Dto\Classes;
 
 use App\Service\Dto\BaseDto;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 
+#[AsAlias]
 class NoneDto extends BaseDto
 {
 
diff --git a/app/src/Service/Dto/Classes/RecoveryCodeDto.php b/app/src/Service/Dto/Classes/RecoveryCodeDto.php
index 2e9757ec527a441b1ddf811b643574094dbc9eb7..20f5917edd613fff41de4cd81f8dce132e524fbb 100644
--- a/app/src/Service/Dto/Classes/RecoveryCodeDto.php
+++ b/app/src/Service/Dto/Classes/RecoveryCodeDto.php
@@ -4,9 +4,11 @@ namespace App\Service\Dto\Classes;
 
 use App\Service\Dto\BaseDto;
 use App\Validators\UserValidator;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Validator\Constraints as Assert;
 
 #[Assert\Callback([UserValidator::class, 'validateEmailOrPhone'])]
+#[AsAlias(id: 'dto.recovery.code', public: true)]
 class RecoveryCodeDto extends BaseDto
 {
     #[Assert\Email(
diff --git a/app/src/Service/Dto/Classes/RecoveryDto.php b/app/src/Service/Dto/Classes/RecoveryDto.php
index 3f995214395c3aacc3db77370992735cc8d014c3..3558c6e5a869d9fdd029103ef61bbe99e9c4dbb0 100644
--- a/app/src/Service/Dto/Classes/RecoveryDto.php
+++ b/app/src/Service/Dto/Classes/RecoveryDto.php
@@ -4,9 +4,11 @@ namespace App\Service\Dto\Classes;
 
 use App\Service\Dto\BaseDto;
 use App\Validators\UserValidator;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Validator\Constraints as Assert;
 
 #[Assert\Callback([UserValidator::class, 'validateEmailOrPhone'])]
+#[AsAlias(id: 'dto.recovery.send', public: true)]
 class RecoveryDto extends BaseDto
 {
     #[Assert\Email(
diff --git a/app/src/Service/Dto/Classes/RegisterCodeDto.php b/app/src/Service/Dto/Classes/RegisterCodeDto.php
index 29890490754ae3a7958c31c78b97a4bb55464996..ff5859c81c7b921992def422c391feda6ec89d50 100644
--- a/app/src/Service/Dto/Classes/RegisterCodeDto.php
+++ b/app/src/Service/Dto/Classes/RegisterCodeDto.php
@@ -3,8 +3,10 @@
 namespace App\Service\Dto\Classes;
 
 use App\Service\Dto\BaseDto;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Validator\Constraints as Assert;
 
+#[AsAlias(id: 'dto.register.code', public: true)]
 class RegisterCodeDto extends BaseDto
 {
     #[Assert\NotBlank(
diff --git a/app/src/Service/Dto/Classes/RegisterDto.php b/app/src/Service/Dto/Classes/RegisterDto.php
index 74247d56754553dc60783e1b62113b5befb23f1f..1659ba09fabc0a848aeb5b2ab25fab625590a5c6 100644
--- a/app/src/Service/Dto/Classes/RegisterDto.php
+++ b/app/src/Service/Dto/Classes/RegisterDto.php
@@ -4,10 +4,12 @@ namespace App\Service\Dto\Classes;
 
 use App\Service\Dto\BaseDto;
 use App\Validators\PasswordValidator;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Validator\Constraints as Assert;
 
 #[Assert\Callback([PasswordValidator::class, 'validateRepeatPassword'])]
 #[Assert\Callback([PasswordValidator::class, 'validatePassword'])]
+#[AsAlias(id: 'dto.register', public: true)]
 class RegisterDto extends BaseDto
 {
     #[Assert\NotBlank(
diff --git a/app/src/Service/Dto/Classes/ResetPasswordCodeDto.php b/app/src/Service/Dto/Classes/ResetPasswordCodeDto.php
index 302631aeca70cb0c60274c7bb2f1a3a449a14704..25c92680b3d8c23717ca6888eab060fd4bc145b5 100644
--- a/app/src/Service/Dto/Classes/ResetPasswordCodeDto.php
+++ b/app/src/Service/Dto/Classes/ResetPasswordCodeDto.php
@@ -5,11 +5,13 @@ namespace App\Service\Dto\Classes;
 use App\Service\Dto\BaseDto;
 use App\Validators\PasswordValidator;
 use App\Validators\UserValidator;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Validator\Constraints as Assert;
 
 #[Assert\Callback([UserValidator::class, 'validateEmailOrPhone'])]
 #[Assert\Callback([PasswordValidator::class, 'validateRepeatPassword'])]
 #[Assert\Callback([PasswordValidator::class, 'validatePassword'])]
+#[AsAlias(id: 'dto.password.code', public: true)]
 class ResetPasswordCodeDto extends BaseDto
 {
     #[Assert\Email(
diff --git a/app/src/Service/Response/Classes/ProfileResponse.php b/app/src/Service/Response/Classes/ProfileResponse.php
index 91c773c2d1f284dc6faf06f4ee6ee2a7d77cb282..5d63c7bab71cdd8705022f3b8a46ca1f77f7b8c7 100644
--- a/app/src/Service/Response/Classes/ProfileResponse.php
+++ b/app/src/Service/Response/Classes/ProfileResponse.php
@@ -3,8 +3,10 @@
 namespace App\Service\Response\Classes;
 
 use App\Entity\User;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Serializer\Annotation\Groups;
 
+#[AsAlias(id: 'response.profile', public: true)]
 class ProfileResponse extends Response
 {
     /**
diff --git a/app/src/Service/Response/Classes/Response.php b/app/src/Service/Response/Classes/Response.php
index 5e10801f5812f364d28690d22da523354d4ef626..b0f32f13cb1594628ea9188f757dbbc4a0acf0d4 100644
--- a/app/src/Service/Response/Classes/Response.php
+++ b/app/src/Service/Response/Classes/Response.php
@@ -3,6 +3,7 @@
 namespace App\Service\Response\Classes;
 
 use App\Service\Response\ResponseServiceInterface;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
 use Symfony\Component\Serializer\Annotation\Groups;
@@ -15,6 +16,7 @@ use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
 use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
 use Symfony\Component\Serializer\Serializer;
 
+#[AsAlias]
 class Response implements ResponseServiceInterface
 {
     /**
@@ -123,6 +125,9 @@ class Response implements ResponseServiceInterface
         $groups = ['message'];
         if (!empty($this->errors)) {
             $this->status = false;
+            if ($this->statusCode === 200) {
+                $this->statusCode = \Symfony\Component\HttpFoundation\Response::HTTP_BAD_REQUEST;
+            }
         } else {
             $this->status = true;
         }
diff --git a/app/src/Service/Response/Classes/TokenResponse.php b/app/src/Service/Response/Classes/TokenResponse.php
index 8ce5a95444e102c4865fbb6d10661f1622379e36..c97b562c757f90b51ae4776193083a562c6055bc 100644
--- a/app/src/Service/Response/Classes/TokenResponse.php
+++ b/app/src/Service/Response/Classes/TokenResponse.php
@@ -2,8 +2,10 @@
 
 namespace App\Service\Response\Classes;
 
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Serializer\Annotation\Groups;
 
+#[AsAlias(id: 'response.token', public: true)]
 class TokenResponse extends Response
 {
     /**
diff --git a/app/src/Service/Response/ResponseServiceInterface.php b/app/src/Service/Response/ResponseServiceInterface.php
index e20fdd578f4e143e709aece6f85188c9d2ac738c..2f0b6e5224567a2d345c73af390fdd269da4335e 100644
--- a/app/src/Service/Response/ResponseServiceInterface.php
+++ b/app/src/Service/Response/ResponseServiceInterface.php
@@ -13,4 +13,6 @@ interface ResponseServiceInterface
     public function addMessage(string $message): self;
 
     public function isSuccess(): bool;
+
+    public function setStatusCode(int $code): self;
 }
\ No newline at end of file
diff --git a/app/src/Service/Send/Classes/Code/PasswordCodeSendService.php b/app/src/Service/Send/Classes/Code/PasswordCodeSendService.php
index a571254bb44c2bd2932d511e4da2d78f55fb1d0f..041b3357811183b09d780d5eb6060e1a7d8a6249 100644
--- a/app/src/Service/Send/Classes/Code/PasswordCodeSendService.php
+++ b/app/src/Service/Send/Classes/Code/PasswordCodeSendService.php
@@ -3,7 +3,9 @@
 namespace App\Service\Send\Classes\Code;
 
 use App\Service\Send\Classes\CodeSendService;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 
+#[AsAlias(id: 'send.code.password', public: true)]
 class PasswordCodeSendService extends CodeSendService
 {
     public function getSubject(): string
diff --git a/app/src/Service/Send/Classes/Code/RecoveryCodeSendService.php b/app/src/Service/Send/Classes/Code/RecoveryCodeSendService.php
index 0e9c5e6016315ddbe894c8c637a28175589dbc90..306e169b1b30edadd00fa8edb5009e33cb1b2f0a 100644
--- a/app/src/Service/Send/Classes/Code/RecoveryCodeSendService.php
+++ b/app/src/Service/Send/Classes/Code/RecoveryCodeSendService.php
@@ -3,7 +3,9 @@
 namespace App\Service\Send\Classes\Code;
 
 use App\Service\Send\Classes\CodeSendService;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 
+#[AsAlias(id: 'send.code.recovery', public: true)]
 class RecoveryCodeSendService extends CodeSendService
 {
     public function getSubject(): string
diff --git a/app/src/Service/Send/Classes/Code/RegisterCodeSendService.php b/app/src/Service/Send/Classes/Code/RegisterCodeSendService.php
index 9371af7187c63479450fc6e0a73c0cae3e5a0a66..4a3dbb9d77fd3218182e15dc5dfeba7605f90fe0 100644
--- a/app/src/Service/Send/Classes/Code/RegisterCodeSendService.php
+++ b/app/src/Service/Send/Classes/Code/RegisterCodeSendService.php
@@ -3,7 +3,9 @@
 namespace App\Service\Send\Classes\Code;
 
 use App\Service\Send\Classes\CodeSendService;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 
+#[AsAlias(id: 'send.code.register', public: true)]
 class RegisterCodeSendService extends CodeSendService
 {
     public function getSubject(): string
diff --git a/app/src/Service/Send/Classes/CodeSendService.php b/app/src/Service/Send/Classes/CodeSendService.php
index eabbcb8862fb176e58c43d46685697edf74f9b21..1aafc513aa49feb8ae43ae60e6f5e7110991eec8 100644
--- a/app/src/Service/Send/Classes/CodeSendService.php
+++ b/app/src/Service/Send/Classes/CodeSendService.php
@@ -8,8 +8,10 @@ use App\Service\Response\ResponseServiceInterface;
 use App\Service\Send\SendService;
 use App\Service\Send\SendServiceInterface;
 use Doctrine\Persistence\ManagerRegistry;
+use Symfony\Component\DependencyInjection\Attribute\AsAlias;
 use Symfony\Component\Serializer\SerializerInterface;
 
+#[AsAlias]
 class CodeSendService implements SendServiceInterface
 {
     private ?User $user = null;
diff --git a/app/src/Service/Send/SendService.php b/app/src/Service/Send/SendService.php
index eb1d5e33554fa91156249fbf0057bbd1a8cdd4f4..487023563fdb1b737f4448aa18ea42500e1aca12 100644
--- a/app/src/Service/Send/SendService.php
+++ b/app/src/Service/Send/SendService.php
@@ -80,7 +80,6 @@ class SendService
                 $this->confirmType
             ));
         } catch (Throwable $e) {
-            dd($e);
         }
     }
 }
\ No newline at end of file