0

2 つのフィールドがあり、両方を組み合わせて一意の検証が必要です。意味namecity組み合わせはユニークでなければなりません。ただし、検証は次の場合にのみトリガーされますname

Entity\Location:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 
            fields: [name, city]
            message: "Location for given City Already Exists"
4

1 に答える 1

1

これを行うには、コールバック検証を作成する必要があります。コールバック メソッドは、都市と名前の指定された組み合わせに対して既存の場所があるかどうかを確認し、場所が存在する場合はフォーム エラーをスローします。この例では。エンティティ内でエンティティ マネージャを呼び出す必要があります。そのため、サービス コンテナはバンドルとともに渡され、呼び出されます。

security.yml 内

Venom\ExampleBundle\Entity\Location:
constraints:
    - Callback:
        methods:   [isUniqueCityAndNameCombination]

エンティティ内

use Symfony\Component\Validator\ExecutionContext;
use Venom\ExampleBundle;

public function isUniqueCityAndNameCombination(ExecutionContext $context)
{
    $city = $this->getCity();
    $name = $this->getName();
    //you will have to call the Entity repository within the entity
    $em = ExampleBundle::getContainer()->get('doctrine')->getEntityManager();
    $location = $em->getRepository('ExampleBundle:Location')->findByNameAndCity(
                                                               $city, $name);

   if($location) {
        $propertyPath = $context->getPropertyPath() . '.name';
        $context->setPropertyPath($propertyPath);
        $context->addViolation("Location for given City Already Exists", array(), null);
    }

    return;
}

リポジトリ内

  public function dindByNameAndCity($city, $name)
 {
    $qb = $this->getEntityManager()->createQueryBuilder();
    $em = $this->getEntityManager();
    $qb->select('a')
            ->from('ExampleBundle:Location', 'a')
            ->andWhere('a.city = :city')
            ->andWhere('a.name = :name')
            ->setParameter('city', $city)
            ->setParameter('name', $name)
    ;
    $q = $qb->getQuery();
    $entity = $q->getOneOrNullResult();
return $entity;

}

バンドル ファイルで、この場合は ExampleBundle.php

 namespace Venom\ExampleBundle;

 use Symfony\Component\HttpKernel\Bundle\Bundle;
 use \Symfony\Component\DependencyInjection\ContainerInterface;

 class ExampleBundle extends Bundle
{
private static $containerInstance = null; 

public function setContainer(ContainerInterface $container = null) 
{ 
    parent::setContainer($container); 
    self::$containerInstance = $container; 
}

public static function getContainer() 
{ 
    return self::$containerInstance; 
}

}

于 2013-10-21T05:55:22.463 に答える