如何从postPersist事件监听器传递变量到Controller?

问题描述 投票:0回答:1

我已经实现了一个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
    ]);
}
service symfony4 event-listener
1个回答
0
投票

简而言之:你不能这样做。

你可以尝试用一个自定义的symfony事件来解决这个问题,但是非常糟糕。如果你想知道一个实体是新的还是已经被持久化,你应该调用 getEntityState 实体经理人 UnitOfWork 或者在动作之间分割流程(为new和edit写两个不同的动作)。

总之,只是一个建议:将 createdAt 字段到实体构造函数中;)

© www.soinside.com 2019 - 2024. All rights reserved.