我已经实现了一个EventListener类,并在services.yaml中声明它,我想在实体被持久化时返回一个变量给我的Controller,并把这个变量发送到twig模板。我想在我的视图中显示一个步骤表单,例如当数据被持久化到数据库中时,实体名称会以绿色显示。如果成功的话,我将在另一个控制器中使用同样的过程,在那里我坚持多个实体。总结一下。如何通过传递一个变量来通知控制器某个实体已经被持久化了?
事件监听器
<?php
namespace App\EventListener;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use App\Entity\Article;
class TodoListener {
public function postPersist(LifecycleEventArgs $args) {
$entity = $args->getObject();
if(!$entity instanceof Article)
return;
$var = 'foo';
return $var;
}
}
服务.yaml
App\EventListener\TodoListener:
tags:
- { name: doctrine.event_listener, event: postPersist }
控制器
/**
* @Route("/blog/new", name="blog_create")
* @Route("/blog/{id}/edit", name="blog_edit")
*/
public function form(Article $article = null, Request $request, ObjectManager $manager)
{
if (!$article) {
$article = new Article();
}
$form = $this->createForm(ArticleType::class, $article);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (!$article->getId()) {
$article->setCreatedAt(new \dateTime());
}
$manager->persist($article);
$manager->flush();
/**
* Get back variable when entity is persisted ???
*/
return $this->redirectToRoute('blog_show', ['id' => $article->getId()]);
}
return $this->render('blog/create.html.twig', [
'formArticle' => $form->createView(),
'editMode' => $article->getId() !== null
]);
}
简而言之:你不能这样做。
你可以尝试用一个自定义的symfony事件来解决这个问题,但是非常糟糕。如果你想知道一个实体是新的还是已经被持久化,你应该调用 getEntityState
实体经理人 UnitOfWork
或者在动作之间分割流程(为new和edit写两个不同的动作)。
总之,只是一个建议:将 createdAt
字段到实体构造函数中;)