Shopware 6服务中如何获取当前登录客户/访客数据及关联实体?
在Shopware 6服务中获取当前登录客户数据
注入正确的服务类
要获取当前登录客户,需注入Shopware\Core\System\Customer\SalesChannel\CurrentCustomer服务,它专门用于在销售渠道上下文(如前台请求、API请求)中获取当前登录的客户实体。
修正后的示例代码
PHP服务类
class FreeShopping { private \Shopware\Core\System\Customer\SalesChannel\CurrentCustomer $currentCustomer; public function __construct(\Shopware\Core\System\Customer\SalesChannel\CurrentCustomer $currentCustomer) { $this->currentCustomer = $currentCustomer; } public function eligibleForFreeShopping(): bool { // 未登录时getCustomer()返回null,需先判断 $customer = $this->currentCustomer->getCustomer(); if ($customer !== null && $customer->getFirstName() === 'Hermann') { return true; } return false; } }
XML服务配置
<service id="FreeShopping"> <argument type="service" id="Shopware\Core\System\Customer\SalesChannel\CurrentCustomer"/> </service>
注意:该服务依赖销售渠道上下文,在后台CLI任务等无用户登录的场景中,
getCustomer()会返回null。
自定义编号范围并关联客户/订单实体
若要创建独立编号范围,且生成编号时需访问客户或订单实体,可通过以下两种方式实现:
方式1:自定义编号生成器
实现Shopware\Core\Framework\NumberRange\ValueGenerator\NumberRangeValueGeneratorInterface接口,在生成逻辑中直接获取关联实体:
use Shopware\Core\Framework\Context; use Shopware\Core\Framework\NumberRange\ValueGenerator\NumberRangeValueGeneratorInterface; use Shopware\Core\Framework\Uuid\Uuid; class CustomOrderNumberGenerator implements NumberRangeValueGeneratorInterface { public function generate( string $numberRangeTypeId, string $numberRangeId, Context $context, array $options = [] ): string { // 从options中获取传入的订单或客户实体 $order = $options['order'] ?? null; $customer = $options['customer'] ?? null; // 自定义编号逻辑,例如添加客户姓名前缀 $prefix = $customer ? strtoupper(substr($customer->getFirstName(), 0, 2)) : 'GUEST'; // 替换为实际的序列编号获取逻辑(可调用Shopware内置的序列服务) $sequenceNumber = Uuid::randomHex(); return sprintf('%s-%s', $prefix, $sequenceNumber); } }
注册生成器服务:
<service id="CustomOrderNumberGenerator" implements="Shopware\Core\Framework\NumberRange\ValueGenerator\NumberRangeValueGeneratorInterface"/>
方式2:监听编号生成事件
通过订阅Shopware\Core\Framework\NumberRange\Event\NumberRangeGenerateEvent事件,在编号生成时修改结果:
use Shopware\Core\Framework\NumberRange\Event\NumberRangeGenerateEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class NumberRangeGenerateSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ NumberRangeGenerateEvent::class => 'onNumberRangeGenerate', ]; } public function onNumberRangeGenerate(NumberRangeGenerateEvent $event): void { // 从上下文扩展中获取关联实体(需在触发生成时提前传入) $entity = $event->getContext()->getExtension('entity') ?? null; if ($entity instanceof \Shopware\Core\Checkout\Order\OrderEntity) { $customer = $entity->getCustomer(); if ($customer) { $originalNumber = $event->getGeneratedValue(); $event->setGeneratedValue(sprintf('%s-%s', strtoupper(substr($customer->getFirstName(), 0, 2)), $originalNumber)); } } } }
注册事件订阅者:
<service id="NumberRangeGenerateSubscriber"> <tag name="kernel.event_subscriber"/> </service>
注意:触发编号生成时,需将关联实体传入上下文扩展,例如创建订单时:
$context->addExtension('entity', $order); $this->numberRangeService->generate(...);
内容的提问来源于stack exchange,提问作者IamArobot
相关产品推荐
相关产品推荐

