CoreShop Order Purchasable

Items, you want to add to your Cart/Order/Quote, need to implement CoreShop\Component\Order\Model\PurchasableInterface.

The concept of Purchasable allows us to decouple CoreShops Order Component from the Product Component and makes the Cart/Quote/Order more flexible in ways of which object types can be used.

A Purchasable does not a have Price directly You need create a class that implements CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface. in order to calculate price

Implementation of a new Purchasable Price Calculator

To implement a new custom Purchasable Price Calculator, you need to implement the interface CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface.

As an example, we create a ProductSetCalculator, which takes prices of each consisting Product:


namespace AppBundle\CoreShop\Order\Calculator;

use CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface;
use CoreShop\Component\Order\Model\PurchasableInterface;
use Pimcore\Model\Product\ProductSet;

final class ProductSetCalculator implements PurchasablePriceCalculatorInterface
     * @var PurchasablePriceCalculatorInterface
    private $purchasablePriceCalculator;

     * @param PurchasablePriceCalculatorInterface $purchasablePriceCalculator
    public function __construct(PurchasablePriceCalculatorInterface $purchasablePriceCalculator)
        $this->purchasablePriceCalculator = $purchasablePriceCalculator;

    public function getPrice(PurchasableInterface $purchasable)
        if ($purchasable instanceof ProductSet) {
            $price = 0;

            foreach ($purchasable->getProducts() as $product) {
                $price .= $this->purchasablePriceCalculator->getPrice($product);

            return $price;

        return null;


Now we need to register our Service to the Container:

    class: AppBundle\CoreShop\Order\Calculator\ProductSetCalculator
        - '@coreshop.order.purchasable.price_calculator'
     - { name: coreshop.order.purchasable.price_calculator, type: product_set, priority: 20 }