用户组的奏鸣曲验证不起作用
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' => false
,然后'required' => true
你需要删除多余的
来自奏鸣曲类型集合的奏鸣曲文档
将“必需”选项设置为 true 不会导致要求“至少一个”子实体。将“必需”选项设置为 false 会导致所有嵌套表单字段也变为不需要。
当您将required => true
添加到sonata_type_collection
字段时,您只允许在子表单中包含必填字段。
【讨论】:
删除后没有任何变化 如果您有required => true
,您应该会出现一个工具提示,告诉您在提交表单时必须从列表中选择一个元素。无论如何您可能不想看@987654321 @它是为了将 FOSuser 集成到 Sonata admin 中,所以它应该可以为您节省一些麻烦
我有 Sonatauserbundle,但我的验证仍然无效
问题出在每个领域都是多对一和多对多
所以不可能验证?以上是关于用户组的奏鸣曲验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Sonata Admin + Vich Upload 加载时注入不起作用