2

在 Shopware 6 中,我想/admin使用 JavaScript 从后端/管理页面调用后端 () API 控制器。使用相对路径的正确方法是什么,可能带有内置的 getter 函数?

/api/v1当商店在时才有效/,但在子文件夹中时无效。

fetch('/api/v1/my-plugin/my-custom-action', ...)
4

2 回答 2

2

最佳实践是编写您自己的 JS 服务来处理与您的 api 端点的通信。

我们有一个抽象ApiService类,您可以从中继承。您可以查看平台CalculatePriceApiService中的示例。对您而言,实现可能如下所示:

class MyPluginApiService extends ApiService {
    constructor(httpClient, loginService, apiEndpoint = 'my-plugin') {
        super(httpClient, loginService, apiEndpoint);
        this.name = 'myPluginService';
    }

    myCustomAction() {
        return this.httpClient
            .get('my-custom-action', {
                headers: this.getBasicHeaders()
            })
            .then((response) => {
                return ApiService.handleResponse(response);
            });
    }
}

请注意,在构造函数的第一行中,您的 api 服务已预先配置为与您的my-plugin端点对话,这意味着在您发出的所有以下请求中,您都可以使用相对路由路径。

还要记住,抽象 ApiService 将负责解析用于请求的配置。特别是这意味着 ApiService 将使用正确的 BaseDomain 包括子文件夹,并且它将自动使用您的商店软件版本支持的 apiVersion。这意味着每次有新的 api 版本可用时,ApiService 在路由中使用的 apiVersion 都会增加,这意味着您需要在 api 版本的后端路由注释中使用通配符。

最后请记住,您需要注册该服务。这是记录在这里。对你来说,这可能看起来像这样:

Shopware.Application.addServiceProvider('myPluginService', container => {
    const initContainer = Shopware.Application.getContainer('init');
    return new MyPluginApiService(initContainer.httpClient, Shopware.Service('loginService'));
});
于 2020-08-03T06:17:36.607 回答
1

如果您正在谈论您实现的自定义操作,您需要定义路由(使用注释)并在 Resources\config\routes.xml 的 routes.xml 中注册控制器。

请遵循该文档 https://docs.shopware.com/en/shopware-platform-dev-en/how-to/api-controller

于 2020-08-02T13:58:32.373 回答