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
相关产品推荐
相关产品推荐

