2016-12-04 1 views
-1

소셜 네트워크에서 3 시간 동안 공유하려고 시도했을 때 PostPersist callback에 일부 링크가 있습니다. 그러나 링크를 통해 소셜 네트워크 페이지에 404 error이 표시되었습니다. PostPersist 콜백이 실행되었을 때 플러시 된 데이터가 실제로 존재하지 않는다는 것을 알았습니다. 그러나 entity->flush() 이후 컨트롤러에서 동일한 코드를 사용하면 링크가 정상적으로 작동합니다.Symfony 교리에서 PostPersist를 사용하는 이유

내가 알고 싶습니다

, 왜 정확히 사람들은

/** 
* @ORM\PostPersist 
*/ 

콜백을 사용합니다. Doctrine2 documentation에서

+3

? PostPersist를 사용하여 엔티티가 생성 된 후 이벤트를 기반으로 사용자에게 메일을 보냅니다. 따라서 여러분은 엔티티를 생성하는 각 컨트롤러 내에서 매번 플러시 (flush)를 수행 할 필요가 없습니다. – Kwido

+0

주어진 엔터티가 지속될 때마다 발생하는 이벤트 인 경우 [custom event subscriber] (http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html) 사용을 고려하십시오. 그들은 어떤 콜백 이벤트보다도 유연합니다. – ferdynator

+0

@Kwido 소셜 네트워크 예제는 데이터가 아직 PostPersist 콜백 중에 데이터베이스에 삽입되지 않았 음을 설명합니다. 그러나 flush()를 호출 한 후 데이터가 데이터베이스에 삽입되었습니다. – user3502626

답변

2

:

postPersist는 - 엔티티가 영속화 된 후 postPersist 이벤트는 개체 발생합니다. 데이터베이스 삽입 조작 후에 호출됩니다. 생성 된 기본 키 값은 postPersist 이벤트에서 사용할 수 있습니다.

그러나 Doctrine2가 기본적으로 트랜잭션을 암시 적으로 호출한다는 점을 고려해야합니다. 이 방법에서는 엔티티 관리자에서 flush()를 사용할 때 트랜잭션이 끝납니다. 따라서 엔티티 관리자를 플러시하지 않는 한 데이터베이스의 데이터를 볼 수 없습니다. EntityManager # flush()는 트랜잭션이 시작되고 끝나는 곳입니다. 그럼에도 불구하고 트랜잭션을 명시 적으로 호출 할 수도 있지만 트랜잭션 시작, 지속 객체 및 커밋 트랜잭션 사이의 데이터를 데이터베이스에서 볼 수는 없습니다.

실제로 Doctrine2에서는 트랜잭션을 생략 할 수 없으므로 PostPersist 이벤트가 발생하면 지속 동작 직후에 데이터가 표시 될 것으로 기대할 수 없습니다.

달성하려면 PostFlush 이벤트를 사용해야합니다. (즉, 자동 번역, 자동 날짜, 일부 특정 관계 업데이트)

  • 는 알림을 보내 생성 된 객체에 의존하는 데이터를 생성

    1. :

      내 실제 삶의 경험에서

      Postperist은에 예를 들어, 사용 다른 이벤트

    2. 보내기 이메일은

    난이 도움이되기를 바랍니다.

    편집
    는 개체에 도착하는 작업 단위를 통해 통과하는 방법의 예를 볼 수 있습니다 onFlush 이벤트의 예를 살펴 보자. onFlush examples

    은 사용하는 특정 오브젝트에 대해 작업하려면 :

    당신이 PostPersist를 사용하는 이유의 질문을 할 수있는 소셜 네트워크 사이트의 이야기를 가지고 무엇
    if ($entity instanceof Product) { 
         // do something with the YourEntityName 
    } 
    
  • +0

    문제는 Doctrine2가 말합니다 : postFlush - postFlush 이벤트는 플러쉬 연산이 끝날 때 발생합니다. **이 이벤트는 수명주기 콜백이 아닙니다. ** – user3502626

    +0

    그리고 후행사를위한 예제는 괜찮습니다. 데이터를 데이터베이스에 삽입하기 전에 이메일을 보내는 것에 동의하지 않는다는 점을 제외하고는. – user3502626

    +0

    @ user3502626 내 편집을보세요. –

    관련 문제