【问题标题】:Symfony + Doctrine: Strange parameters injection in the action methodSymfony + Doctrine:动作方法中的奇怪参数注入
【发布时间】:2018-04-27 07:43:36
【问题描述】:

我在我的项目中使用 Symfony 和 Doctrine。我注意到一件奇怪的(对我来说)事情。

我的控制器中有简单的操作:

    /**
     * @param Request      $request
     * @param Product|null $product
     *
     * @Config\Route("/{category}/create", name="my_project_create_product")
     * @Config\Route("/{category}/edit/{product}", name="my_project_edit_product")
     * @Config\Template()
     *
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function createEditAction(Request $request, ProductCategory $category, Product $product = null)

product 参数是可选的,仅用于编辑操作,正如您在我的注释中看到的那样。

问题是,当我使用 url /{category}/create 时,它​​会以某种方式注入产品对象(它是我的集合中具有给定类别的第一个产品)。但是,product 参数应为 null

问题是如果我不将product参数传递给url,它是如何自己注入的?

P.S 产品有分类参考。只有当我在方法中使用类别参数时才会发生这种情况。

Symfony 3.3.4 版

感谢您的帮助!

【问题讨论】:

    标签: php symfony doctrine


    【解决方案1】:

    经过一番调查和调试,我确实找到了解决该问题的方法。

    我真的不知道 ParamConverter “将尝试通过使用路由中的所有通配符来进行 findOneBy() 获取,这些通配符实际上是实体上的属性(非属性被忽略)”。 (source link)。因此,如果它没有按 id(主键)找到它,它将尝试按条件搜索。有一些方法可以解决这个问题(所有选项都可以找到here)。但是,我选择从产品映射中排除该类别:

     /**
     * @param Request      $request
     * @param Product|null $product
     *
     * @Config\Route("/{category}/create", name="my_project_create_product")
     * @Config\Route("/{category}/edit/{product}", name="my_project_edit_product")
     * @Config\ParamConverter("product", options={"exclude": {"category"}})
     * @Config\Template()
     *
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function createEditAction(Request $request, ProductCategory $category, Product $product = null)
    

    实际上,这行“@Config\ParamConverter("product", options={"exclude": {"category"}})" 解决了整个问题。

    希望,这将有助于某人并节省一些时间。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多