Symfony 4,来自存储库或其他地方的闪存消息?

Cha*_*had 0 symfony symfony4

我的情况是这样的,我想从数据库中删除一条用户记录。这很简单。但有两种可能的结果。

  1. 该用户已被删除
  2. 该用户已被外键引用删除会失败,因此该用户被标记为禁用。(活动/启用=假)

我的想法是,针对实体采取的行动Users应该在,UsersRepository所以这就是我的方法所在deleteUser($user)是通过 ParamConverter 自动查询的$user用户对象并传递给存储库方法。

因为工作是在存储库中完成的,所以对我来说提供反馈是有意义的。

我如何addFlash()从我的App\Repository\UsersRepository extends ServiceEntityRepository?或者我应该在其他地方做这个“工作”?

Cha*_*had 7

更新:我很久以前就问过这个问题,虽然我在下面发现的方法有效,正如评论中指出的那样,但这是一种不好的做法。

直接回答我的问题,“其他地方”是如何实现这一点的。

最后,这是一项简单的一次性任务,因此所有逻辑都位于控制器中。从来不需要在其他地方重复使用它。

然而,我也遇到过类似的情况,其中实体的删除要复杂得多。为此,在控制器中创建并使用服务。操作的结果从服务传回,然后控制器将创建闪存消息。这样,服务就不会与需要 flash 和会话的 UI 绑定。

原答案如下

我找到了FlashBagInterface通过控制台bin/console debug:autowiring

所以正常的依赖注入Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface

你可以$this->FlashBagInterface->add()简单地。

为了答案的完整性,这里是代码;

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');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)