我有一个用于向系统添加新用户的formType。现在我想重用这个formType来修改用户配置文件,但是当我想继续打印所有字段时,我只想允许根据用户对修改用户的权限来编辑它们。 当然,我可以在FormType中使用readonly属性,但这只是在HTML代码中放入一个只读标记,这只不过是一个装饰。我可以将这些字段添加到" if"阻止只有在用户具有适当权限时才添加字段,但随后使用模拟整个表单的代码将twig代码变脏。 另一种方法是这样做吗?
答案 0 :(得分:0)
您可以在控制器中执行此操作,只需使用Voter
类检查edit
操作中的权限
此外,您还必须创建EDIT_*
权限,例如EDIT_USER_NEWS
,EDIT_USER_ARTICLE
[...]
如果用户没有EDIT
权限,只需抛出AccessDeniedException()异常
// editAction()
$sc = $this->get('security.context');
if (false === $sc->isGranted('EDIT', $user)) {
throw new AccessDeniedException('Nope you cant edit this!');
}
现在,如果用户具有EDIT
权限,则只需根据用户权限设置表单
$user = new User();
$disabled_fields = array(); // This can be a risk
if ($sc->isGranted('EDIT_USER_NEWS', $user)) {
$disabled_fields = array('field3', 'field4');
}
if ($sc->isGranted('EDIT_USER_ARTICLE', $user)) {
$disabled_fields = array('field1', 'field2');
}
$form = $this->createForm(new UserType(), $user, array('fields' => $disabled_fields));
// ...
在FormType中,根据给定的选项禁用字段
// FormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
if (isset($options['fields'])) {
$builder->add('field1', null, array('disabled' =>
isset($options['fields']['field1'])));
// others fields...
} else {
// Show all the fields?
}
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array('fields' => array()));
}
disabled
选项将禁用该字段,表示用户无法对其进行编辑,即使用户在HTML中删除了该属性
当然,有很多方法可以解决这个问题,但我在项目中有这种方式