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

时间:2018-11-23 16:41:12

标签: symfony symfony4

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

  1. 用户已删除
  2. 该用户已被FK 引用,并且删除将失败,因此该用户被标记为已禁用。 (active / enabled = false)

我的想法是,对Users实体采取的此操作应该在UsersRepository中,因此这就是我的方法deleteUser($user)所在的位置。 $user是用户对象automatically queried via ParamConverter,并传递到存储库方法。

因为工作是在存储库中完成的,所以我可以从中提供反馈。

我如何addFlash() App\Repository\UsersRepository extends ServiceEntityRepository?还是应该在其他地方执行此“工作”?

2 个答案:

答案 0 :(得分:2)

您应该添加来自控制器的Flash消息,如官方文档所示:

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小时,非常有用

答案 1 :(得分:-1)

我通过控制台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');
        }
    }
}