【问题标题】:Symfony & doctrine : object not updated in a searchSymfony 和教义:对象未在搜索中更新
【发布时间】:2018-08-20 22:05:03
【问题描述】:

我正在测试 phpUnit 中的某个动作。

在我的测试中,我从容器中获取了实体管理器。我创建了一个实体 $finalisation,然后将其插入到我的表中:

public function testAction()
{

self::bootKernel();
        $em = static::$kernel->getContainer()
        ->get('doctrine')
        ->getManager()
        ;
//I create some $finalisation entity, and insert it
(...)
$em->persist($finalisation);
$em->flush();

//I call then the action to test (my function authentification works well)
$crawler = $this->authentification("/annonce/finaliser-annonce/annonce-en-cours-4");
// (... MORE CODE SEE BELOW)
}

此操作旨在通过服务 (GestionnaireFinalisation) 更改 $finalisation 对象:$finalisation 的 finaliseParAuteur 字段从 false 变为 true。

现在,我有一项名为 GestionnaireFinalisation 的服务,它可以将字段转换为 对象 $finalisation 从 FALSE 到 TRUE

class GestionnaireFinalisation 
{
    protected $em;

    public function __construct(EntityManager $entityManager){
        $this->em = $entityManager;
    }

public function finalisationParAuteur($annonceEnCours, $profilAuteur)
    {
        $finalisation = $this->em->getRepository('AppBundle:Finalisation')
        ->findFinalisationParProfilAuteur($annonceEnCours, $profilAuteur);

        if ($finalisation->getFinaliseParPresta())
        {
            // ... THIS CODE IS NOT RUN
        }
        else
        {
            //THIS IS THE CODE WHICH IS RUN
            $finalisation->setFinaliseParAuteur(true);
            $this->em->flush();
            return (false);
        }
    }

现在问题来了:

当我在测试中搜索 $finalisation 时,似乎我没有修改对象:

$finalisation = $em->getRepository(Finalisation::class)
        ->someMethodToGetTheFinalisationUpdated();

证明:当我转储 $finalisation 时,我在 dateCreation 和 dateUpdate 中得到了相同的 DateTime,这不应该是这种情况,因为该对象在服务中被函数 finalisationParAuteur 修改了。

我怀疑问题出在两个实体管理器上(一个在测试中,另一个在服务中)。

非常感谢任何帮助!

谢谢!

【问题讨论】:

    标签: symfony doctrine entitymanager


    【解决方案1】:

    经过一番挣扎,我找到了解决方案。

    就是这样,希望对其他人有所帮助!

    当我使用实体管理器调用服务时,$finalisation 会被修改。并且在测试中,$finalisation 仍然指向旧版本的对象。

    解决方案是使用刷新方法(我以前从未使用过):

    $em->refresh($finalisation);
    

    这个方法刷新了对象,所以我得到了在服务中进行了所有修改的对象!

    【讨论】:

      猜你喜欢
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2018-01-02
      相关资源
      最近更新 更多