Skip to content

Commit 41c5b4f

Browse files
committed
[DX] Wire CatalogPricesCalculatorInterface to all catalog-facing services
Register sylius.calculator.product_variant_catalog_price (same implementation as sylius.calculator.product_variant_price, independently decoratable) and wire it to all catalog display consumers: - sylius.twig.extension.price (Twig price filters) - sylius_api.normalizer.product_variant (API serialization) - sylius_shop.twig.component.product.price (shop price component) - sylius_shop.twig.component.product.card (shop product card) - sylius.provider.product_variant_map.price (JS variant switching) - sylius.provider.product_variant_map.original_price - sylius.provider.product_variant_map.lowest_price Cart/order consumers (OrderPricesRecalculator, PriceRangeFilter) intentionally remain on sylius.calculator.product_variant_price. # Conflicts: # src/Sylius/Bundle/ApiBundle/Resources/config/services/serializers.xml # src/Sylius/Bundle/CoreBundle/Resources/config/services.xml # src/Sylius/Bundle/CoreBundle/Resources/config/services/product_variant_map.xml # src/Sylius/Bundle/CoreBundle/Resources/config/services/templating.xml # src/Sylius/Bundle/ShopBundle/Resources/config/services/twig/component/product.xml
1 parent 5379ccd commit 41c5b4f

17 files changed

Lines changed: 141 additions & 30 deletions

File tree

UPGRADE-2.3.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,36 @@
5656

5757
2. The `knplabs/gaufrette` and `knplabs/knp-gaufrette-bundle` packages have been removed.
5858

59+
## Deprecations
60+
61+
1. Passing a `Sylius\Component\Core\Calculator\ProductVariantPricesCalculatorInterface` directly to the following catalog-facing classes is deprecated since Sylius 2.3.
62+
Implement `Sylius\Component\Core\Calculator\CatalogPricesCalculatorInterface` instead, which extends `ProductVariantPricesCalculatorInterface` with no additional methods.
63+
It will be required in Sylius 3.0.
64+
65+
Affected classes:
66+
- `Sylius\Bundle\CoreBundle\Twig\PriceExtension`
67+
- `Sylius\Bundle\ApiBundle\Serializer\Normalizer\ProductVariantNormalizer`
68+
- `Sylius\Bundle\ShopBundle\Twig\Component\Product\PriceComponent`
69+
- `Sylius\Bundle\ShopBundle\Twig\Component\Product\CardComponent`
70+
- `Sylius\Component\Core\Provider\ProductVariantMap\ProductVariantPriceMapProvider`
71+
- `Sylius\Component\Core\Provider\ProductVariantMap\ProductVariantOriginalPriceMapProvider`
72+
- `Sylius\Component\Core\Provider\ProductVariantMap\ProductVariantLowestPriceMapProvider`
73+
74+
If you have a custom calculator used for catalog display, make it implement `CatalogPricesCalculatorInterface`:
75+
76+
```php
77+
use Sylius\Component\Core\Calculator\CatalogPricesCalculatorInterface;
78+
79+
final class MyCustomCatalogPriceCalculator implements CatalogPricesCalculatorInterface
80+
{
81+
// ...
82+
}
83+
```
84+
85+
This allows you to decorate catalog display pricing independently from cart/order pricing
86+
(`sylius.order_processing.order_prices_recalculator`, `sylius.filter.promotion.price_range`),
87+
which remain on `ProductVariantPricesCalculatorInterface`.
88+
5989
The Gaufrette integration has been unusable as a filesystem adapter.
6090
Since Sylius 2.0 the default filesystem adapter uses Flysystem instead.
6191

src/Sylius/Bundle/ApiBundle/Resources/config/services/serializers.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
$services
128128
->set('sylius_api.normalizer.product_variant', ProductVariantNormalizer::class)
129129
->args([
130-
service('sylius.calculator.product_variant_price'),
130+
service('sylius.calculator.product_variant_catalog_price'),
131131
service('sylius.checker.inventory.availability'),
132132
service('sylius.section_resolver.uri_based'),
133133
service('api_platform.symfony.iri_converter'),

src/Sylius/Bundle/ApiBundle/Serializer/Normalizer/ProductVariantNormalizer.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Sylius\Bundle\ApiBundle\Serializer\ContextKeys;
2020
use Sylius\Bundle\ApiBundle\Serializer\SerializationGroupsSupportTrait;
2121
use Sylius\Bundle\CoreBundle\SectionResolver\SectionProviderInterface;
22+
use Sylius\Component\Core\Calculator\CatalogPricesCalculatorInterface;
2223
use Sylius\Component\Core\Calculator\ProductVariantPricesCalculatorInterface;
2324
use Sylius\Component\Core\Exception\MissingChannelConfigurationException;
2425
use Sylius\Component\Core\Model\CatalogPromotionInterface;
@@ -38,12 +39,21 @@ final class ProductVariantNormalizer implements NormalizerInterface, NormalizerA
3839
private const ALREADY_CALLED = 'sylius_product_variant_normalizer_already_called';
3940

4041
public function __construct(
41-
private readonly ProductVariantPricesCalculatorInterface $priceCalculator,
42+
private readonly ProductVariantPricesCalculatorInterface|CatalogPricesCalculatorInterface $priceCalculator,
4243
private readonly AvailabilityCheckerInterface $availabilityChecker,
4344
private readonly SectionProviderInterface $uriBasedSectionContext,
4445
private readonly IriConverterInterface $iriConverter,
4546
private readonly array $serializationGroups,
4647
) {
48+
if (!$this->priceCalculator instanceof CatalogPricesCalculatorInterface) {
49+
trigger_deprecation(
50+
'sylius/sylius',
51+
'2.3',
52+
'Passing an instance of "%s" as $priceCalculator is deprecated. It will require "%s" since Sylius 3.0.',
53+
ProductVariantPricesCalculatorInterface::class,
54+
CatalogPricesCalculatorInterface::class,
55+
);
56+
}
4757
}
4858

4959
/**

src/Sylius/Bundle/ApiBundle/tests/Serializer/Normalizer/ProductVariantNormalizerTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
use Sylius\Bundle\ApiBundle\Serializer\ContextKeys;
2424
use Sylius\Bundle\ApiBundle\Serializer\Normalizer\ProductVariantNormalizer;
2525
use Sylius\Bundle\CoreBundle\SectionResolver\SectionProviderInterface;
26-
use Sylius\Component\Core\Calculator\ProductVariantPricesCalculatorInterface;
26+
use Sylius\Component\Core\Calculator\CatalogPricesCalculatorInterface;
2727
use Sylius\Component\Core\Exception\MissingChannelConfigurationException;
2828
use Sylius\Component\Core\Model\CatalogPromotionInterface;
2929
use Sylius\Component\Core\Model\ChannelInterface;
@@ -34,7 +34,7 @@
3434

3535
final class ProductVariantNormalizerTest extends TestCase
3636
{
37-
private MockObject&ProductVariantPricesCalculatorInterface $pricesCalculator;
37+
private MockObject&CatalogPricesCalculatorInterface $pricesCalculator;
3838

3939
private AvailabilityCheckerInterface&MockObject $availabilityChecker;
4040

@@ -57,7 +57,7 @@ final class ProductVariantNormalizerTest extends TestCase
5757
protected function setUp(): void
5858
{
5959
parent::setUp();
60-
$this->pricesCalculator = $this->createMock(ProductVariantPricesCalculatorInterface::class);
60+
$this->pricesCalculator = $this->createMock(CatalogPricesCalculatorInterface::class);
6161
$this->availabilityChecker = $this->createMock(AvailabilityCheckerInterface::class);
6262
$this->sectionProvider = $this->createMock(SectionProviderInterface::class);
6363
$this->iriConverter = $this->createMock(IriConverterInterface::class);

src/Sylius/Bundle/CoreBundle/Resources/config/services.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
use Sylius\Bundle\CoreBundle\ShippingMethod\Updater\ShippingMethodUpdater;
3939
use Sylius\Bundle\CoreBundle\Twig\CheckoutStepsExtension;
4040
use Sylius\Bundle\CoreBundle\Twig\ProductVariantsMapExtension;
41+
use Sylius\Component\Core\Calculator\CatalogPricesCalculatorInterface;
4142
use Sylius\Component\Core\Calculator\ProductVariantPriceCalculator;
4243
use Sylius\Component\Core\Calculator\ProductVariantPricesCalculatorInterface;
4344
use Sylius\Component\Core\Cart\Modifier\LimitingOrderItemQuantityModifier;
@@ -308,6 +309,12 @@
308309
;
309310
$services->alias(ProductVariantPricesCalculatorInterface::class, 'sylius.calculator.product_variant_price');
310311

312+
$services
313+
->set('sylius.calculator.product_variant_catalog_price', ProductVariantPriceCalculator::class)
314+
->args([service('sylius.checker.product_variant_lowest_price_display')])
315+
;
316+
$services->alias(CatalogPricesCalculatorInterface::class, 'sylius.calculator.product_variant_catalog_price');
317+
311318
$services
312319
->set('sylius.section_resolver.uri_based', UriBasedSectionProvider::class)
313320
->args([

src/Sylius/Bundle/CoreBundle/Resources/config/services/product_variant_map.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737

3838
$services
3939
->set('sylius.provider.product_variant_map.price', ProductVariantPriceMapProvider::class)
40-
->args([service('sylius.calculator.product_variant_price')])
40+
->args([service('sylius.calculator.product_variant_catalog_price')])
4141
->tag('sylius.product_variant_data_map_provider')
4242
;
4343

4444
$services
4545
->set('sylius.provider.product_variant_map.original_price', ProductVariantOriginalPriceMapProvider::class)
46-
->args([service('sylius.calculator.product_variant_price')])
46+
->args([service('sylius.calculator.product_variant_catalog_price')])
4747
->tag('sylius.product_variant_data_map_provider')
4848
;
4949

@@ -54,7 +54,7 @@
5454

5555
$services
5656
->set('sylius.provider.product_variant_map.lowest_price', ProductVariantLowestPriceMapProvider::class)
57-
->args([service('sylius.calculator.product_variant_price')])
57+
->args([service('sylius.calculator.product_variant_catalog_price')])
5858
->tag('sylius.product_variant_data_map_provider')
5959
;
6060
};

src/Sylius/Bundle/CoreBundle/Resources/config/services/templating.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
$services
3333
->set('sylius.twig.extension.price', PriceExtension::class)
34-
->args([service('sylius.calculator.product_variant_price')])
34+
->args([service('sylius.calculator.product_variant_catalog_price')])
3535
->private()
3636
->tag('twig.extension')
3737
;

src/Sylius/Bundle/CoreBundle/Twig/PriceExtension.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Sylius\Bundle\CoreBundle\Twig;
1515

16+
use Sylius\Component\Core\Calculator\CatalogPricesCalculatorInterface;
1617
use Sylius\Component\Core\Calculator\ProductVariantPricesCalculatorInterface;
1718
use Sylius\Component\Core\Model\ProductVariantInterface;
1819
use Twig\Extension\AbstractExtension;
@@ -21,8 +22,18 @@
2122

2223
final class PriceExtension extends AbstractExtension
2324
{
24-
public function __construct(private readonly ProductVariantPricesCalculatorInterface $productVariantPricesCalculator)
25-
{
25+
public function __construct(
26+
private readonly ProductVariantPricesCalculatorInterface|CatalogPricesCalculatorInterface $productVariantPricesCalculator,
27+
) {
28+
if (!$this->productVariantPricesCalculator instanceof CatalogPricesCalculatorInterface) {
29+
trigger_deprecation(
30+
'sylius/sylius',
31+
'2.3',
32+
'Passing an instance of "%s" as $productVariantPricesCalculator is deprecated. It will require "%s" since Sylius 3.0.',
33+
ProductVariantPricesCalculatorInterface::class,
34+
CatalogPricesCalculatorInterface::class,
35+
);
36+
}
2637
}
2738

2839
public function getFilters(): array

src/Sylius/Bundle/ShopBundle/Resources/config/services/twig/component/product.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
service('sylius.resolver.product_variant'),
6161
service('sylius.context.channel'),
6262
service('sylius.context.locale'),
63-
service('sylius.calculator.product_variant_price'),
63+
service('sylius.calculator.product_variant_catalog_price'),
6464
])
6565
->tag('sylius.twig_component', ['key' => 'sylius_shop:product:card'])
6666
;
@@ -78,7 +78,7 @@
7878
$services
7979
->set('sylius_shop.twig.component.product.price', PriceComponent::class)
8080
->args([
81-
service('sylius.calculator.product_variant_price'),
81+
service('sylius.calculator.product_variant_catalog_price'),
8282
service('sylius.formatter.money'),
8383
service('sylius.context.channel'),
8484
service('sylius.context.locale'),

src/Sylius/Bundle/ShopBundle/Twig/Component/Product/CardComponent.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use Doctrine\Common\Collections\Collection;
1717
use Sylius\Component\Channel\Context\ChannelContextInterface;
18+
use Sylius\Component\Core\Calculator\CatalogPricesCalculatorInterface;
1819
use Sylius\Component\Core\Calculator\ProductVariantPricesCalculatorInterface;
1920
use Sylius\Component\Core\Model\ChannelInterface;
2021
use Sylius\Component\Core\Model\ChannelPricingInterface;
@@ -48,8 +49,17 @@ public function __construct(
4849
protected readonly ProductVariantResolverInterface $productVariantResolver,
4950
protected readonly ChannelContextInterface $channelContext,
5051
protected readonly LocaleContextInterface $localeContext,
51-
protected readonly ProductVariantPricesCalculatorInterface $productVariantPricesCalculator,
52+
protected readonly ProductVariantPricesCalculatorInterface|CatalogPricesCalculatorInterface $productVariantPricesCalculator,
5253
) {
54+
if (!$this->productVariantPricesCalculator instanceof CatalogPricesCalculatorInterface) {
55+
trigger_deprecation(
56+
'sylius/sylius',
57+
'2.3',
58+
'Passing an instance of "%s" as $productVariantPricesCalculator is deprecated. It will require "%s" since Sylius 3.0.',
59+
ProductVariantPricesCalculatorInterface::class,
60+
CatalogPricesCalculatorInterface::class,
61+
);
62+
}
5363
}
5464

5565
#[PostMount]

0 commit comments

Comments
 (0)