问:[Symfony 4]如何使用控制器中的会话访问表单数据?

时间:2018-08-20 10:00:16

标签: symfony cart

我正在使用symfony4构建购物车应用程序。

为了存储购买数据,我必须使用会话创建购物车。

我创建了一个存储所选项目的表单。但是我不知道如何从我的控制器中获得该物品。

首先,我在我的树枝视图中选择元素:

{% extends 'base.html.twig' %}

{% block body %}
    <form action="{{ path('add_cart', {'id': product.id}) }}" method="get">
        <div class="card" style="width: 18rem;">
            <img class="card-img-top" src="https://via.placeholder.com/350x150" alt="Card image cap">
            <div class="card-body">
                <h5 class="card-title">{{ product.name }}</h5>
                <p class="card-text">{{ product.description | raw}}</p>
                <p class="card-text">{{ product.price }} euros.</p>
                <select name="quantity_product" class="span1">
                {% for i in 1..10 %}
                    <option value= "{{ i }}">{{ i }} </option>
                {% endfor %}
                </select>
                <a href="{{path('add_cart')}}" class="btn btn-primary" name="validate_product_button">Ajouter au panier</a>
            </div>
        </div>
    </form>    
{% endblock %}

然后,这是我的CartController:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;


class CartController extends AbstractController
{

    /**
     * @Route("/cart", name="cart")
     */
    public function index()
    {

        $productId = $_POST['id_product'];

        return $this->render('cart/index.html.twig', [
            'id_product' =>$productId
        ]);

    }
    /**
     * @Route("/addCart", name="add_cart")
     */

     public function addProductToCart(Request $request)
     {

        $session = new Session(new NativeSessionStorage(), new AttributeBag());

        $session->set('cart', array());

        $cart = $session->get('cart');

        return $this->render('cart/index.html.twig');
     }

}

我的问题很简单:我应该如何使用session元素才能从先前的表单中获取元素(id_product,quantity_product)?

我在使用symfony 2或3时看到了几个答案。但是到目前为止,在symfony 4中已经做出了许多更改,我根本不知道如何使用它。

谢谢您的回复。

1 个答案:

答案 0 :(得分:0)

很抱歉,您的代码不符合框架标准。

首先,您必须使用Symfony表单组件,而不要手动编写=> https://symfony.com/doc/current/forms.html

接下来,禁止在Symfony中使用$ _POST之类的全局变量。

当代码正确时,您可以将ID产品(如url的参数)传递给addProductToCart方法。 检查文档:https://symfony.com/doc/current/routing.html

对于初学者:请在开始项目之前阅读文档,这对您来说更好!!