gpt4 book ai didi

php - 如何将完整的安全角色列表/层次结构传递给 Symfony2 中的 FormType 类?

转载 作者:行者123 更新时间:2023-12-02 15:04:30 25 4
gpt4 key购买 nike

我有一个用户编辑表单,我想在其中管理分配给用户的角色。

目前我有一个多选列表,但我无法使用 security.yml 中定义的角色层次结构填充它。

是否有某种方法可以将此信息传递给 FormType 类中的表单构建器?

$builder->add('roles', 'choice', array(
'required' => true,
'multiple' => true,
'choices' => array(),
));

环顾四周I found我可以通过以下方式从 Controller 中的容器获取角色:

$roles = $this->container->getParameter('security.role_hierarchy.roles');

我还发现我可以将其设置为要注入(inject)到 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>

但是这不起作用,并且似乎没有调用 setRoles 方法。

那么我怎样才能让它发挥作用呢?

最佳答案

在你的 Controller 中

$editForm = $this->createForm(new UserType(), $entity, array('roles' => $this->container->getParameter('security.role_hierarchy.roles')));

在用户类型中:

$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;
}

关于php - 如何将完整的安全角色列表/层次结构传递给 Symfony2 中的 FormType 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10517452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com