Plugin for Sylius to configure bundles for products that can be sold together



Sylius Product Bundles Plugin

License Packagist Build Status Scrutinizer Code Quality


  1. Run composer create-project sylius/plugin-skeleton ProjectName.

  2. From the plugin skeleton root directory, run the following commands:

    $ (cd tests/Application && yarn install)
    $ (cd tests/Application && yarn run gulp)
    $ (cd tests/Application && bin/console assets:install web -e test)
    $ (cd tests/Application && bin/console doctrine:database:create -e test)
    $ (cd tests/Application && bin/console doctrine:schema:create -e test)



ProductBundles are a independent resource and have a OneToOne-relationship with a Product that represents the bundle throughout the sylius-framework, e.g. for calculating prices and taxes in the checkout. The content of a ProductBundle is organized in ProductBundleSlots. One ProductBundle can have 1 to n ProductBundleSlots.


ProductBundleSlots represent a group of products that can be switched through by the customer. E.g. in a Bundle for football-Teams there could be a Slot 'Shirts', in which different kinds of shirts can be referenced. Only one item of each ProductBundleSlot is part of the finally bought bundle.



This is a service to create ProductBundles programmatically. It will only create Objects necessary for the ProductBundle. It won't create products for you. But if you have the products that should be part of the bundle you want to create, they can be associated with the created bundle and the slots inside the bundle.

get the service

$bundleCreator = $container->get('solutiondrive.product_bundles.product_bundle_creator');

create your bundle

$slotOptionsFactory = new solutionDrive\SyliusProductBundlesPlugin\Factory\ProductBundleSlotOptionsFactory();

$hatSlotOptions = $slotOptionsFactory->createNewWithValues(1, 'TopHats');

$shirtSlotOptions = $slotOptionsFactory->createNewWithValues(2, 'Shirts', ['someAdditionalOption' => 'AndItsValue']);

$bundleCreator->createProductBundle('YourAwesomeBundle', $prductRepresentationOfTheBundle);
$bundleCreator->addSlot('YourAwsomeHats', $hatSlotOptions, $hatsToAssignToSlot);
$bundleCreator->addSlot('YourAwsomeShirts', $shirtSlotOptions, $shirtsToAssignToSlot);

$productBundle = $bundleCreator->getProductBundle();


Sometimes you'll need to set up your environment quickly and add some default bundles. You can take a look at tests/Application/app/config/fixtures.yml file to see how you can configure fixtures.

Running plugin tests

  • PHPUnit

    $ bin/phpunit
  • PHPSpec

    $ bin/phpspec run
  • Behat (non-JS scenarios)

    $ bin/behat --tags="~@javascript"
  • Behat (JS scenarios)

    1. Download Chromedriver

    2. Run Selenium server with previously downloaded Chromedriver:

      $ bin/selenium-server-standalone
    3. Run test application's webserver on localhost:8080:

      $ (cd tests/Application && bin/console server:run -d web -e test)
    4. Run Behat:

      $ bin/behat --tags="@javascript"

Opening Sylius with your plugin

  • Using test environment:

    $ (cd tests/Application && bin/console sylius:fixtures:load -e test)
    $ (cd tests/Application && bin/console server:run -d web -e test)
  • Using dev environment:

    $ (cd tests/Application && bin/console sylius:fixtures:load -e dev)
    $ (cd tests/Application && bin/console server:run -d web -e dev)