首页 > 解决方案 > Symfony 4 表单处理

问题描述

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

据我了解,您可以采取以下行动:

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 文件中。但是某些用户只允许执行“添加”操作,该操作不应显示计算价格的选项或其他任何内容。

我怎么做?

标签: formssymfony

解决方案


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

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

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

例如 :

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 文件并制作一些条件区域:

 {% if not app.user.hasRole('ROLE_RESTRICTED') %}
     <a href="{{path('edit_order')}}">Edit an order</a>
 {% else %}

不要忘记保护与 avoir 直接 URL 访问(在控制器中)相对应的路由:

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

另一种解决方案是在表单构建器中制作过滤器:

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
        ));
    }
 }
 ...

推荐阅读