Skip to content

Commit 905aca7

Browse files
committed
Use the Request to store resources
1 parent 1332f06 commit 905aca7

File tree

14 files changed

+65
-129
lines changed

14 files changed

+65
-129
lines changed

src/Bridge/Doctrine/EventListener/PurgeHttpCacheListener.php

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

1414
use ApiPlatform\Core\Api\IriConverterInterface;
1515
use ApiPlatform\Core\Exception\InvalidArgumentException;
16-
use ApiPlatform\Core\HttpCache\ResourceManagerInterface;
1716
use Doctrine\ORM\Event\OnFlushEventArgs;
1817
use Psr\Container\ContainerInterface;
1918

@@ -22,7 +21,7 @@
2221
*
2322
* @author Kévin Dunglas <[email protected]>
2423
*
25-
* @internal
24+
* @experimental
2625
*/
2726
final class PurgeHttpCacheListener
2827
{
@@ -38,34 +37,44 @@ public function __construct($container)
3837

3938
public function onFlush(OnFlushEventArgs $eventArgs)
4039
{
40+
if (!$request = $this->container->get('request_stack')->getCurrentRequest()) {
41+
return;
42+
}
43+
44+
$resources = $request->attributes->get('resources', []);
4145
$iriConverter = $this->container->get('api_platform.iri_converter');
42-
$resourceManager = $this->container->get('api_platform.http_cache.resource_manager');
4346
$uow = $eventArgs->getEntityManager()->getUnitOfWork();
4447

4548
foreach ($uow->getScheduledEntityInsertions() as $entity) {
46-
$this->purge($iriConverter, $resourceManager, $entity, false);
49+
$resources = $this->purge($iriConverter, $resources, $entity, false);
4750
}
4851

4952
foreach ($uow->getScheduledEntityUpdates() as $entity) {
50-
$this->purge($iriConverter, $resourceManager, $entity, true);
53+
$resources = $this->purge($iriConverter, $resources, $entity, true);
5154
}
5255

5356
foreach ($uow->getScheduledEntityDeletions() as $entity) {
54-
$this->purge($iriConverter, $resourceManager, $entity, true);
57+
$resources = $this->purge($iriConverter, $resources, $entity, true);
5558
}
59+
60+
$request->attributes->set('resources', $resources);
5661
}
5762

58-
private function purge(IriConverterInterface $iriConverter, ResourceManagerInterface $resourceManager, $entity, bool $purgeItem)
63+
private function purge(IriConverterInterface $iriConverter, array $resources, $entity, bool $purgeItem): array
5964
{
6065
try {
6166
$resourceClass = $this->container->get('api_platform.resource_class_resolver')->getResourceClass($entity);
6267
} catch (InvalidArgumentException $e) {
63-
return;
68+
return $resources;
6469
}
6570

66-
$resourceManager->addResource($iriConverter->getIriFromResourceClass($resourceClass));
71+
$iri = $iriConverter->getIriFromResourceClass($resourceClass);
72+
$resources[$iri] = $iri;
6773
if ($purgeItem) {
68-
$resourceManager->addResource($iriConverter->getIriFromItem($entity));
74+
$iri = $iriConverter->getIriFromItem($entity);
75+
$resources[$iri] = $iri;
6976
}
77+
78+
return $resources;
7079
}
7180
}

src/Bridge/Symfony/Bundle/Resources/config/hal.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
<argument type="service" id="api_platform.property_accessor" />
3535
<argument type="service" id="api_platform.name_converter" on-invalid="ignore" />
3636
<argument type="service" id="serializer.mapping.class_metadata_factory" on-invalid="ignore" />
37-
<argument type="service" id="api_platform.http_cache.resource_manager" on-invalid="ignore" />
3837

3938
<tag name="serializer.normalizer" priority="8" />
4039
</service>

src/Bridge/Symfony/Bundle/Resources/config/http_cache_tags.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,17 @@
55
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
66

77
<services>
8-
<service id="api_platform.http_cache.resource_manager" class="ApiPlatform\Core\HttpCache\ResourceManager" public="false" />
98
<service id="api_platform.http_cache.purger.varnish_client" class="GuzzleHttp\Client" abstract="true" public="false" />
109
<service id="api_platform.http_cache.purger.varnish" class="ApiPlatform\Core\HttpCache\VarnishPurger" public="false" />
1110

1211
<service id="api_platform.http_cache.listener.response.add_tags" class="ApiPlatform\Core\HttpCache\EventListener\AddTagsListener">
13-
<argument type="service" id="api_platform.http_cache.resource_manager" />
1412
<argument type="service" id="api_platform.iri_converter" />
1513

1614
<tag name="kernel.event_listener" event="kernel.response" method="onKernelResponse" />
1715
</service>
1816

1917
<!-- The onKernelView method must be executed after the validation (32) but before the write (64) -->
2018
<service id="api_platform.http_cache.listener.response.purge" class="ApiPlatform\Core\HttpCache\EventListener\PurgeListener">
21-
<argument type="service" id="api_platform.http_cache.resource_manager" />
2219
<argument type="service" id="api_platform.http_cache.purger" />
2320

2421
<tag name="kernel.event_listener" event="kernel.terminate" method="onKernelTerminate" />

src/Bridge/Symfony/Bundle/Resources/config/jsonld.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
<argument type="service" id="api_platform.property_accessor" />
2626
<argument type="service" id="api_platform.name_converter" on-invalid="ignore" />
2727
<argument type="service" id="serializer.mapping.class_metadata_factory" on-invalid="ignore" />
28-
<argument type="service" id="api_platform.http_cache.resource_manager" on-invalid="ignore" />
2928

3029
<tag name="serializer.normalizer" priority="8" />
3130
</service>

src/HttpCache/EventListener/AddTagsListener.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace ApiPlatform\Core\HttpCache\EventListener;
1313

1414
use ApiPlatform\Core\Api\IriConverterInterface;
15-
use ApiPlatform\Core\HttpCache\ResourceManagerInterface;
1615
use ApiPlatform\Core\Util\RequestAttributesExtractor;
1716
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
1817

@@ -24,15 +23,15 @@
2423
* @see https://support.cloudflare.com/hc/en-us/articles/206596608-How-to-Purge-Cache-Using-Cache-Tags-Enterprise-only-
2524
*
2625
* @author Kévin Dunglas <[email protected]>
26+
*
27+
* @experimental
2728
*/
2829
final class AddTagsListener
2930
{
30-
private $resourceManager;
3131
private $iriConverter;
3232

33-
public function __construct(ResourceManagerInterface $resourceManager, IriConverterInterface $iriConverter)
33+
public function __construct(IriConverterInterface $iriConverter)
3434
{
35-
$this->resourceManager = $resourceManager;
3635
$this->iriConverter = $iriConverter;
3736
}
3837

@@ -46,22 +45,22 @@ public function onKernelResponse(FilterResponseEvent $event)
4645
$request = $event->getRequest();
4746
if (
4847
!$request->isMethodCacheable()
49-
|| !$attributes = RequestAttributesExtractor::extractAttributes($request)
48+
|| (!$attributes = RequestAttributesExtractor::extractAttributes($request))
49+
|| !$resources = $request->attributes->get('resources')
5050
) {
5151
return;
5252
}
5353

54-
$resources = $this->resourceManager->getResources();
5554
if (isset($attributes['collection_operation_name'])) {
5655
// Allows to purge collections
57-
$resources[] = $this->iriConverter->getIriFromResourceClass($attributes['resource_class']);
56+
$iri = $this->iriConverter->getIriFromResourceClass($attributes['resource_class']);
57+
$resources[$iri] = $iri;
5858
}
5959

6060
if (!$resources) {
6161
return;
6262
}
6363

6464
$event->getResponse()->headers->set('Cache-Tags', implode(',', $resources));
65-
$this->resourceManager->clear();
6665
}
6766
}

src/HttpCache/EventListener/ConfigureListener.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
* Configures cache HTTP headers for the current response.
1919
*
2020
* @author Kévin Dunglas <[email protected]>
21+
*
22+
* @experimental
2123
*/
2224
final class ConfigureListener
2325
{

src/HttpCache/EventListener/PurgeListener.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace ApiPlatform\Core\HttpCache\EventListener;
1313

1414
use ApiPlatform\Core\HttpCache\PurgerInterface;
15-
use ApiPlatform\Core\HttpCache\ResourceManagerInterface;
1615
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
1716

1817
/**
@@ -22,20 +21,17 @@
2221
*/
2322
final class PurgeListener
2423
{
25-
private $resourceManager;
2624
private $purger;
2725

28-
public function __construct(ResourceManagerInterface $resourceManager, PurgerInterface $purger)
26+
public function __construct(PurgerInterface $purger)
2927
{
30-
$this->resourceManager = $resourceManager;
3128
$this->purger = $purger;
3229
}
3330

3431
public function onKernelTerminate(PostResponseEvent $event)
3532
{
36-
if ($iris = $this->resourceManager->getResources()) {
37-
$this->purger->purge($iris);
38-
$this->resourceManager->clear();
33+
if ($resources = $event->getRequest()->attributes->get('resources')) {
34+
$this->purger->purge($resources);
3935
}
4036
}
4137
}

src/HttpCache/PurgerInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
* Purges resources from the cache.
1616
*
1717
* @author Kévin Dunglas <[email protected]>
18+
*
19+
* @experimental
1820
*/
1921
interface PurgerInterface
2022
{

src/HttpCache/ResourceManager.php

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/HttpCache/ResourceManagerInterface.php

Lines changed: 0 additions & 39 deletions
This file was deleted.

src/HttpCache/VarnishPurger.php

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

1414
use GuzzleHttp\ClientInterface;
1515

16+
/**
17+
* Purges Varnish.
18+
*
19+
* @author Kévin Dunglas <[email protected]>
20+
*
21+
* @experimental
22+
*/
1623
final class VarnishPurger implements PurgerInterface
1724
{
1825
private $clients;

src/JsonLd/Serializer/ItemNormalizer.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use ApiPlatform\Core\Api\IriConverterInterface;
1717
use ApiPlatform\Core\Api\ResourceClassResolverInterface;
1818
use ApiPlatform\Core\Exception\InvalidArgumentException;
19-
use ApiPlatform\Core\HttpCache\ResourceManagerInterface;
2019
use ApiPlatform\Core\JsonLd\ContextBuilderInterface;
2120
use ApiPlatform\Core\Metadata\Property\Factory\PropertyMetadataFactoryInterface;
2221
use ApiPlatform\Core\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface;
@@ -42,9 +41,9 @@ final class ItemNormalizer extends AbstractItemNormalizer
4241
private $resourceMetadataFactory;
4342
private $contextBuilder;
4443

45-
public function __construct(ResourceMetadataFactoryInterface $resourceMetadataFactory, PropertyNameCollectionFactoryInterface $propertyNameCollectionFactory, PropertyMetadataFactoryInterface $propertyMetadataFactory, IriConverterInterface $iriConverter, ResourceClassResolverInterface $resourceClassResolver, ContextBuilderInterface $contextBuilder, PropertyAccessorInterface $propertyAccessor = null, NameConverterInterface $nameConverter = null, ClassMetadataFactoryInterface $classMetadataFactory = null, ResourceManagerInterface $resourceManager = null)
44+
public function __construct(ResourceMetadataFactoryInterface $resourceMetadataFactory, PropertyNameCollectionFactoryInterface $propertyNameCollectionFactory, PropertyMetadataFactoryInterface $propertyMetadataFactory, IriConverterInterface $iriConverter, ResourceClassResolverInterface $resourceClassResolver, ContextBuilderInterface $contextBuilder, PropertyAccessorInterface $propertyAccessor = null, NameConverterInterface $nameConverter = null, ClassMetadataFactoryInterface $classMetadataFactory = null)
4645
{
47-
parent::__construct($propertyNameCollectionFactory, $propertyMetadataFactory, $iriConverter, $resourceClassResolver, $propertyAccessor, $nameConverter, $classMetadataFactory, $resourceManager);
46+
parent::__construct($propertyNameCollectionFactory, $propertyMetadataFactory, $iriConverter, $resourceClassResolver, $propertyAccessor, $nameConverter, $classMetadataFactory);
4847

4948
$this->resourceMetadataFactory = $resourceMetadataFactory;
5049
$this->contextBuilder = $contextBuilder;

0 commit comments

Comments
 (0)