我的情况是这样的,我想从数据库中删除一条用户记录。这很简单。但有两种可能的结果。
我的想法是,针对实体采取的行动Users应该在,UsersRepository所以这就是我的方法所在deleteUser($user)。是通过 ParamConverter 自动查询的$user用户对象并传递给存储库方法。
因为工作是在存储库中完成的,所以对我来说提供反馈是有意义的。
我如何addFlash()从我的App\Repository\UsersRepository extends ServiceEntityRepository?或者我应该在其他地方做这个“工作”?
更新:我很久以前就问过这个问题,虽然我在下面发现的方法有效,正如评论中指出的那样,但这是一种不好的做法。
直接回答我的问题,“其他地方”是如何实现这一点的。
最后,这是一项简单的一次性任务,因此所有逻辑都位于控制器中。从来不需要在其他地方重复使用它。
然而,我也遇到过类似的情况,其中实体的删除要复杂得多。为此,在控制器中创建并使用服务。操作的结果从服务传回,然后控制器将创建闪存消息。这样,服务就不会与需要 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)
| 归档时间: |
|
| 查看次数: |
6155 次 |
| 最近记录: |