如何扩展 Shopware 6 控制器操作
How to extend Shopware 6 controller action
我正在为 Shopware 6 构建一个插件,但似乎找不到任何关于如何扩展现有控制器操作的文档。我找到了这个 ,但它似乎指的是 Shopware 5,我不确定我是否可以在 Shopware 6 中那样使用它。
我想扩展的控制器操作是 \Shopware\Storefront\Controller\AddressController::saveAddress
- 在我的例子中,我想添加自定义地址验证,它将使用我的插件中的服务,其中对第 3 方 API 的请求是made,如果地址正确则允许地址,如果不正确则return 错误。也许最好改为扩展 \Shopware\Core\Checkout\Customer\SalesChannel\AddressService::save
但我现在不知道(我是 Shopware 的新手)。扩展服务意味着我不必覆盖整个操作逻辑,以便它在中间包含我的检查。或者也许有一个事件我可以用来保存地址(同样的事情,找不到 Shopware6 的好的 source/list 事件)。
这里好像有攻略:
https://docs.shopware.com/en/shopware-platform-dev-en/developer-guide/controller
和这里:
https://docs.shopware.com/en/shopware-platform-dev-en/how-to/custom-storefront-controller
但是这些只描述了如何制作一个新的控制器,它对我来说不是很有用,因为我不想添加任何新路由,而是使用现有的路由 /account/address/create
.
如果能提供一个代码示例,说明如何在插件中注册覆盖(配置,xml)以及扩展 class 的样子,我将不胜感激。如果问的不是太多,理想的答案将包含一个示例:
- 如何为现有控制器扩展操作。
- 如何扩展现有服务。
- 在哪里可以找到 controller/service 中正在触发的事件,订阅它并使其覆盖默认行为(如抛出
Shopware\Core\Framework\Validation\Exception\ConstraintViolationException
)。
对 extend/override 操作没有意义,因为操作应尽可能精简,并且所有业务逻辑都应在服务中。
要扩展现有服务,您可以装饰它或订阅一些事件来扩展功能。参见 https://docs.shopware.com/en/shopware-platform-dev-en/how-to/decorating-a-service
在您的情况下,您可以订阅 framework.validation.address.create
or/and framework.validation.address.update
事件以扩展约束列表。一般来说,所有验证事件都有前缀 framework.validation.
第二部分在 \Shopware\Core\Framework\Validation\DataValidationFactoryInterface
实现中定义,在您的情况下它是 \Shopware\Core\Checkout\Customer\Validation\AddressValidationFactory
我正在为 Shopware 6 构建一个插件,但似乎找不到任何关于如何扩展现有控制器操作的文档。我找到了这个
我想扩展的控制器操作是 \Shopware\Storefront\Controller\AddressController::saveAddress
- 在我的例子中,我想添加自定义地址验证,它将使用我的插件中的服务,其中对第 3 方 API 的请求是made,如果地址正确则允许地址,如果不正确则return 错误。也许最好改为扩展 \Shopware\Core\Checkout\Customer\SalesChannel\AddressService::save
但我现在不知道(我是 Shopware 的新手)。扩展服务意味着我不必覆盖整个操作逻辑,以便它在中间包含我的检查。或者也许有一个事件我可以用来保存地址(同样的事情,找不到 Shopware6 的好的 source/list 事件)。
这里好像有攻略:
https://docs.shopware.com/en/shopware-platform-dev-en/developer-guide/controller
和这里:
https://docs.shopware.com/en/shopware-platform-dev-en/how-to/custom-storefront-controller
但是这些只描述了如何制作一个新的控制器,它对我来说不是很有用,因为我不想添加任何新路由,而是使用现有的路由 /account/address/create
.
如果能提供一个代码示例,说明如何在插件中注册覆盖(配置,xml)以及扩展 class 的样子,我将不胜感激。如果问的不是太多,理想的答案将包含一个示例:
- 如何为现有控制器扩展操作。
- 如何扩展现有服务。
- 在哪里可以找到 controller/service 中正在触发的事件,订阅它并使其覆盖默认行为(如抛出
Shopware\Core\Framework\Validation\Exception\ConstraintViolationException
)。
对 extend/override 操作没有意义,因为操作应尽可能精简,并且所有业务逻辑都应在服务中。
要扩展现有服务,您可以装饰它或订阅一些事件来扩展功能。参见 https://docs.shopware.com/en/shopware-platform-dev-en/how-to/decorating-a-service
在您的情况下,您可以订阅
framework.validation.address.create
or/andframework.validation.address.update
事件以扩展约束列表。一般来说,所有验证事件都有前缀framework.validation.
第二部分在\Shopware\Core\Framework\Validation\DataValidationFactoryInterface
实现中定义,在您的情况下它是\Shopware\Core\Checkout\Customer\Validation\AddressValidationFactory