从 symfony 中的不同控制器访问会话变量

问题描述 投票:0回答:1

我想创建一个数组作为会话表,以便在开始时将其清空,以便我的购物车商店不显示任何内容作为空购物车,当我按 AddtoCart 时,我想获取该数组并对新项目执行 array_push,但我没有不知道该怎么做

这是我创建空数组时的第一个控制器

public function FrontAction()

{
    $pro=new Produit();
    $pro->setNom('');
    $pro->setQuantite(0);
    $pro->setPrix(0);


    $em = $this->getDoctrine()->getManager();
    $sess=new Session();

    $sess->setName('PANIER');
    $sess=array('');
    array_push($sess,$pro->getNom(),$pro->getQuantite(),$pro->getPrix());


    $paniers = $em->getRepository(Panier::class)->findByUserId(1);
    $produits = $this->getDoctrine()->getRepository(Produit::class)->findAll();
    $boutiques = $this->getDoctrine()->getRepository(Boutique::class)->GetBestShopsDQL();
    if ($paniers != null)
    {

        $prixTotal = 0;
        foreach ($paniers as $panier) {
            $prixTotal += $panier->getPrixTotal();
        }
        $resultCount = count($paniers);


        return $this->render('BoutiqueBundle:FrontViews:ListBoutique.html.twig', array('produits' => $produits, 'boutiques' => $boutiques,'paniers' => $paniers, 'prixTotal' => $prixTotal,'resultCount' => $resultCount));

    }
    return $this->render('BoutiqueBundle:FrontViews:ListBoutique.html.twig', array('produits' => $produits, 'boutiques' => $boutiques,'sess'=>$sess));

}

这是第二个控制器,我想用新项目填充该空数组

                           public function ajouterauPanierAction($id)
{
    $ses=new Session();
    $ses->getName('PANIER');
    $test=array('');
    $test=$ses;

   // $user_id = $this->getUser()->getId(); //à modifier!!!!!
    $em = $this->getDoctrine()->getManager();
    $produit = $em->getRepository(Produit::class)->find($id);
    $test = $em->getRepository(Panier::class)->findExistant($id, 1);
   // $session->replace(array_push($produit,));
    if(($produit != null)&&(empty($test)))
    {
        array_push($test,$produit->getNom(),$produit->getQuantite(),$produit->getPrix());

       /* $panier = new Panier();
        $panier->setProduitId($produit->getId());
        $panier->setUserId(1); //à changer avec le fos
        $panier->setDate(new \DateTime("now"));
        $panier->setPrixTotal($produit->getPrix());
        $em->persist($panier);
       */ $em->flush();
        $msg = "success";
    //    return $this->redirectToRoute('Dashboard');
    }
    else
        {
        //return $this->render('BoutiqueBundle:FrontViews:404.html.twig');
            $msg = "failure";
       }
       return new JsonResponse(array('msg' => $msg));

}

我不知道如何正确地做到这一点,或者我的想法是否错误,所以希望你们能明白我需要做的事情

php symfony
1个回答
0
投票

这是我在 Symfony 4 中的做法,(我认为这部分没有改变)。首先,我将会话密钥声明为实体上的类常量以避免冲突。

class Appointment
{
  const SESSION_KEY = 'confirmed_app_entity_appointment';
  ...
}

然后在控制器中使用 SessionInterface,它将通过类型提示参数

(SessionInterface $session)
自动连接到您的控制器方法中。 Symfony 将处理启动会话,只需根据需要设置、获取和/或删除密钥。

use Symfony\Component\HttpFoundation\Session\SessionInterface;
...
public function confirmAppointment($first_name, $last_name, $time, SessionInterface $session)
{
  ...
  $session->set(Appointment::SESSION_KEY, $appointment);
  $session->set(StaffMember::SESSION_KEY_SELECTED_STAFF, $member);
  ...
  if ($this->isConflict($appointment)) {
    $session->remove(Appointment::SESSION_KEY);
    $session->remove(StaffMember::SESSION_KEY_AUTH);
    $this->addFlash('error', 'Failed to create Appointment, conflict found');
    return $this->redirectToRoute('customer');
  }
  ...
}

public function saveAppointment(SessionInterface $session)
{
  if (!empty($session->get(Appointment::SESSION_KEY))) {
    $appointment = $session->get(Appointment::SESSION_KEY);
  }
...
}
© www.soinside.com 2019 - 2024. All rights reserved.