Symfony 5.3.9 RequestStack pour la session

Par barpoi78, il y a 4 ans


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

Soundboy39, il y a 4 ans

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, il y a 4 ans

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.

Soundboy39, il y a 4 ans

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, il y a 4 ans

J'ai édité le code plus haut

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

gillesr, il y a 4 ans

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,