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

时间:2018-02-24 15:57:59

标签: symfony

我想创建一个数组作为会话表,将它放在我的购物车商店的开始处,以便不显示任何空购物车,当我按下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));

}

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

1 个答案:

答案 0 :(得分: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);
  }
...
}