You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 06:34:52