Shipping calculation library based on Symfony 2 components.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.

Shipping Calculator

Build Status Test Coverage Code Climate Latest Stable Version Total Downloads License

Shipping calculation library based on Symfony 2 components.


Add in your composer.json the require entry for this library.

    "require": {
        "shiptor/shipping-calculator": "*"

and run composer install (or update) to download all files.


How to create a calculator?

Example code below will create the calculator for a single shipment method.

$config = include __DIR__.'/../src/Resources/DHL/ExportExpressWorldWide/tariff_2015_08_25_usa.php';
$calculator = new BaseCalculator([
    'handler' => DhlHandler::create($config)

What is what:

  • DhlCalculatorHandler contains calculation algorithm for the Dhl Express Shipping Method;
  • $config contains configuration for the DhlHandler;
  • BaseCalculator is a wrapper for a calculation handlers, it contains an algorithm "How to use calculation handlers" and returns a calculation result;

How to calculate a package shipping?

Example code below will create a package and calculate shipping cost for Dhl Express.

// previous example code here

$weight = new Weight();

$dimensions = new Dimensions();

$senderAddress = new Address();

$recipientAddress = new Address();

$package = new Package();

$result = $calculator->calculate($package);

What is what:

  • Weight contains information about physical weight;
  • Dimensions contains information about package box dimensions. It is required to calculate a volumetric weight of your package;
  • $senderAddress and $recipientAddress contains information about sender and recipient;
  • Package is a wrapper object to all objects above. You will need to pass this object to calculate method of your calculator;
  • $result contains your package and resulting calculation data;

How to extend a calculator?

Shipping calculator uses symfony event dispatcher and you can use it to extend calculation algorithms as you need. For example, you can increase shipping cost by 10$.

// place calculator creation code here

$calculator->getDispatcher()->addListener(Events::AFTER_CALCULATE, function (AfterCalculateEvent $event) {
    $event->getResult()->setShippingCost($event->getResult()->getShippingCost() + 10);

What is what:

  • Events::AFTER_CALCULATE is an event calling when calculation ends and calculation result is ready;
  • AfterCalculateEvent is an event object which contains calculation result and package. Look to other available events here;

More ideas how to use and extend shipping calculator

  • create calculation handlers for other couriers and shipping methods;
  • create calculators and realize your own algorithms using handlers;