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

Shopware 6 AuthController已内部化,寻求替代类方案

解决方案:替换内部AuthController的实现方式

由于Shopware将AuthController标记为内部类,禁止直接继承或装饰,你可以通过自定义控制器覆盖原路由的方式实现相同功能,具体步骤如下:

1. 创建自定义控制器(无需继承内部类)

直接编写独立的控制器,注入所需的公开服务,保留原有业务逻辑:

<?php declare(strict_types=1);

namespace YourPluginNamespace\Controller;

use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Controller\StorefrontController;
use Shopware\Storefront\Page\Account\Login\AccountLoginPageLoader;
use Shopware\Storefront\Page\Account\RecoverPassword\AccountRecoverPasswordPageLoader;
use Shopware\Storefront\Page\Account\Route\AbstractLoginRoute;
use Shopware\Storefront\Page\Account\Route\AbstractLogoutRoute;
use Shopware\Storefront\Page\Account\Route\AbstractResetPasswordRoute;
use Shopware\Storefront\Page\Account\Route\AbstractSendPasswordRecoveryMailRoute;
use Shopware\Storefront\Service\StorefrontCartFacade;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RequestDataBag;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextServiceInterface;

/**
 * @RouteScope(scopes={"storefront"})
 */
class CustomAuthController extends StorefrontController
{
    private AccountLoginPageLoader $loginPageLoader;
    private AbstractSendPasswordRecoveryMailRoute $sendPasswordRecoveryMailRoute;
    private AbstractResetPasswordRoute $resetPasswordRoute;
    private AbstractLoginRoute $loginRoute;
    private AbstractLogoutRoute $logoutRoute;
    private StorefrontCartFacade $cartFacade;
    private AccountRecoverPasswordPageLoader $recoverPasswordPageLoader;
    private SalesChannelContextServiceInterface $salesChannelContextService;

    public function __construct(
        AccountLoginPageLoader $loginPageLoader,
        AbstractSendPasswordRecoveryMailRoute $sendPasswordRecoveryMailRoute,
        AbstractResetPasswordRoute $resetPasswordRoute,
        AbstractLoginRoute $loginRoute,
        AbstractLogoutRoute $logoutRoute,
        StorefrontCartFacade $cartFacade,
        AccountRecoverPasswordPageLoader $recoverPasswordPageLoader,
        SalesChannelContextServiceInterface $salesChannelContextService
    ) {
        $this->loginPageLoader = $loginPageLoader;
        $this->sendPasswordRecoveryMailRoute = $sendPasswordRecoveryMailRoute;
        $this->resetPasswordRoute = $resetPasswordRoute;
        $this->loginRoute = $loginRoute;
        $this->logoutRoute = $logoutRoute;
        $this->cartFacade = $cartFacade;
        $this->recoverPasswordPageLoader = $recoverPasswordPageLoader;
        $this->salesChannelContextService = $salesChannelContextService;
    }

    /**
     * @Route("/account/login", name="frontend.account.login.page", methods={"GET"}, priority=200)
     */
    public function loginPage(Request $request, RequestDataBag $data, SalesChannelContext $context): Response
    {
        /** @var string $redirect */
        $redirect = $request->get('redirectTo', 'frontend.account.home.page');

        $customer = $context->getCustomer();

        if ($customer !== null && $customer->getGuest() === false) {
            $request->request->set('redirectTo', $redirect);

            return $this->createActionResponse($request);
        }

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

        return $this->renderStorefront('@Storefront/storefront/page/account/login/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,
        ]);
    }
}

2. 关键修改说明

  • 继承Shopware公开的StorefrontController,而非内部的AuthController
  • 路由注解添加priority=200:确保自定义控制器优先于原生路由被匹配(原生路由默认优先级为100)
  • 移除对内部AuthController的依赖,直接注入所有所需的公开服务,完全保留原有业务逻辑

3. 备选思路:事件拦截

如果不需要完全重写控制器方法,也可以通过监听KernelEvents::REQUEST事件,在原生控制器执行前后修改跳转逻辑,但重写路由的方式更适配你现有的代码结构。

内容的提问来源于stack exchange,提问作者Leon Schwanitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:29:51