我在創建symfony 2 + FOSUserBundle中的新/編輯用戶表單時遇到了問題。我想啓用管理員從下拉列表或單選按鈕列表中選擇用戶角色,但似乎無法使其工作。我在這裏找到了這個答案How can I pass a full security roles list/hierarchy to a FormType class in Symfony2?這是我能找到的最相關的東西,但它不起作用。如何使用表單在symfony 2中編輯用戶權限?
這是UserType形式,因爲它目前代表。我想從容器中獲取角色,但是我似乎無法在沒有拋出錯誤的情況下工作。這些角色將正確填充下拉菜單,但不會顯示當前分配的角色,也不會允許更新信息,因爲它預期它是一個數組$entity->addRoles(array('ROLE_SUPER_ADMIN'));
,但它只是以字符串形式提交。
namespace Wes\AdminBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class UserType extends AbstractType
{
private $roles;
public function __construct($roles) {
$this->roles = $roles;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username')
->add('email')
->add('enabled')
->add('roles', 'choice', array(
'choices' => $this->flattenArray($this->roles),
))
->add('firstName')
->add('lastName')
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Wes\AdminBundle\Entity\User',
'roles' => null,
'userRole' => null,
));
}
public function getName()
{
return 'wes_adminbundle_usertype';
}
private function flattenArray(array $data)
{
$returnData = array();
foreach($data as $key => $value)
{
$tempValue = str_replace("ROLE_", '', $key);
$tempValue = ucwords(strtolower(str_replace("_", ' ', $tempValue)));
$returnData[$key] = $tempValue;
}
return $returnData;
}
}
這是控制器。
public function editAction($id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('WesAdminBundle:User')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find User entity.');
}
$editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $entity);
$deleteForm = $this->createDeleteForm($id);
return $this->render('WesAdminBundle:User:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
}
/**
* Edits an existing User entity.
*
*/
public function updateAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('WesAdminBundle:User')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find User entity.');
}
$deleteForm = $this->createDeleteForm($id);
$editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $entity);
$editForm->bind($request);
if ($editForm->isValid()) {
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('wes_admin_user_edit', array('id' => $id)));
}
return $this->render('WesAdminBundle:User:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
}
我一直在爲此奮戰了幾天,現在我似乎無法讓它正常工作。有什麼想法嗎?
當您嘗試從容器中檢索角色時,會出現什麼錯誤? (security.role_hierarchy.roles) – Mike
它告訴我,我正在調用一個非對象的方法。但我認爲這與使用containerAwareInterface的方法有關。 – JeremyC