Bonjour,

C'est fou ce que les mises à jour vont bon train et déjà à la 5.3.9 alors je sèche avec RequestStack pour la session j'essaie de cette façon:

return $this->session->getSession()->set('checkout_data', $data);

Quand je fais:

dd($data); 

j'ai bien mon panier au complet mais cela me renvoi l'erreur:

Return value of App\Controller\CheckoutController::confirm() must be an instance of Symfony\Component\HttpFoundation\Response, null returned

Je ne peux pas rediriger autre part que vers ma page checkout

Je vous remercie de votre aide

Voici mon CheckoutController:

<?php

namespace App\Controller;

use App\Form\CheckoutType;
use App\Services\CartServices;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class CheckoutController extends AbstractController
{
    private $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
        $this->session = $requestStack;
    }

    /**
     * @Route("/checkout", name="checkout")
     */
    public function index(CartServices $cartServices): Response
    {
        $user = $this->getUser();
        $cart = $cartServices->getFullCart();

        if(!isset($cart['products'])){
            return $this->redirectToRoute('home');
        }

        if(!$user->getAddresses()->getValues()){
            $this->addFlash('checkout_message','Veuillez ajouter une adresse de livraison dans votre compte avant de continuer');
            return $this->redirectToRoute('address_new');
        }

        $form = $this->createForm(CheckoutType::class,null,['user'=>$user]);

        return $this->render('checkout/index.html.twig',[
            'cart' => $cart, 
            'checkout' => $form->createView()
        ]);
    }

    /**
     * @Route("/checkout/confirm", name="checkout_confirm")
     */
    public function confirm(CartServices $cartServices, Request $request):Response{
        $user = $this->getUser();
        $cart = $cartServices->getFullCart();

        if(!isset($cart['products'])){
            return $this->redirectToRoute('home');
        }

        if(!$user->getAddresses()->getValues()){
            $this->addFlash('checkout_message','Veuillez ajouter une adresse de livraison dans votre compte avant de continuer');
            return $this->redirectToRoute('address_new');
        }

        $form = $this->createForm(CheckoutType::class,null,['user'=>$user]);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid() || $this->session->get('checkout_data')){

            if($this->session->getSession('checkout_data')){
                $data = $this->session->getSession('checkout_data');
            }else{
                $data = $form->getData();
                $this->session->set('checkout_data', $data);
            }
            return $this->session->getSession()->set('checkout_data', $data);
            // dd($data);

            if($this->session->get('checkout_data')){
                $data = $this->session->getSession('checkout_data');
            }else{
                $data = $form->getData();
                $this->session->set('checkout_data', $data);
            }

            // $data = $form->getData();
            $address = $data['address'];
            $carrier = $data['carrier'];
            $informations = $data['informations'];
            // dd($data);

            return $this->render('checkout/confirm.html.twig',[
                'cart' => $cart, 
                'address' => $address, 
                'carrier' => $carrier, 
                'informations' => $informations, 
                'checkout' => $form->createView()
            ]);
        }
        return $this->redirectToRoute('checkout');
    }
}

5 réponses


Hello,

J'ai eu à peu près le même problème que toi... j'ai pu le régler en utilisant la class RedirectResponse.

barpoi78
Auteur

Pour revoyer vers une url oui mais là je dois vérifier mes données et je ne sais pas comment faire car je débute et j'ai acheté une formation sur symfony 5.3.1 et il y a des différences que j'ai pu résoudre avec les sessions pour l'authentification etc. mais là je ne sais pas.

OK, est-ce qur tu peux poster plus de code stp ?

Au moins le corp de la méthode executée par la route...

barpoi78
Auteur

J'ai édité le code plus haut

Le poblème est là: return $this->session->getSession()->set('checkout_data', $data);

Bonsoir,
qques problèmes dans ton code :

  • dans ton constructeur, tu assignes $requestStack à $this->session mais tu n’as pas de private $session,
  • tu assignes $requestStack à $this->requestStack et à $this->session, quel intérêt ?
  • tu fais des $this->session->set(...), mais c’est un objet RequestStack,