如何验证从数据库中提取并翻译成symfony2的选项?

如何验证从数据库中提取并翻译成symfony2的选项?,symfony,symfony-forms,Symfony,Symfony Forms,**更新** 我找到了一种方法来设置选项验证程序的回调选项: /** * @ORM\ManyToMany(targetEntity="path\to\Entity\Category") * @Assert\Choice(callback="\path\to\CategoryRepository::getBaseLevel", min="1") * * @var Category */ protected $categories; my FormType.php的一部分: \\ AB

**更新**

我找到了一种方法来设置选项验证程序的回调选项:

/**
 * @ORM\ManyToMany(targetEntity="path\to\Entity\Category")
 * @Assert\Choice(callback="\path\to\CategoryRepository::getBaseLevel", min="1")
 * 
 * @var Category
 */
protected $categories;
my FormType.php的一部分:

\\ ABCFormType.php
$builder
    ->add('categories', 'entity', array(
        'class' => 'ABCCommonBundle:Category',
        'query_builder' => function(\path\to\my\custom\repository\CategoryRepository $repo) {
            return $repo->findBaseLevel();
        },
        'expanded' => true,
        'multiple' => true, ));
自定义存储库的一部分:

\\ CategoryRepository.php
class CategoryRepository extends NestedTreeRepository
{
    private static $baseLevel = null;

    public function findCategoriesOfLevel($level = 0)
    {
        return $this->createQueryBuilder('p')
                    ->where('p.lvl = :level')
                    ->setParameter('level', $level)
                    ->orderBy('p.id', 'ASC');

    }

    public function __construct(EntityManager $em, ClassMetadata $class)
    {
        parent::__construct($em, $class);
        if (null == self::$baseLevel) {
            self::$baseLevel = $this->findBaseLevel()->getQuery()->getResult();
        }
    }

    public function findBaseLevel()
    {
        return $this->findCategoriesOfLevel(0);
    }

    public static function getBaseLevel()
    {
        return self::$baseLevel;
    }
现在我有了一个静态方法,所以我在choice validator的回调选项中设置了它:

/**
 * @ORM\ManyToMany(targetEntity="path\to\Entity\Category")
 * @Assert\Choice(callback="\path\to\CategoryRepository::getBaseLevel", min="1")
 * 
 * @var Category
 */
protected $categories;
现在已经确认从数据库中获取了正确的“English”数组,但是由于我通过symfony翻译服务将英文类别名称翻译成中文,所以尽管我选择了一些选项,但验证总是失败!!!
请帮助。

实际上,没有必要将选择约束添加到模型的属性中。NotBlank约束足以完成此工作。如果您有一个选项字段类型或从中继承的任何其他类型(实体字段类型继承自选项),则将自动验证所选实体是否在给定选项中

/**
* @ORM\ManyToMany(targetEntity="path\to\Entity\Category")
* @Assert\NotBlank()
* 
* @var Category
*/
protected $categories;
因此,您的表单可以如下所示:

$builder
    ->add('categories', 'entity', array(
        'class' => 'ABCCommonBundle:Category',
        'query_builder' => function(\path\to\my\custom\repository\CategoryRepository $repo) {
            return $repo->findBaseLevel();
        },
        'expanded' => true,
        'multiple' => true,
        'property' => 'title',
    )
);
您可以在此处阅读有关属性选项的更多信息:

现在渲染的复选框将如下所示:

$builder
    ->add('categories', 'entity', array(
        'class' => 'ABCCommonBundle:Category',
        'query_builder' => function(\path\to\my\custom\repository\CategoryRepository $repo) {
            return $repo->findBaseLevel();
        },
        'expanded' => true,
        'multiple' => true,
        'property' => 'title',
    )
);
categoryttle


其中value属性将保存category主键(它可能是ID),而不是categorytle,您将看到一个翻译的category::title值。

我认为您可以设置
min
选项。或者您可以尝试在实体的$categories属性上设置NotBlank。谢谢您的回复。我尝试过你提到的那些选择,但都失败了。实际上,在选择约束中,必须设置选项或回调选项。对此,我很抱歉。我在想,把它变成一个选择字段(multiple=true,expanded=false)将允许使用min: