Решение зависит от структуры вашего приложения.
Если расчетная цена находится в 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
));
}
}
...