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

Shopware 6实现登录/注册后按客户Extension自动跳转的方法

问题

我已经重写了AuthController的loginPage方法,该方法会检查客户是否存在Extension「X」,若存在则跳转至指定页面,但这个逻辑仅在客户已登录并直接访问account/login地址时生效。

我需要实现两个需求:

  • 客户完成登录提交后触发该跳转判断
  • 客户提交注册表单后,同样根据$customer->hasExtension('X')执行跳转

我已尝试调整loginPage(GET)、login(POST)、accountRegisterPage(GET)和register(POST)方法,但未达到预期效果。现有loginPage方法代码如下:

public function loginPage(Request $request, RequestDataBag $data, SalesChannelContext $context): Response
{
    /** @var string $redirect */
    $redirect = $request->get('redirectTo', 'frontend.home.page');

    $customer = $context->getCustomer();

    if ($customer !== null && $customer->getGuest() === false) {
        if ($customer->hasExtension('X')) {
            $request->request->set('redirectTo', 'frontend.account.x');
        }
        return $this->createActionResponse($request);
    }

    $page = $this->loginPageLoader->load($request, $context);

    $this->hook(new AccountLoginPageLoadedHook($page, $context));

    return $this->renderStorefront('@Storefront/storefront/page/account/register/index.html.twig', [
        'redirectTo' => $redirect,
        'redirectParameters' => $request->get('redirectParameters', json_encode([])),
        'page' => $page,
        'loginError' => (bool)$request->get('loginError'),
        'waitTime' => $request->get('waitTime'),
        'errorSnippet' => $request->get('errorSnippet'),
        'data' => $data,
    ]);
}
解决方案

一、在AuthController的login(POST)方法中实现登录后跳转

重写AuthController的login方法,在登录成功后获取当前客户,判断Extension并修改跳转目标:

public function login(Request $request, RequestDataBag $data, SalesChannelContext $context): Response
{
    // 保留原有登录验证、认证逻辑
    $response = parent::login($request, $data, $context);

    $customer = $context->getCustomer();
    if ($customer !== null && !$customer->getGuest()) {
        if ($customer->hasExtension('X')) {
            $request->request->set('redirectTo', 'frontend.account.x');
            return $this->createActionResponse($request);
        }
    }

    return $response;
}

二、在RegisterController的register(POST)方法中实现注册后跳转

重写RegisterController的register方法,注册完成后执行相同的Extension判断逻辑:

public function register(Request $request, RequestDataBag $data, SalesChannelContext $context): Response
{
    // 执行原注册流程
    $response = parent::register($request, $data, $context);

    $customer = $context->getCustomer();
    if ($customer !== null && !$customer->getGuest()) {
        if ($customer->hasExtension('X')) {
            $request->request->set('redirectTo', 'frontend.account.x');
            return $this->createActionResponse($request);
        }
    }

    return $response;
}

三、提取公共方法优化代码

为避免重复代码,可将Extension判断与跳转逻辑封装为私有方法,在两个控制器中复用:

/**
 * 检查客户Extension并设置跳转地址
 */
private function handleCustomerExtensionRedirect(Request $request, SalesChannelContext $context): ?Response
{
    $customer = $context->getCustomer();
    if ($customer !== null && !$customer->getGuest() && $customer->hasExtension('X')) {
        $request->request->set('redirectTo', 'frontend.account.x');
        return $this->createActionResponse($request);
    }
    return null;
}

之后在login和register方法中调用该方法即可:

// AuthController的login方法内
$redirectResponse = $this->handleCustomerExtensionRedirect($request, $context);
if ($redirectResponse) {
    return $redirectResponse;
}

// RegisterController的register方法内同理
$redirectResponse = $this->handleCustomerExtensionRedirect($request, $context);
if ($redirectResponse) {
    return $redirectResponse;
}

注意事项

  • 确保重写控制器时正确继承Shopware原生的AuthController和RegisterController
  • 若原方法存在特定跳转逻辑(如基于redirectTo参数的跳转),需保证修改不会冲突原有业务需求
  • 测试时需覆盖客户有/无Extension「X」的场景,验证跳转逻辑正确性

内容的提问来源于stack exchange,提问作者Jacky Raimond

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:35:40