如何扩展 Shopware 6 控制器操作

Posted

技术标签:

【中文标题】如何扩展 Shopware 6 控制器操作【英文标题】:How to extend Shopware 6 controller action 【发布时间】:2020-11-25 10:36:02 【问题描述】:

我正在为 Shopware 6 构建一个插件,但似乎找不到任何关于如何扩展现有控制器操作的文档。我找到了这个How to add an Action to Account Controller in Shopware,但它似乎指的是 Shopware 5,我不确定我是否可以在 Shopware 6 中以这种方式使用它。

我要扩展的控制器操作是\Shopware\Storefront\Controller\AddressController::saveAddress - 在我的情况下,我想添加自定义地址验证,该验证将在我的插件中使用一个服务,如果地址正确,则会向第 3 方 API 发出请求允许地址,如果没有则返回错误。也许最好改为扩展\Shopware\Core\Checkout\Customer\SalesChannel\AddressService::save,但我现在不知道(我一般是 Shopware 的新手)。扩展服务意味着我不必重写整个操作逻辑,以便它在中间包含我的检查。或者也许有一个事件我可以用来保存地址(同样的,找不到适合 Shopware6 的事件源/列表)。

这里似乎有指南: 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)中注册覆盖以及扩展类的外观。如果问的不是太多,理想的答案将包含以下示例:

    如何为现有控制器扩展操作。 如何扩展现有服务。 在哪里可以找到控制器/服务中触发的事件,订阅它并使其覆盖默认行为(如 throw Shopware\Core\Framework\Validation\Exception\ConstraintViolationException)。

【问题讨论】:

【参考方案1】:

    扩展/覆盖操作没有意义,因为操作应尽可能精简,并且所有业务逻辑都应处于服务状态。

    要扩展现有服务,您可以对其进行装饰或订阅一些事件以扩展功能。见https://docs.shopware.com/en/shopware-platform-dev-en/how-to/decorating-a-service

    在您的情况下,您可以订阅 framework.validation.address.create 或/和 framework.validation.address.update 事件以扩展约束列表。一般来说,所有验证事件都有前缀framework.validation. 第二部分在\Shopware\Core\Framework\Validation\DataValidationFactoryInterface 实现中定义,在你的情况下是\Shopware\Core\Checkout\Customer\Validation\AddressValidationFactory

【讨论】:

3 号。看起来很有希望。我订阅了Shopware\Core\Checkout\Customer\CustomerEvents::MAPPING_ADDRESS_CREATE,它允许我使用Shopware\Core\Framework\Event\DataMappingEvent 来访问输入的地址数据 - 你知道如何让它写回验证结果(如果它没有验证,那么抑制地址创建并返回错误消息返回Shopware\Core\Checkout\Customer\SalesChannel::upsert) ? 您需要订阅 framework.validation.address.create 事件。在那里你可以扩展 $event->getDefinition() 对象。您可以在此处添加您自己的验证规则。然后一切都会自动运行。检查\Shopware\Core\Checkout\Customer\Validation\AddressValidationFactory::buildCommonValidation 以获得更好的理解。 非常感谢您的帮助,现在似乎可以正常工作了。对于其他人:我创建了一个新的验证器,并通过订阅者中的add 方法将其添加到Shopware\Core\Framework\Validation\DataValidationDefinition。然后我在同一个目录中创建了一个验证器(相同的类名,但最后带有验证器 - 正在自动找到并使用)。该验证检查街道号码是否为 TRUE - 这意味着它总是失败,但我仅在第 3 方地址验证失败时附加它。有点hacky,但它有效。

以上是关于如何扩展 Shopware 6 控制器操作的主要内容,如果未能解决你的问题,请参考以下文章

什么是 var/plugins.json,它应该进入版本控制(Shopware 6.3.5.2)吗?

Shopware 5 在前端访问控制器变量(模板变量)

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

注册后 Shopware 订户中的帐单地址

Shopware 6:如何删除所有演示数据

如何在 Shopware 6 中获取公用文件夹绝对路径?