西利乌斯在添加项目后不记得购物车


Sylius Not Remembering Cart After Adding an Item

我正在使用Sylius购物车和订单捆绑包,并尝试将商品添加到购物车并显示购物车中商品的摘要。 我遇到的问题是Symfony/Sylius忘记了它已经制作了一个购物车并向其中添加了物品。

如果我单击指向 sylius 购物车添加页面的链接,则由

{{ path('sylius_cart_item_add', {'productId': class.ClassID}) }}

不会发生任何错误。 如果我查看数据库,我可以看到在sylius_cart表和sylius_cart_item表中创建了一个新条目,其中包含正确的信息;但是,购物车摘要页面不显示任何内容,并认为购物车为空。

如果我尝试添加另一个项目,它会创建另一个新购物车,并立即忘记它制作了购物车。

我在应用程序内核中加载了以下捆绑包.php

public function registerBundles()
{
        $bundles = array(
            //bundles for using the shopping cart
            new FOS'RestBundle'FOSRestBundle(),
            new JMS'SerializerBundle'JMSSerializerBundle($this),
            new Sylius'Bundle'ResourceBundle'SyliusResourceBundle(),
            new WhiteOctober'PagerfantaBundle'WhiteOctoberPagerfantaBundle(),
            new Sylius'Bundle'MoneyBundle'SyliusMoneyBundle(),
            new Sylius'Bundle'OrderBundle'SyliusOrderBundle(),
            new Sylius'Bundle'CartBundle'SyliusCartBundle(),
            new Sylius'Bundle'SequenceBundle'SyliusSequenceBundle(),

            //bundles for styling with bootstrap 3
            new Mopa'Bundle'BootstrapBundle'MopaBootstrapBundle(),
            //mssql connection library
            new Realestate'MssqlBundle'RealestateMssqlBundle(),
            //default frameworks
            new Symfony'Bundle'FrameworkBundle'FrameworkBundle(),
            new Symfony'Bundle'SecurityBundle'SecurityBundle(),
            new Symfony'Bundle'TwigBundle'TwigBundle(),
            new Symfony'Bundle'MonologBundle'MonologBundle(),
            new Symfony'Bundle'SwiftmailerBundle'SwiftmailerBundle(),
            new Symfony'Bundle'AsseticBundle'AsseticBundle(),
            new Doctrine'Bundle'DoctrineBundle'DoctrineBundle(),
            new Sensio'Bundle'FrameworkExtraBundle'SensioFrameworkExtraBundle(),
            new CE'CEBundle'CEBundle(),
        );
        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Symfony'Bundle'WebProfilerBundle'WebProfilerBundle();
            $bundles[] = new Sensio'Bundle'DistributionBundle'SensioDistributionBundle();
            $bundles[] = new Sensio'Bundle'GeneratorBundle'SensioGeneratorBundle();
        }
        return $bundles;
}

我的项目解析程序类看起来像

namespace CE'CEBundle'Cart;
use Sylius'Component'Cart'Model'CartItemInterface;
use Sylius'Component'Cart'Resolver'ItemResolverInterface;
use Sylius'Component'Cart'Resolver'ItemResolvingException;
use Symfony'Component'HttpFoundation'Request;
use Doctrine'ORM'EntityManager;
class ItemResolver implements ItemResolverInterface
{
    private $entityManager;
    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function resolve(CartItemInterface $item, $data)
    {
        //grab the product ID
        $productId = $data->get('productId');

        if (!$productId || !$product = $this->getProductRepository()->find($productId)) {
            throw new ItemResolvingException('Requested product was not found');
        }
        $item->setProductId($product->getId());
        $item->setUnitPrice($product->getClassFee() * 100);
        return $item;
    }
    private function getProductRepository()
    {
        return $this->entityManager->getRepository('CEBundle:Product');
    }
}

我的购物车项类看起来像

namespace CE'CEBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
use Sylius'Component'Cart'Model'CartItem as BaseCartItem;
/**
 * @ORM'Entity
 * @ORM'Table(name="sylius_cart_item")
 */
class CartItem extends BaseCartItem
{
    /**
     * @ORM'Column(type="string", name="product_id", length=8)
     */
    private $productId;
    public function getProductId()
    {
        return $this->productId;
    }
    public function setProductId($Id)
    {
        $this->productId = $Id;
    }
}

我的配置中有以下配置.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
framework:
    #esi:             ~
    #translator:      { fallback: "%locale%" }
    secret:          "%secret%"
    router:
        resource: "%kernel.root_dir%/config/routing.yml"
        strict_requirements: ~
    form: ~
    csrf_protection: ~
    validation:      { enable_annotations: true }
    templating:
        engines: ['twig']
        #assets_version: SomeVersionScheme
    default_locale:  "%locale%"
    trusted_hosts:   ~
    trusted_proxies: ~
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~
        name: SYLIUS_SESSION
        cookie_lifetime: 72000
    fragments:       ~
    http_method_override: true
# Twig Configuration
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
# Assetic Configuration
assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [ ]
    #java: /usr/bin/java
    filters:
        cssrewrite: ~
        #closure:
        #    jar: "%kernel.root_dir%/Resources/java/compiler.jar"
        #yui_css:
        #    jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
# Doctrine Configuration
doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   "%database_driver%"
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name%"
                user:     "%database_user%"
                password: "%database_password%"
                charset:  UTF8
            mssqlDB:
                driver_class:   Realestate'MssqlBundle'Driver'PDODblib'Driver
                host:     %db.other.host%
                dbname:   %db.other.db_name%
                user:     %db.other.user%
                password: %db.other.password%
        # if using pdo_sqlite as your database driver, add the path in parameters.yml
        # e.g. database_path: "%kernel.root_dir%/data/data.db3"
        # path:     "%database_path%"
    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    CEBundle: ~
            mssqlDB:
                connection: mssqlDB
                mappings:
                    CEBundle: ~
        auto_generate_proxy_classes: "%kernel.debug%"
        #auto_mapping: true

# Swiftmailer Configuration
swiftmailer:
    transport: "%mailer_transport%"
    host:      "%mailer_host%"
    username:  "%mailer_user%"
    password:  "%mailer_password%"
    spool:     { type: memory }
#sylius configuration
sylius_cart:
    resolver: ce.cart_item_resolver
    classes: ~
    provider: sylius.cart_provider.default
    storage:  sylius.storage.session
sylius_order:
    driver: doctrine/orm
    classes:
        order_item:
            model: CE'CEBundle'Entity'CartItem
sylius_sequence:
    driver: doctrine/orm
#mopa configuration for forms and bootstrap
mopa_bootstrap:
    form:
        checkbox_label: 'widget'

值得注意的是,如果我查看Chrome开发人员工具中的"资源"选项卡,我可以看到当我将商品添加到购物车时,SYLIUS_SESSION确实设置了。

我尝试将存储更改为cookie而不是会话并倾倒文档,但是我不知道该怎么做才能解决此问题。 我的猜测可能是小东西,我只是不知道它是什么。

提前感谢您的任何帮助。

在您的config.yml文件中,您正在使用sylius.cart_provider.default这意味着您需要在向其添加项目之前获取当前的 Sylius Cart 提供程序。

因此,这意味着在控制器中,您需要像这样检索cart_provider服务:

// gets the current cart
$cart = $this->get('sylius.cart_provider')->getCart();

之后,您可以创建一个$item,就像在调用 ItemResolver::resolve() 方法时所做的那样,并且可以将该项目添加到购物车中。

您可能还需要将购物车ITEM_ADD_INITIALIZECART_CHANGE等的调度程序事件添加到代码中,以使项目实际出现在购物车中。

看看CartItemEvent课。如果您需要帮助,请告诉我。