用户组的奏鸣曲验证不起作用

Posted

技术标签:

【中文标题】用户组的奏鸣曲验证不起作用【英文标题】:sonata validation of user group not working 【发布时间】:2017-07-10 00:24:01 【问题描述】:

我正在使用带有 fos 用户包的奏鸣曲 2.8,我扩展了用户实体和管理员,除了用户组的验证之外,它可以处理所有内容。

如果用户几乎没有选择一个组,我会阻止发送数据的内联错误,这可能吗?

我已经试过了

->add('groups', 'sonata_type_model', array(
                    'expanded' => true,
                    'multiple' => true,
                    'required'    => true
                ))

但不工作

问题出现在具有多对一或多对多关系的每个字段中,例如我有一个 2 个实体 paese ,区域,与

// paeseAdmin.php

$formMapper
        ->with('Zone')
            ->add('name', 'text' , array('label'=>"Paese"))
            ->add('zone','sonata_type_collection',array('by_reference' => false, 'required' => true,), array( 'edit' => 'inline','inline' => 'table', 'class' => 'test',))

        ->end() 
    ;

// paese  entity
/**
* @var Zona
* @ORM\OneToMany(targetEntity="Zona", mappedBy="paesi" ,  orphanRemoval=true, cascade="persist")
* @ORM\OrderBy("nome" = "ASC")
*/
private $zone;



// zona entity
/**
 * @var Paese
 * @ORM\ManyToOne(targetEntity="Paese", inversedBy="zone" )
 * @ORM\OrderBy("nome" = "ASC")
 * @ORM\JoinColumn(name="paese_id", referencedColumnName="id")
*/
private $paesi;

有什么想法吗?谢谢

【问题讨论】:

【参考方案1】:

在我的奏鸣曲版本中,没有什么对我有用。

奏鸣曲项目/管理包 3.51.0

friendsofsymfony/user-bundle v2.1.2

无论如何都没有调用 validate 方法。

所以我最终写了一个验证:

#File: src/Application/Sonata/UserBundle/Resources/config/validation.xml

    <property name="groups">
        <constraint name="Count">
            <option name="min">1</option>
            <option name="minMessage">Please choose one group.</option>
        </constraint>
    </property>

【讨论】:

【参考方案2】:

如果您使用 Sonata Admin 包,您可以使用 validate 继承函数来进行高级验证(例如收集计数)

例如:

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\CoreBundle\Validator\ErrorElement;

class UserAdmin extends AbstractAdmin


    /// ...

    public function validate(ErrorElement $errorElement, $object)
    
        if (!$object->getGroups()->count()) 
            $errorElement
                ->with('groups')
                ->addViolation('You should select at least one group')
                ->end();
        

        parent::validate($errorElement, $object);
    


【讨论】:

非常感谢!文档没有提到这一点【参考方案3】:

所以你必须在你的实体用户中添加这些行

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;


    /**
     * @Assert\Callback(methods="isGroupValid")
     */
     public function isGroupValid(ExecutionContextInterface $context)
    
        if ($this->groups->count()==0) 
            $context
                 ->buildViolation('choisir au minimum un group!', array(), null)
                 ->atPath('groups')
                 ->addViolation()`enter code here`;
        
    

【讨论】:

【参考方案4】:

你有'required' =&gt; false,然后'required' =&gt; true你需要删除多余的

来自奏鸣曲类型集合的奏鸣曲文档

将“必需”选项设置为 true 不会导致要求“至少一个”子实体。将“必需”选项设置为 false 会导致所有嵌套表单字段也变为不需要。

当您将required =&gt; true 添加到sonata_type_collection 字段时,您只允许在子表单中包含必填字段。

【讨论】:

删除后没有任何变化 如果您有required =&gt; true,您应该会出现一个工具提示,告诉您在提交表单时必须从列表中选择一个元素。无论如何您可能不想看@987654321 @它是为了将 FOSuser 集成到 Sonata admin 中,所以它应该可以为您节省一些麻烦 我有 Sonatauserbundle,但我的验证仍然无效 问题出在每个领域都是多对一和多对多 所以不可能验证?

以上是关于用户组的奏鸣曲验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章

奏鸣曲管理员 many_to_one 可编辑不起作用

Sonata Admin + Vich Upload 加载时注入不起作用

Django用户注册验证不起作用

为啥我的电话身份验证安全规则不起作用?

Sonata Admin 编辑表单多对多不起作用 - symfony2.1.6

如果用户输入了空格或换行符,则 JQuery 验证不起作用