Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
71c665f
Refactored to use brick/money
Padam87 Feb 21, 2021
6dd8b33
Removed form data_class restriction
Padam87 Feb 21, 2021
4f1d588
Fixed decimal form type
Padam87 Feb 21, 2021
05bdb43
Decimal input sanitazation
Padam87 Feb 21, 2021
12ca297
Fixed money formatter digits check
Padam87 Feb 21, 2021
126984a
Added missing form type tags
Padam87 Feb 21, 2021
453703f
Overridable currency digits for money formatter
Padam87 May 27, 2021
3926888
Removed moneyphp remnants
Padam87 Mar 12, 2022
7bf8513
Fixed symfony 6 deprecation of master request
Padam87 Mar 12, 2022
89ad5ee
Use the proper exception for database exchange rate provider
Padam87 Mar 12, 2022
55a6674
Remove old moneyphp exchange
Padam87 Mar 12, 2022
c1334d5
Refactor embeddables to avoid context issues
Padam87 Mar 12, 2022
edec024
Context and rounding mode to form type
Padam87 Apr 13, 2022
1e19ef8
Allow Symfony 7
Padam87 May 4, 2024
d6e6991
Code improvements
Padam87 May 6, 2024
f28b7b7
Fix exchange rate provider
Padam87 May 6, 2024
d7dd3db
Upgrade brick money
Padam87 May 6, 2024
1470927
Fix documentation
Padam87 May 6, 2024
c16e7e0
Add support for separate mapping
Padam87 May 6, 2024
887198d
Handle null currency in trait
Padam87 May 6, 2024
099a247
Fix currency converter definition
Padam87 May 6, 2024
b6c93af
Update type declarations
Padam87 May 6, 2024
d9347d1
Use number type as basis for decimal
Padam87 Feb 7, 2025
989b1cb
Use configured scale for decimal input
Padam87 Feb 10, 2025
c99316b
Use default currency when not set
Padam87 Mar 31, 2025
e51d775
Improve decimal type formatting
Padam87 Nov 6, 2025
f101697
Allow doctrine bundle v3
Padam87 Dec 4, 2025
36cc31d
Add conflict with doctrine persistance BC break
Padam87 Dec 4, 2025
d3343a6
Update decimal object type for compatibility with doctrine 3
Padam87 Dec 4, 2025
f065ba9
Upgrade to doctrine DBAL 4
Padam87 Dec 4, 2025
ce0d3f6
Fix bad composer version constraint
Padam87 Dec 4, 2025
b72b516
Check if type already has decimal and currency
Padam87 Dec 8, 2025
8f8a77b
Update composer.json
Padam87 Jan 30, 2026
39eef44
Code upgrade PHP 84
Padam87 Jan 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace Padam87\MoneyBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

Expand All @@ -11,7 +10,7 @@ class Configuration implements ConfigurationInterface
/**
* {@inheritdoc}
*/
public function getConfigTreeBuilder()
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('padam87_money');

Expand All @@ -31,6 +30,9 @@ public function getConfigTreeBuilder()
->scalarPrototype()->end()
->defaultValue(['EUR'])
->end()
->arrayNode('currency_digits')
->scalarPrototype()->end()
->end()
->end()
;

Expand Down
61 changes: 12 additions & 49 deletions DependencyInjection/Padam87MoneyExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,26 @@

namespace Padam87\MoneyBundle\DependencyInjection;

use Money\Currencies;
use Money\Currencies\CurrencyList;
use Padam87\MoneyBundle\Doctrine\Type\CurrencyType;
use Padam87\MoneyBundle\Doctrine\Type\MoneyAmountType;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Padam87\MoneyBundle\Doctrine\Mapping\Driver\MoneyEmbeddedDriver;
use Padam87\MoneyBundle\Money\EmbeddedMoney;
use Padam87\MoneyBundle\Money\NullableMoney;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

class Padam87MoneyExtension extends Extension implements PrependExtensionInterface, CompilerPassInterface
class Padam87MoneyExtension extends Extension implements CompilerPassInterface
{
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container)
public function load(array $configs, ContainerBuilder $container): void
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);

$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yaml');

$container->setParameter('padam87_money.config', $config);
Expand All @@ -33,57 +30,23 @@ public function load(array $configs, ContainerBuilder $container)
/**
* {@inheritdoc}
*/
public function prepend(ContainerBuilder $container)
public function process(ContainerBuilder $container): void
{
$container->prependExtensionConfig(
'doctrine',
[
'dbal' => [
'types' => [
'money_amount' => MoneyAmountType::class,
'currency' => CurrencyType::class,
]
],
]
);
}

/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
$config = $container->getParameter('padam87_money.config');

$driver = $container->getDefinition('doctrine.orm.default_metadata_driver');

$driver->addMethodCall(
'addDriver',
[
$container->getDefinition('Padam87\MoneyBundle\Doctrine\Mapping\Driver\MoneyEmbeddedDriver'),
'Money\Money'
$container->getDefinition(MoneyEmbeddedDriver::class),
EmbeddedMoney::class
]
);

$driver->addMethodCall(
'addDriver',
[
$container->getDefinition('Padam87\MoneyBundle\Doctrine\Mapping\Driver\CurrencyPairEmbeddedDriver'),
'Money\CurrencyPair'
$container->getDefinition(MoneyEmbeddedDriver::class),
NullableMoney::class
]
);

$container->setDefinition(
CurrencyList::class,
new Definition(
CurrencyList::class,
[
array_fill_keys($config['currencies'], $config['scale'])
]
)
);

$container->setAlias(Currencies::class, CurrencyList::class);
}
}

59 changes: 0 additions & 59 deletions Doctrine/Mapping/Driver/CurrencyPairEmbeddedDriver.php

This file was deleted.

21 changes: 11 additions & 10 deletions Doctrine/Mapping/Driver/MoneyEmbeddedDriver.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,19 @@

use Doctrine\Persistence\Mapping\ClassMetadata;
use Doctrine\Persistence\Mapping\Driver\MappingDriver;
use Money\Money;
use Padam87\MoneyBundle\Money\EmbeddedMoney;
use Padam87\MoneyBundle\Money\NullableMoney;

class MoneyEmbeddedDriver implements MappingDriver
{
private $config;

public function __construct(array $config)
public function __construct(private array $config)
{
$this->config = $config;
}

/**
* {@inheritdoc}
*/
public function loadMetadataForClass($className, ClassMetadata $metadata)
public function loadMetadataForClass($className, ClassMetadata $metadata): void
{
/* @var \Doctrine\ORM\Mapping\ClassMetadataInfo $metadata */

Expand All @@ -27,34 +25,37 @@ public function loadMetadataForClass($className, ClassMetadata $metadata)
$metadata->mapField(
[
'fieldName' => 'amount',
'type' => 'money_amount',
'type' => 'decimal_object',
'precision' => $this->config['precision'],
'scale' => $this->config['scale'],
'nullable' => $className === NullableMoney::class,
]
);

$metadata->mapField(
[
'fieldName' => 'currency',
'type' => 'currency',
'nullable' => $className === NullableMoney::class,
]
);
}

/**
* {@inheritdoc}
*/
public function getAllClassNames()
public function getAllClassNames(): array
{
return [
Money::class
EmbeddedMoney::class,
NullableMoney::class,
];
}

/**
* {@inheritdoc}
*/
public function isTransient($className)
public function isTransient($className): bool
{
return false;
}
Expand Down
34 changes: 23 additions & 11 deletions Doctrine/Type/CurrencyType.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,71 @@

namespace Padam87\MoneyBundle\Doctrine\Type;

use Brick\Money\Currency;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
use Money\Currency;

class CurrencyType extends Type
{
/**
* {@inheritdoc}
*/
public function getName()
public function getName(): string
{
return 'currency';
}

/**
* {@inheritdoc}
*/
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
$fieldDeclaration['length'] = 3;
$column['length'] = $this->getDefaultLength($platform); // enforce column length even if specified

return $platform->getVarcharTypeDeclarationSQL($fieldDeclaration);
return $platform->getStringTypeDeclarationSQL($column);
}

/**
* {@inheritdoc}
*/
public function requiresSQLCommentHint(AbstractPlatform $platform)
public function getDefaultLength(AbstractPlatform $platform): int
{
return 3;
}

/**
* {@inheritdoc}
*/
public function requiresSQLCommentHint(AbstractPlatform $platform): bool
{
return true;
}

/**
* {@inheritdoc}
*/
public function convertToPHPValue($value, AbstractPlatform $platform)
public function convertToPHPValue($value, AbstractPlatform $platform): ?Currency
{
if (null === $value) {
return null;
}

return new Currency($value);
return Currency::of($value);
}

/**
* {@inheritdoc}
*/
public function convertToDatabaseValue($value, AbstractPlatform $platform)
public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string
{
if ($value === null) {
return null;
}

if (!$value instanceof Currency) {
throw new \LogicException();
throw new \LogicException(sprintf('Only instances of "%s" can be persisted as currency', Currency::class));
}

return $value->getCode();
return (string) $value->getCurrencyCode();
}
}
Loading