我有一个用户编辑表单,我想管理分配给用户的角色.
目前我有一个多选列表,但我没办法用security.yml中定义的角色层次填充它.
我是否有某种方法可以将此信息提供给FormType类中的表单生成器?
$builder->add('roles', 'choice', array(
'required' => true,
'multiple' => true,
'choices' => array(),
));
Run Code Online (Sandbox Code Playgroud)
环顾四周,我发现我可以从控制器中的容器中获取角色:
$roles = $this->container->getParameter('security.role_hierarchy.roles');
Run Code Online (Sandbox Code Playgroud)
我还发现我可以将其设置为在services.xml中注入FormType类的依赖项:
<parameters>
<parameter key="security.role_heirarchy.roles">ROLE_GUEST</parameter>
</parameters>
<services>
<service id="base.user.form.type.user_form" class="Base\UserBundle\Form\UserType" public="false">
<tag name="form.type" />
<call method="setRoles">
<argument>%security.role_heirarchy.roles%</argument>
</call>
</service>
</services>
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用,似乎没有调用该setRoles方法.
那我怎么能让它运作起来呢?
在你的控制器中
$editForm = $this->createForm(new UserType(), $entity, array('roles' => $this->container->getParameter('security.role_hierarchy.roles')));
Run Code Online (Sandbox Code Playgroud)
在UserType中:
$builder->add('roles', 'choice', array(
'required' => true,
'multiple' => true,
'choices' => $this->refactorRoles($options['roles'])
))
[...]
public function getDefaultOptions()
{
return array(
'roles' => null
);
}
private function refactorRoles($originRoles)
{
$roles = array();
$rolesAdded = array();
// Add herited roles
foreach ($originRoles as $roleParent => $rolesHerit) {
$tmpRoles = array_values($rolesHerit);
$rolesAdded = array_merge($rolesAdded, $tmpRoles);
$roles[$roleParent] = array_combine($tmpRoles, $tmpRoles);
}
// Add missing superparent roles
$rolesParent = array_keys($originRoles);
foreach ($rolesParent as $roleParent) {
if (!in_array($roleParent, $rolesAdded)) {
$roles['-----'][$roleParent] = $roleParent;
}
}
return $roles;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6500 次 |
| 最近记录: |