0

Symfonyアプリケーションでeasy-adminを使用しています。私のエンティティはDoctrineを通じて管理されています。

エンティティfieldTemplateにリンクされたエンティティがFieldあり、多対 1 の関係をPosition介しています。

// App\Entity\FieldTemplate.php

/**
 * @ORM\Entity(repositoryClass="App\Repository\FieldTemplateRepository")
 */
class FieldTemplate
{

    /**
    * @ORM\OneToMany(targetEntity="App\Entity\Position", mappedBy="fieldTemplate", cascade={"persist"}, orphanRemoval=true)
    */
    private $positions;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Field", mappedBy="template", cascade={"persist"}, orphanRemoval=true)
     */
    private $fields;
}
// App\Entity\Field.php

/**
 * @ORM\Entity(repositoryClass="App\Repository\FieldRepository")
 */
class Field
{
    /**
    * @ORM\ManyToOne(targetEntity="App\Entity\FieldTemplate", inversedBy="fields", cascade={"persist"})
    */
    private $template;
}
// App\Entity\Position.php

/**
 * @ORM\Entity(repositoryClass="App\Repository\PositionRepository")
 */
class Position
{
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\FieldTemplate", inversedBy="positions")
     * @ORM\JoinColumn(nullable=false)
     */
    private $fieldTemplate;
}

リスナーを使用して、テンプレートfieldsが既にリンクされている場合、テンプレートの削除または編集を防ぎ、ユーザーに新しいテンプレートを作成するように強制したいと思います。

// app\Listener\FieldTemplateListener.php

class FieldTemplateListener
{
    public function preUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getObject();

        if($entity instanceof FieldTemplate)
        {
            if (count($entity->getFields()))
                throw new AccessDeniedException("this template has already field it cannot be changed");
        }
    }

    public function preRemove(LifecycleEventArgs $args)
    {
        $entity = $args->getObject();

        if($entity instanceof FieldTemplate)
        {
            if(count($entity->getFields()))
                throw new AccessDeniedException('this template has already fields it cannot be removed');
        }
    }
}

それは私の中に登録されていますservices

#App\config\services.yaml

services:
    App\EventListener\FieldTemplateListener:
        tags:
            - { name: doctrine.event_listener, event: preRemove, priority: 500 }
            - { name: doctrine.event_listener, event: preUpdate, priority: 500 }

テンプレートを削除しようとすると、エラーがスローされますが、positionsとの両方fieldsが削除され、編集しようとすると、エラーはスローされません....

誰かが私が間違ったことを見ていますか?

4

0 に答える 0