Symfony 4, прошивать сообщения из репозитория или еще где-то? - PullRequest
0 голосов
/ 23 ноября 2018

Моя ситуация такова, я хочу удалить запись пользователя из базы данных.Это достаточно просто сделать.но возможны 2 результата.

  1. Пользователь удален
  2. Пользователь ссылается на FK , а удаление завершится неудачей , значит, пользователь помечен как отключенный.(active / enabled = false)

Я думаю, что это действие, предпринятое против сущности Users, должно быть в UsersRepository, так что именно там находится мой метод deleteUser($user).$user являющийся объектом пользователя автоматически запрашивается через ParamConverter и передается методу хранилища.

Поскольку работа выполняется в хранилище, именно здесь мне имеет смысл предоставить обратную связьот.

Как мне addFlash() от моего App\Repository\UsersRepository extends ServiceEntityRepository?или я должен сделать эту "работу" в другом месте?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы должны добавить флэш-сообщение от контроллера, как показано в официальном документе:

https://symfony.com/doc/current/controller.html

Кроме того, если вы новичок в Symfony, вы можете посмотреть, какуслуги работают, потому что это то место, где будет много вашей работы и методов.если вы используете Doctrine, действие по удалению пользователя в контроллере должно выглядеть следующим образом:

MyAction(User $user){

    $em = $this->getDoctrine()->getManager();
    $em->remove($user);
    $em->flush();

    $this->addFlash(
        'notice',
        'Your user is now deleted!'
    );
   return $this->redirectToRoute('some_other_route');
}

Это немного «из коробки» и, конечно, может быть улучшено, но вы поняли идею ...Мой совет: пройдите официальный документ, его легко запустить :), в конце концов, попробуйте пройти первые курсы Knp symfony4, это 2-3 часа и довольно полезно

0 голосов
/ 23 ноября 2018

Я нашел FlashBagInterface через консоль bin/console debug:autowiring

Так что обычное внедрение зависимостей составляет Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface

, и вы можете $this->FlashBagInterface->add() simple.

для полнотыОтвет, вот код:

src / Repository / UsersRepository.php (большая часть кода удалена для компактности)

<?php

namespace App\Repository;

// use ...
use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;

// ...

class UsersRepository extends ServiceEntityRepository
{

    private $security;
    private $request;
    private $flash;

    public function __construct(RegistryInterface $registry, Security $security, RequestStack $request, FlashBagInterface $flash)
    {
        parent::__construct($registry, Users::class);
        $this->security = $security;
        $this->request = $request;
        $this->flash = $flash;
    }

    // ...

    /**
     * deleteUser
     *
     * @param Users $user
     * @return void
     */
    public function deleteUser($user)
    {
        $em = $this->getEntityManager();
        $user->setEnabled(false);
        $em->flush();
        try {
            $em->remove($user);
            $em->flush();
            $this->flash->add('notice', 'user.manager.user.deleted');
        } catch (ForeignKeyConstraintViolationException $e) {
            $this->flash->add('notice', 'user.manager.user.can.not.delete.disabled');
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...