/money-bundle

Symfony bundle providing integration for Money library.

Primary LanguagePHPOtherNOASSERTION

GitHub Release Travis Total Downloads SensioLabs Insight Software License

JKMoneyBundle

This bundle provides integration for Money library in your Symfony project. Features include:

  • Automatically add Doctrine mappings (use Doctrine embeddable objects)
  • Customized FormType
  • Twig extension

Installation

Step 1: Download the Bundle

Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle:

$ composer require kucharovic/money-bundle

This command requires you to have Composer installed globally, as explained in the installation chapter of the Composer documentation.

Step 2: Enable the Bundle

Then, enable the bundle by adding it to the list of registered bundles in the app/AppKernel.php file of your project:

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
            // ...

            new JK\MoneyBundle\JKMoneyBundle(),
        ];

        // ...
    }

    // ...
}

Step 3: Configuration

By default, bundle load your application locale and define it's currency code as default. You can override it:

# app/config/config.yml

jk_money:
    currency: USD

Usage

Entity

// src/AppBundle/Entity/Proudct.php

use Doctrine\ORM\Mapping as ORM;
use Money\Money;

// ...
class Product
{
    // ...

    /**
     * @var Money
     *
     * @ORM\Embedded(class="Money\Money")
     */
    private $price;

    // ...

    public function __construct()
    {
        $this->price = Money::CZK(0);
    }

    public function setPrice(Money $price): void
    {
        $this->price = $price;
    }

    public function getPrice(): Money
    {
        return $this->price;
    }

This entity mapping produces following table structure:

+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
| id                  | int(11)      | NO   | PRI | NULL    | auto_increment |
| name                | varchar(255) | NO   |     | NULL    |                |
| price_amount        | varchar(255) | NO   |     | NULL    |                |
| price_currency_code | char(3)      | NO   |     | NULL    |                |
+---------------------+--------------+------+-----+---------+----------------+

So it's easy to query database using aggregate functions like SUM, AVG, etc:

SELECT MAX(`price_amount`), `price_currency_code`
FROM `product`
GROUP BY `price_currency_code`;

Form

Option Type Default
currency string your application locale currency
grouping boolean false
scale integer 2
// src/AppBundle/Entity/Proudct.php

// ...
use JK\MoneyBundle\Form\Type\MoneyType;

class ProductType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('price', MoneyType::class)
        ;
    }

Twig templates

<!-- 1 599,90 Kč -->
Formated with czech locale {{ product.price|money }}<br>
<!-- 1599,9 -->
You can also specify scale, grouping and hide currency symbol {{ product.price|money(1, false, false) }