8000 Introduce MetadataValidators to test arbitrary metadata for freshness. by bnw · Pull Request #15692 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

Introduce MetadataValidators to test arbitrary metadata for freshness. #15692

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 36 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
60b4089
Introduce MetadataValidators to test arbitrary metadata for freshness.
bnw Sep 3, 2015
673070b
Added trailing newline
bnw Sep 4, 2015
ab39129
Added new parameter to interface
bnw Sep 4, 2015
9546be9
Renamed ResourceValidator to ResourceInterfaceValidator
bnw Sep 4, 2015
0342b73
Added missing import
bnw Sep 4, 2015
7aee891
Correcting classname after renaming
bnw Sep 4, 2015
df526c0
Added ConfigCachePass to framework
bnw Sep 4, 2015
2555d5a
Fixed UnitTests
bnw Sep 4, 2015
4145dc0
Bugfix
bnw Sep 4, 2015
2e49fb2
Better name
bnw Sep 4, 2015
d0f1e2d
Fix test
mpdude Sep 5, 2015
3f9424f
Add docblock
mpdude Sep 5, 2015
b8bb60a
Fix tests while keeping ConfigCacheFactory unchanged (from a client p…
mpdude Sep 5, 2015
2fac8f3
Hello Fabbot
mpdude Sep 5, 2015
1b62130
Forgot import statement
mpdude Sep 5, 2015
b16d9de
The new ConfigCachePass is required
mpdude Sep 6, 2015
97a2cd0
Bump deps
mpdude Sep 6, 2015
aae0a78
Avoid changing the interface
mpdude Sep 6, 2015
024aa8c
Also validate this method in the interface
mpdude Sep 7, 2015
d617943
Rename ResourceInterfaceValidator to ResourceValidator as suggested o…
mpdude Sep 7, 2015
8907a21
Oh Fabbot
mpdude Sep 7, 2015
e471890
Add a note why the ResourceInterface::__toString method is important …
mpdude Sep 7, 2015
e9fd197
Remove totally broken test
mpdude Sep 7, 2015
53ad659
Rewrite ConfigCacheTest because it made many assumptions about how th…
mpdude Sep 7, 2015
594529c
Fix ConfigCache and improve docblock
mpdude Sep 7, 2015
32426ce
If I had to pay just $0.02 for every Fabbot complaint, Fabien would b…
mpdude Sep 7, 2015
f3470e3
Document deprecation in the CHANGELOG file
mpdude Sep 7, 2015
7739878
Some more tweaks to the ConfigCacheTest
mpdude Sep 7, 2015
f9c48a0
Remove unused import
mpdude Sep 7, 2015
c0f416d
Continue with next resource, not next validator
mpdude Sep 8, 2015
00b4efb
Add a shortcut for when we don't have any validators (might be in prod)
mpdude Sep 8, 2015
23a4464
Create a new ValidatorConfigCache class and pass metadata validators …
mpdude Sep 8, 2015
caf6bf1
Fabbot
mpdude Sep 8, 2015
37c96e1
This is not relevant for this PR
mpdude Sep 8, 2015
7bc5ba2
Tweaks as suggested on GH
mpdude Sep 8, 2015
f5add4c
Implement the plan(TM)
mpdude Sep 9, 2015
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
Prev Previous commit
Implement the plan(TM)
* Add priorities so that new custom ResourceCheckers can be run first
* Provide a default ResourceChecker with a very low priority that will validate through ResourceInterface::isFresh() but triggers a deprecation warning.
* Add a new interface that extends ResourceInterface and contains the isFresh() method.
* Add a ResourceChecker for this interface with a slightly higher priority and without deprecation warning.
* Make FileResource et. al. implement the new interface.
* Deprecate ResourceInterface::isFresh() but keep that method in the new interface subclass.
  • Loading branch information
mpdude committed Sep 9, 2015
commit f5add4c419634e0e0024b6412bf119eb8fd4f653
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

/**
* Adds services tagged config_cache.resource_checker to the config_cache_factory service, ordering them by priority.
*
* @author Matthias Pigulla <mp@webfactory.de>
* @author Benjamin Klotz <bk@webfactory.de>
*/
class ConfigCachePass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$resourceCheckers = array();
foreach ($container->findTaggedServiceIds('config_cache.resource_checker') as $id => $attributes) {
$priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
$resourceCheckers[$priority][] = new Reference($id);
}

// sort by priority and flatten
krsort($resourceCheckers);
$resourceCheckers = call_user_func_array('array_merge', $resourceCheckers);

$container->getDefinition('config_cache_factory')->addMethodCall('setResourceCheckers', array($resourceCheckers));
}
}
2 changes: 1 addition & 1 deletion src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationExtractorPass;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationDumperPass;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\SerializerPass;
use Symfony\Component\Config\DependencyInjection\ConfigCachePass;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ConfigCachePass;
use Symfony\Component\Debug\ErrorHandler;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
Expand Down
19 changes: 13 additions & 6 deletions src/Symfony/Bundle/FrameworkBundle/Resources/config/services.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@
<parameter key="file_locator.class">Symfony\Component\HttpKernel\Config\FileLocator</parameter>
<parameter key="uri_signer.class">Symfony\Component\HttpKernel\UriSigner</parameter>
<parameter key="request_stack.class">Symfony\Component\HttpFoundation\RequestStack</parameter>
<parameter key="config_cache_factory.class">Symfony\Component\Config\ValidatorConfigCacheFactory</parameter>
<parameter key="config_cache_default_validator.class">Symfony\Component\Config\Resource\ResourceValidator</parameter>
<parameter key="config_cache_factory.class">Symfony\Component\Config\ResourceCheckerConfigCacheFactory</parameter>
<parameter key="config_cache_default_resource_checker.class">Symfony\Component\Config\Resource\DefaultResourceChecker</parameter>
<parameter key="config_cache_bc_resource_interface_checker.class">Symfony\Component\Config\Resource\BCResourceInterfaceChecker</parameter>
</parameters>

<services>
Expand Down Expand Up @@ -66,12 +67,18 @@
<argument>%kernel.secret%</argument>
</service>

<service id="config_cache_factory" class="%config_cache_factory.class%">
<argument>%kernel.debug%</argument>
<service id="config_cache_factory" class="%config_cache_factory.class%" />

<service id="config_cache_default_resource_checker" class="%config_cache_default_resource_checker.class%">
<tag name="config_cache.resource_checker" priority="-990" />
</service>

<service id="config_cache_default_validator" class="%config_cache_default_validator.class%">
<tag name="config_cache.metadata_validato 6D40 r" />
<!--
This service is deprecated and will be removed in 3.0.
-->
<service id="config_cache_bc_resource_interface_checker" class="%config_cache_bc_resource_interface_checker.class%">
<tag name="config_cache.resource_checker" priority="-1000" />
</service>

</services>
</container>
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Reference;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ConfigCachePass;

class ConfigCachePassTest extends \PHPUnit_Framework_TestCase
{
public function testThatCheckersAreProcessedInPriorityOrder()
{
$services = array(
'checker_2' => array(0 => array('priority' => 100)),
'checker_1' => array(0 => array('priority' => 200)),
'checker_3' => array(),
);

$definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
$container = $this->getMock(
'Symfony\Component\DependencyInjection\ContainerBuilder',
array('findTaggedServiceIds', 'getDefinition', 'hasDefinition')
);

$container->expects($this->atLeastOnce())
->method('findTaggedServiceIds')
->will($this->returnValue($services));
$container->expects($this->atLeastOnce())
->method('getDefinition')
->with('config_cache_factory')
->will($this->returnValue($definition));

$definition->expects($this->once())
->method('addMethodCall')
->with('setResourceCheckers', array(
array(
new Reference('checker_1'),
new Reference('checker_2'),
new Reference('checker_3'),
)
));

$pass = new ConfigCachePass();
$pass->process($container);
}
}
17 changes: 13 additions & 4 deletions src/Symfony/Component/Config/ConfigCache.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,25 @@

namespace Symfony\Component\Config;

use Symfony\Component\Config\Resource\ResourceValidator;
use Symfony\Component\Config\Resource\BCResourceInterfaceChecker;
use Symfony\Component\Config\Resource\DefaultResourceChecker;

/**
* ConfigCache caches arbitrary content in files on disk.
*
* When in debug mode, those metadata resources that implement
* \Symfony\Component\Config\Resource\ResourceInterface will
* \Symfony\Component\Config\Resource\SelfCheckingResourceInterface will
* be used to check cache freshness.
*
* During a transition period, also instances of
* \Symfony\Component\Config\Resource\ResourceInterface will be checked
* by means of the isFresh() method. This behaviour is deprecated since 2.8
* and will be removed in 3.0.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Matthias Pigulla <mp@webfactory.de>
*/
class ConfigCache extends ValidatorConfigCache
class ConfigCache extends ResourceCheckerConfigCache
{
private $debug;

Expand All @@ -33,7 +39,10 @@ class ConfigCache extends ValidatorConfigCache
*/
public function __construct($file, $debug)
{
parent::__construct($file, array(new ResourceValidator()));
parent::__construct($file, array(
new DefaultResourceChecker(),
new BCResourceInterfaceChecker()
));
$this->debug = (bool) $debug;
}

Expand Down
10 changes: 5 additions & 5 deletions src/Symfony/Component/Config/ConfigCacheFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@

namespace Symfony\Component\Config;

use Symfony\Component\Config\Resource\ResourceValidator;

/**
* Basic implementation of ConfigCacheFactoryInterface.
* Creates a ConfigCache instance that will be validated with the
* ResourceValidator only.
* Basic implementation of ConfigCacheFactoryInterface that
* creates an instance of the default ConfigCache.
*
* This factory and/or cache <em>do not</em> support cache validation
* by means of ResourceChecker instances (that is, service-based).
*
* @author Matthias Pigulla <mp@webfactory.de>
*/
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Config\Resource;

/**
* Resource checker for the ResourceInterface. Exists for BC.
*
* @author Matthias Pigulla <mp@webfactory.de>
*
* @deprecated since 2.8, to be removed in 3.0.
*/
class BCResourceInterfaceChecker extends DefaultResourceChecker
{
public function supports(ResourceInterface $metadata)
{
/* As all resources must be instanceof ResourceInterface,
we support them all. */
return true;
}

public function isFresh(ResourceInterface $metadata, $timestamp)
{
trigger_error('Resource checking through ResourceInterface::isFresh() is deprecated since 2.8 and will be removed in 3.0', E_USER_DEPRECATED);

return parent::isFresh($metadata, $timestamp); // For now, $metadata features the isFresh() method, so off we go (quack quack)
}
}
36 changes: 36 additions & 0 deletions src/Symfony/Component/Config/Resource/DefaultResourceChecker.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Config\Resource;

use Symfony\Component\Config\ResourceCheckerInterface;

/**
* Resource checker for instances of
* SelfCheckingResourceInterface. As these resources can
* perform the check themselves, we can support them in a generic
* way.
*
* @author Matthias Pigulla <mp@webfactory.de>
*/
class DefaultResourceChecker implements ResourceCheckerInterface
{
public function supports(ResourceInterface $metadata)
{
return $metadata instanceof SelfCheckingResourceInterface;
}

public function isFresh(ResourceInterface $metadata, $timestamp)
{
/** @var SelfCheckingResourceInterface $metadata */
return $metadata->isFresh($timestamp);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
*
* @author Fabien Potencier <fabien@symfony.com>
*/
class DirectoryResource implements ResourceInterface, \Serializable
class DirectoryResource implements SelfCheckingResourceInterface, \Serializable
{
private $resource;
private $pattern;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
*
* @author Charles-Henri Bruyand <charleshenri.bruyand@gmail.com>
*/
class FileExistenceResource implements ResourceInterface, \Serializable
class FileExistenceResource implements SelfCheckingResourceInterface, \Serializable
{
private $resource;

Expand Down
2 changes: 1 addition & 1 deletion src/Symfony/Component/Config/Resource/FileResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*
* @author Fabien Potencier <fabien@symfony.com>
*/
class FileResource implements ResourceInterface, \Serializable
class FileResource implements SelfCheckingResourceInterface, \Serializable
{
/**
* @var string|false
Expand Down
3 changes: 3 additions & 0 deletions src/Symfony/Component/Config/Resource/ResourceInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public function __toString();
* @param int $timestamp The last time the resource was loaded
*
* @return bool True if the resource has not been updated, false otherwise
*
* @deprecated since 2.8, to be removed in 3.0. If your resource can check itself for
* freshness implement the SelfCheckingResourceInterface instead.
*/
public function isFresh($timestamp);

Expand Down
32 changes: 0 additions & 32 deletions src/Symfony/Component/Config/Resource/ResourceValidator.php

This file was deleted.

Loading
0