无法通过 Shopware 6 中的 XmlHttpRequest 请求 PageController

Posted

技术标签:

【中文标题】无法通过 Shopware 6 中的 XmlHttpRequest 请求 PageController【英文标题】:PageController can't be requested via XmlHttpRequest in Shopware 6 【发布时间】:2020-10-14 20:28:46 【问题描述】:

我正在尝试在最新的 Shopware 6.2.2 上向我的自定义 StorefrontController 发送请求,但我收到以下错误:

PageController can't be requested via XmlHttpRequest.

我正在做一个来自自定义 JS 插件的常规 httpClient 请求:


export default class MyCustomPlugin extends Plugin 

  static options = 
      dataUrl: '', // comes from the twig as "path('frontend.path.to.route')"
      product: null,
      params: ,
      loadingIndicatorClass: 'is-loading',
      responseSelector: 'some-selector-class'

  

  init () 
      // this.el.innerhtml = LoadingIndicator.getTemplate()
      this.httpClient = new HttpClient()
      const query = querystring.stringify(this.options.product)
      this.sendDataRequest(query)
  

  /**
   * Add classes to add loading styling.
   * Prevents the user from clicking filter labels during filter request.
   */
  addLoadingIndicatorClass () 
      this.el.classList.add(this.options.loadingIndicatorClass)
  

  /**
   * Remove loading styling classes.
   */
  removeLoadingIndicatorClass () 
      this.el.classList.remove(this.options.loadingIndicatorClass)
  

  /**
   * Send request to get filtered product data.
   *
   * @param String filterParams - active filters as querystring
   */
  sendDataRequest (filterParams) 

      this.addLoadingIndicatorClass()

      this.httpClient.abort()
      this.httpClient.get(`$this.options.dataUrl?$filterParams`, (response) => 
          this.renderResponse(response)
          this.removeLoadingIndicatorClass()
      )
  

  /**
   * Inject the HTML of the response to the element.
   *
   * @param String response - HTML response
   */
  renderResponse (response) 
      ElementReplaceHelper.replaceFromMarkup(response, this.options.responseSelector, false)
      window.PluginManager.initializePlugins()
  

这是我的StorefrontController 路线:

    /**
     * @Route("/path/to_route", name="frontend.path.to.route", methods="GET")
     */
    public function someAction(Request $request, Context $context): JsonResponse

谁能告诉我为什么请求没有进行?我想在 Shopware 6 中向我自己的控制器发送一个简单的 AJAX 请求。

谢谢!

【问题讨论】:

【参考方案1】:

尝试添加:

defaults="XmlHttpRequest"=true 到您的路线。

所以在更改之后您将拥有:

/**
* @Route("/path/to_route", name="frontend.path.to.route", methods="GET", defaults="XmlHttpRequest"=true)
*/

还要确保使用 @RouteScope 注释在控制器中正确定义范围。由于您的代码是店面 javascript 插件,因此应定义 storefront 范围。

【讨论】:

以上是关于无法通过 Shopware 6 中的 XmlHttpRequest 请求 PageController的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义订单状态添加到 shopware 6

Shopware 6 - 插件配置中的字段验证不起作用

无法在 Shopware 6 中按多个标签过滤产品

Shopware 6 : 如何使用 Shopware\Core\Content\Category\Event 中的 `CategoryIndexerEvent`

如何在 Shopware 6 中为订单添加自定义字段?

Shopware 6:如何通过 SalesChannel 级别的 EventSubscriberInterface 检测任何类别添加/更新?