Как передать переменную из прослушивателя событий postPersist в контроллер - PullRequest
0 голосов
/ 05 мая 2020

Я реализовал класс EventListener и объявил его в services.yaml. Я хотел бы вернуть своему Контроллеру переменную при сохранении объекта и отправить эту переменную в шаблон веточки. Я хочу показать форму шага в моем представлении, показывающую имя объекта зеленым цветом, например, когда данные сохраняются в базе данных. Если это сработает, я буду использовать тот же процесс в другом контроллере, где я сохраню несколько сущностей. Подводя итог: как уведомить контроллер о том, что указанный c объект был сохранен, передав переменную?

Eventlistener

<?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;
    }
}

services.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
    ]);
}

1 Ответ

0 голосов
/ 06 мая 2020

Вкратце: вы не можете.

Вы можете попытаться обойти это с помощью специального события symfony, но это очень плохо.
Если вы хотите узнать, новая ли сущность или уже сохранен, вы должны вызвать getEntityState в диспетчере сущностей UnitOfWork или разделить потоки между действиями (напишите два разных действия для создания и редактирования).

В любом случае, просто предложение: установите поле createdAt в конструктор сущности;)

...