Search code examples
phpsymfonyshopwareshopware6

Shopware 6 - AuthControllerDecorator is deprecated


I am currently developing a Shopware plugin to showcase the login page from the register page. The implementation is functioning correctly.

However, I have encountered an issue where Shopware indicates that the Auth Controller has been made internal and is no longer accessible. I am seeking an alternative class that can be utilized for this purpose.

Could you suggest an alternative class that can be used in place of the Auth Controller?

<?php declare(strict_types=1);
...

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

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

        parent::__construct(
            $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"})
     */
    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,
        ]);
    }
}

Solution

  • Storefront controllers should not be decorated. If you want to add data to the page's template listen for AccountLoginPageLoadedEvent and add extensions to the page.

    If you want to implement custom logic, e.g. on the actual login procedure, you should decorate the corresponding store-api route Shopware\Core\Checkout\Customer\SalesChannel\LoginRoute instead, which is intended to be decorated.