【问题标题】:Symfony2 - User specific form based on role accessSymfony2 - 基于角色访问的用户特定表单
【发布时间】:2014-09-24 01:40:31
【问题描述】:

我有一个表单,它有一个类别字段下拉列表,其中包含一个 (OneToMany/ManyToOne) 到一个帖子实体。

情况:现在客户必须在下拉列表中选择类别,他们可能会犯选择错误类别的错误,这将转到另一个博客(如果他们选择了错误的类别)他们将无权将其更改回正确的类别。

为了缓解这个潜在的问题,我想做两个中的一个作为解决方案:

1) 根据他们有权访问的类别自动设置类别

2) 或限制用户仅选择他们有权访问的类别(例如,如果用户具有特定角色,他们只能在下拉菜单中获得该类别)

用户有一个 ROLE_USER 限制,只允许他们对他们有权访问的内容进行 CRUD。

例如,

  • ROLEUSER1 只能访问 /category1(并且可以在此使用 CRUD)

  • ROLEUSER2 只能访问 /category2(并且可以对此使用 CRUD)

  • ROLEUSER3 只能访问 /category3(并且可以对此使用 CRUD)

我该如何设置这样客户才不会犯选择错误类别的错误?

表格

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title')
        ->add('body')
        ->add('author')
        ->add('category')
        ->add('file', 'file', array(
            'label'    => 'Image',
            'required' => false
        ))
        ->add('created');
}

控制器

public function job1CreateAction(Request $request)
{
    $entity = new Post();
    $form = $this->createCreateForm($entity);
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('job1_show', array('id' => $entity->getId())));
    }

    return array(
        'entity' => $entity,
        'form' => $form->createView(),
    );
}

private function createCreateForm(Post $entity)
{
    $form = $this->createForm(new PostType(), $entity, array(
        'action' => $this->generateUrl('job1_create'),
        'method' => 'POST',
    ));

    $form->add('submit', 'submit', array('label' => 'Create'));

    return $form;
}

【问题讨论】:

    标签: forms symfony drop-down-menu user-roles


    【解决方案1】:

    这个怎么样? : 从表单生成器中删除“类别”字段并在控制器操作中手动设置:

    if ($this->get('security.context')->isGranted('ROLEUSER1') {
        $entity->setCategory(CATEGORY1);
    }
    

    编辑:

    控制器动作:

    public function job1CreateAction(Request $request)
    {
        $entity = new Post();
    
        if ($this->get('security.context')->isGranted('ROLEUSER1') {
            $category1 = $this->getDoctrine()->getManager()->getRepository('MYBUNDLE:POST')->find(1); // we are getting category object. this is just an example cade, may be this will be different in your case
    
            $entity->setCategory($category1);
        }
    
        $form = $this->createCreateForm($entity);
        ....
    }
    

    和形式:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('body')
            ->add('author')
            //->add('category')
            ->add('file', 'file', array(
                'label'    => 'Image',
                'required' => false
            ))
            ->add('created');
    }
    

    【讨论】:

    • 这个方法的问题,我正在使用CRUD生成doctrine:generate:crud,那么这个在控制器中的位置,你能举个例子吗?
    • @chance 如果您使用教义生成动作,您应该查看 Controller 文件夹中的 PostController。必须有 createAction.. 只需编辑该操作..
    • 对,但是在 createAction 中,更新了我的查询以显示 createAction 和 createForm 操作。
    • @chance 我更新了答案,添加了一些示例代码
    • @chance find() 方法通过id获取对象,可以找到一些信息here
    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 2022-09-27
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多