forms - 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 文件中。但是某些用户只允许执行“添加”操作,该操作不应显示计算价格的选项或其他任何内容。
我怎么做?
解决方案
解决方案取决于您的应用程序的结构。
如果计算价格在 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
));
}
}
...
推荐阅读
- reactjs - 带有图像的语义 ui-react 菜单无法对齐
- css - 无法调整表体的高度以进行溢出滚动
- sql - 在oracle中将多行转换为单行
- vb.net - SqlDataReader 项属性失去连接
- graphics - MeshLab 在导入网格时对其进行预处理
- python - 将列表写为 txt 文件中的列
- javascript - onload后如何动态显示图片标签
- javascript - Facebook 登录回调返回名称但不返回电子邮件地址
- r - 如何在 Rstudio 中使用带有 z shell 而不是 bash 的 linux 的 windows 子系统?
- excel - 使用“后退”和“前进”按钮搜索索引以显示表格上的总用户数和实际单元格中的用户数