Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Sylius在添加项目后不记得购物车_Php_Session_Cart_Sylius - Fatal编程技术网

Php Sylius在添加项目后不记得购物车

Php Sylius在添加项目后不记得购物车,php,session,cart,sylius,Php,Session,Cart,Sylius,我正在使用Sylius购物车和订单捆绑包,试图向购物车添加一个项目,并显示购物车中项目的摘要。我遇到的问题是Symfony/Sylius忘记了它制作了一个购物车并向其中添加了物品 如果我单击指向sylius购物车添加页面的链接,由 {{ path('sylius_cart_item_add', {'productId': class.ClassID}) }} 没有错误发生。如果我查看数据库,我可以看到在sylius_cart表和sylius_cart_item表中创建了一个具有正确信息的新条目

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

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

{{ path('sylius_cart_item_add', {'productId': class.ClassID}) }}
没有错误发生。如果我查看数据库,我可以看到在sylius_cart表和sylius_cart_item表中创建了一个具有正确信息的新条目;但是,购物车摘要页面没有显示任何内容,并且认为购物车是空的

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

我在AppKernel.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;
}
我的ItemResolver类看起来像

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;
    }
}
我的CartItem类看起来像

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;
    }
}
我的config.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开发者工具中的Resources选项卡,我可以看到SYLIUS_会话确实在我向购物车添加项目时设置好了

我曾尝试将存储更改为cookie,而不是会话和文件,但我不知道如何解决这个问题。我猜它可能是个小东西,我只是不知道它是什么


感谢您事先提供的帮助。

在您的
config.yml
文件中,您使用的是
sylius.cart\u provider.default
,这意味着您需要先获取当前sylius cart provider,然后再向其添加项目

这意味着您需要在控制器中检索
cart\u提供者
服务,如下所示:

// gets the current cart
$cart = $this->get('sylius.cart_provider')->getCart();
之后,您可以创建一个
$item
,就像您在调用
itemsolver::resolve()方法时所做的那样,并且可以将该项添加到购物车中

您可能还需要将购物车
项目\u添加\u初始化
购物车更改
等的调度程序事件添加到您的代码中,以使项目实际显示在购物车中


请查看该类的
CartItemEvent
类。如果您需要帮助,请告诉我。

我想这已经发生了。这些路由调用CartController或CartItemController。在执行任何操作之前,它们都会调用$cart=$this->getCurrentCart(),这在Controll.php中定义为$this->getProvider()->getCart();getProvider定义为return$this->container->get('sylius.cart_provider');在这种情况下,您是否也使用CartItemType的表单,以便在请求中将其变量提交到路径sylius\u cart\u item\u add,即CartItemController?在ItemResolver处理期间,如果您提交的数据在ItemResolver中的$form->submit($data)变量(通过请求对象提供)中没有任何数据(原始类不是您的类),则不会将该项目添加到购物车中。此外,您需要在CartItemEvent中调度适当的事件,以便cart查看添加的项目。很抱歉响应延迟。我正在使用默认的CartItemController。创建一个链接来添加一个项目,如这里的示例所示,这样我只需将要添加到操作的项目的ID传递给操作。添加操作的代码可以在这里找到,它在将项目添加到购物车并为购物车和购物车项目(显示在数据库中)创建数据库条目后重定向到摘要页面。我不确定在此设置中应该更改什么,因为它主要使用默认的控制器和类。我只是扩展了ItemResolver和BaseCartItem,为我自己的产品信息添加了详细信息,如中所述,如果我在这里遗漏了一些简单的内容,请原谅。我还尝试使用表单提交,如本文示例中的细枝模板所示,我在中得到了相同的结果,但它重定向到的摘要页面上仍然没有购物车信息。