Symfony 4 Обработка форм - PullRequest
       3

Symfony 4 Обработка форм

0 голосов
/ 22 ноября 2018

Я не совсем уверен, как 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.Но некоторым пользователям разрешено только действие «добавить», которое не должно отображать опцию расчетной цены или что-либо еще.

Как мне это сделать?

1 Ответ

0 голосов
/ 23 ноября 2018

Решение зависит от структуры вашего приложения.

Если расчетная цена находится в 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 вы можете сохранить только один файл ветки и просто сделать несколько условных зон:

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

Не забудьте защитить маршрут, соответствующий избеганию прямого доступа по 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
        ));
    }
 }
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...