首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 4表单处理

Symfony 4表单处理
EN

Stack Overflow用户
提问于 2018-11-23 04:25:55
回答 1查看 157关注 0票数 0

我不太确定symfony是如何为不同的用户/视图提供不同形式的可能性的。

据我所知,你有行动:

代码语言:javascript
复制
public function new(Request $request): Response
{
    $order = new Orders();
    $form = $this->createForm(OrdersType::class, $order);
    $form->handleRequest($request);

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

        return $this->redirectToRoute('orders_index');
    }

    return $this->render('orders/new.html.twig', [
        'order' => $order,
        'form' => $form->createView(),
    ]);
}

生成带有的表单,在本例中为OrdersType。然后视图被加载到new.html.twig文件中。但是一些用户只被允许操作“添加”,它不应该显示计算价格或任何东西的选项。

我该怎么做?

EN

回答 1

Stack Overflow用户

发布于 2018-11-23 05:33:17

解决方案取决于应用程序的结构。

如果计算价格在new.html.twig中,您可以为具有有限访问权限的用户使用另一个文件。

在下面的示例中,"ROLE_RESTRICTED“是用户的角色,只允许添加,而不能看到价格。

例如:

代码语言:javascript
复制
public function new(Request $request): Response
{
    $logged_user    = $this->get('security.token_storage')->getToken()->getUser();
    $order = new Orders();

    $form = $this->createForm(OrdersType::class, $order);
    $form->handleRequest($request);

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

        return $this->redirectToRoute('orders_index');
    }

   if($logged_user->hasRole('ROLE_RESTRICTED')){
       $view = 'orders/newRestricted.html.twig'
   }else{
       $view = 'orders/new.html.twig';
   }

    return $this->render($view , [
        'order' => $order,
        'form' => $form->createView(),
    ]);
}

如果new.html.twig和newRestricter.html.twig之间的差别很小,你可以只保留一个twig文件,并只创建一些条件区域:

代码语言:javascript
复制
 {% if not app.user.hasRole('ROLE_RESTRICTED') %}
     <a href="{{path('edit_order')}}">Edit an order</a>
 {% else %}

不要忘了保护避免直接URL访问对应的路由(在控制器中):

代码语言:javascript
复制
public function edit($id)
{

     $logged_user   = $this->get('security.token_storage')->getToken()->getUser();
     if($logged_user->has_role('ROLE_RESTRICTED')) {
            throw $this->createAccessDeniedException('Access denied');
     }

     // create form, return render, etc.

}

事实上,您必须限制对页面或部分视图的访问。您可以在官方文档https://symfony.com/doc/current/security.html的安全部分找到更多详细信息

另一个解决方案是在表单构建器中创建过滤器:

代码语言:javascript
复制
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class OrdersType extends AbstractType
{
private $tokenStorage;

public function __construct(TokenStorageInterface $tokenStorage)
{
    $this->tokenStorage = $tokenStorage;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $logged_user = $this->tokenStorage->getUser();
   if(!$logged_user->hasRole('ROLE_RESTRICTED')){
        $builder->add('MyField', TextType::class,array(
             'required'             => false
        ));
    }
 }
 ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53437639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档