【问题标题】:Symfony 4 Form posting to a routeSymfony 4 表单发布到路由
【发布时间】:2019-03-15 17:40:18
【问题描述】:

我在 Symfony 4 中发布时删除了一个教义对象的表单有问题。我搜索了这个问题,我只发现我可能需要定义一个服务?我是 symfony 的初学者,所以请不要怪我……我正在使用数据表,并且表单是模态的。当我按下模式中的删除按钮时,它会尝试发布到路线但出现错误:

未找到服务“请求”:您的意思是“请求堆栈”吗?无论如何,“App\Controller\ItemManagement”中的容器是一个较小的服务定位器,只知道“doctrine”、“form.factory”、“http_kernel”、“parameter_bag”、“request_stack”、“router”、“security” .csrf.token_manager”、“session”和“twig”服务。尝试使用依赖注入。

<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="deleteit">Delete Item</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">

        Are you sure you want to delete this item?

        <form action="{{ path('delete_item')}}" method="POST" id="theform" >

          <input type="hidden" value="" name="itemtodel" id="itemtodel"/>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="submit" form="theform"  class="btn btn-danger">Delete</button>
      </div>
    </div>
  </div>
</div>

控制器中:

/**
     * @Route("/delitem", name="delete_item", methods={"POST"});
     */
    public function deletetheitem(Request $request)
    {
      if ($request->isMethod('POST')) {

        $itemid = $this->get('request')->request->get('itemtodel');

          ... deleting item code...
        }

      }


      return $this->redirectToRoute("item_management", [], 301);


    }

路由 item_management 在同一个控制器中并且工作正常。我做错了吗?如果你有什么建议我会很感激的,谢谢!!!!

【问题讨论】:

  • 您是否在控制器的use 部分指定了请求类? use Symfony\Component\HttpFoundation\Request;
  • @EugeneRuban 是的,当然,我也在其他 item_management 路线中使用请求。
  • 您需要将行$itemid = $this-&gt;get('request')-&gt;request-&gt;get('itemtodel'); 固定为$itemid = $this-&gt;request-&gt;get('itemtodel');
  • @EugeneRuban 我更改了它,但出现了同样的错误。我正在使用 symfony 4 顺便说一句抱歉我没有提到。
  • 哦,对不起,我的错误。需要改成$itemid = $request-&gt;request-&gt;get('itemtodel');

标签: forms symfony post service symfony4


【解决方案1】:

尝试替换

$this->get('request')->request->get('itemtodel')

通过

$request->request->get('itemtodel')

【讨论】:

    【解决方案2】:

    首先,您不需要定义任何服务,因为在 Symfony 4 中一切都应该开箱即用(如果您没有自定义默认配置)。

    第二,不要在模板中创建静态html表单。改用 Symfony 表单 (https://symfony.com/doc/current/forms.html)。

    第三,如果不应该对查询进行额外检查以删除对象,则不需要使用请求对象。如果你还没有关闭默认 Symfony 4 的参数转换器选项(参见https://symfony.com/doc/current/best_practices/controllers.html#using-the-paramconverter),删除操作可能是这样的:

    /**
     * @Route("/delitem/{item}", name="delete_item", methods={"POST"});
     */
    public function deleteItemAction(Item $item)
    {
        $doctrine = $this->getDoctrine();
        $em       = $doctrine->getManager();
        $em->remove($item);
        $em->flush();
    
        //process your response
    }
    

    【讨论】:

    • 问题是我在创建项目的同一个控制器的主路由中已经有一个 symfony 表单。我还传递了模板中的所有项目,以便我可以向用户显示这些带有数据表的项目。如果我将另一个表单放在同一个函数(路由)中以进行项目删除并在模态中呈现表单,这是一个好习惯吗?我的另一个问题是如果我使用 symfony 表单,我应该使用隐藏类型吗?
    • 您可以渲染和传递任意数量的表单。另外,我更喜欢删除没有表单的项目。只需使用自定义 javascript 确认模式窗口删除链接(GET 请求)。
    • 好的,我明白了。安全呢?是有洞还是什么的?可以不用形式,从而不用token吗?
    • 您可以在顶部的 deleteAction 中进行额外检查(这需要自定义业务逻辑): if(!$this->userCanDelete($item)) {throw new AccessDenyedExcepion($message) }。请参阅 Symfony 文档中的安全部分。
    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2018-10-15
    相关资源
    最近更新 更多