Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms Symfony 4表格处理_Forms_Symfony - Fatal编程技术网

Forms Symfony 4表格处理

Forms Symfony 4表格处理,forms,symfony,Forms,Symfony,我不太清楚symfony是如何为不同的用户/视图提供不同表单的 据我所知,你有以下行动: public function new(Request $request): Response { $order = new Orders(); $form = $this->createForm(OrdersType::class, $order); $form->handleRequest($request); if ($form->isSubmitt

我不太清楚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文件中。但是一些用户只允许在action add上使用,它不应该显示计算价格或其他选项


如何做到这一点?

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

如果计算价格在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 %}
事实上,您必须限制对页面或部分视图的访问。 您可以在官方文档的安全部分找到更多详细信息:

另一种解决方案是在form builder中创建过滤器:


嗨,Gulvar,但这样我仍然使用相同的生成器字段。我需要知道如何创建两种不同的构建器类型,否则我将不得不在细枝文件中反复创建整个表单。我添加了一个关于如何在表单构建器中创建用户登录的用户角色的示例。
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.

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