教义。缓存。实体关系

时间:2018-02-13 07:08:13

标签: symfony caching doctrine-orm orm doctrine

我有两个实体公司存储,具有一对多双向关系。实体及其关系被缓存(doctrine二级缓存)。问题在于,当我创建新的存储实体时,在我手动清除缓存之前,公司存储集合没有这个新实体。

 AppBundle\Entity\Main\Company:
    type: entity
    table: main.company
    cache:
        usage: NONSTRICT_READ_WRITE
    id:
        id:
            type: integer
            nullable: false
            id: true
            generator:
                strategy: IDENTITY
    fields:
        legalName:
            type: string
            nullable: false
            length: 255
            options:
                fixed: false
            column: legal_name
   oneToMany:
      storages:
          targetEntity: AppBundle\Entity\Main\Storage
          mappedBy: company
          cascade: ["all"]
          orphanRemoval: true
          cache:
              usage: NONSTRICT_READ_WRITE


AppBundle\Entity\Main\Storage:
    type: entity
    table: main.storage
    cache:
        usage: NONSTRICT_READ_WRITE
    id:
        id:
            type: integer
            nullable: false
            options:
                unsigned: false
            id: true
            generator:
                strategy: IDENTITY
    fields:
        storageName:
            type: string
            nullable: true
            length: 255
            options:
                fixed: false
            column: storage_name

    manyToOne:
        company:
            targetEntity: AppBundle\Entity\Main\Company
            cascade: ["all"]
            fetch: LAZY
            mappedBy: null
            inversedBy: storages
            joinColumns:
                company_id:
                    referencedColumnName: id
            orphanRemoval: false
            cache:
                usage: NONSTRICT_READ_WRITE

这是创建存储的操作。没有什么不寻常的。

public function addAction(Request $request)
{
    $form = $this->createForm(StorageAddType::class, null);
    $form->handleRequest($request);

    if (!$form->isSubmitted()) {
        throw new \RuntimeException('Некорректный запрос');
    }
    if (!$form->isValid()) {
        throw new \Symfony\Component\Validator\Exception\ValidatorException((string)$form->getErrors(true));
    }

    $doctrine = $this->getDoctrine();

    /**
     * @var Storage $storage
     */
    $storage = $form->getData();


    $manager = $doctrine->getManager();

    $manager->persist($storage);
    $manager->flush();
    return $this->createAjaxDataResponse($this->createSuccessMessage('Storage successfully added'));
}

仅在我尝试创建新实体(存储)时才会观察此类行为。然后,更新/删除操作 - 公司存储集合将更新。

1 个答案:

答案 0 :(得分:0)

持久化数据显然是错误的。您尝试通过管理器将未序列化的对象从表单保存到未知的存储库中。

试试这个:

public function addAction(Request $request)
{
    $form = $this->createForm(StorageAddType::class, null);
    $form->handleRequest($request);
    $em = $this->getDoctrine()->getManager();

    if($form->isSubmitted() && $form->isValid())
    {
        $storage = new Storage();
        $storage->setVal1($form->get('Val1'));
        $storage->setVal2($form->get('Val2'));
        $em->persist($storage);
        $em->flush();

        return $this->createAjaxDataResponse($this->createSuccessMessage('Storage successfully added'));
    }

    return $this->render('YOUR_TWIG_LAYOUT', [
        'form' => $form->createView()
    ]);
}

如果通过将数据序列化为实体来正确地序列化表单,您还可以尝试保留整个对象。编写类似setValsFromForm($data)的方法,并从$ data表单序列化变量。 然后改变这些行:

$storage->setVal1($form->get('Val1')); $storage->setVal2($form->get('Val2'));

$storage->setValsFromForm($form->getData());

此外: 异常和表单验证应由表单类中的表单验证器处理,而不是在控制器中处理。例外情况是在控制器中通过formbuilderinterface创建表单,但是在那里添加逻辑,而不是在$ form类之外。