我的情况是这样,我想从数据库中删除用户记录。这很简单。但是有两种可能的结果。
我的想法是,对Users
实体采取的此操作应该在UsersRepository
中,因此这就是我的方法deleteUser($user)
所在的位置。 $user
是用户对象automatically queried via ParamConverter,并传递到存储库方法。
因为工作是在存储库中完成的,所以我可以从中提供反馈。
我如何addFlash()
App\Repository\UsersRepository extends ServiceEntityRepository
?还是应该在其他地方执行此“工作”?
答案 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');
}
}
}