diff --git a/UPGRADE-2.2.md b/UPGRADE-2.2.md index e4494eeda8..524a8f7e1d 100644 --- a/UPGRADE-2.2.md +++ b/UPGRADE-2.2.md @@ -202,10 +202,10 @@ ``` use Symfony\Component\PropertyAccess\PropertyAccess; - $accessor = PropertyAccess::getPropertyAccessor(); + $propertyAccessor = PropertyAccess::getPropertyAccessor(); $value = $propertyAccessor->getValue($object, 'some.path'); - $accessor->setValue($object, 'some.path', 'new value'); + $propertyAccessor->setValue($object, 'some.path', 'new value'); ``` After (alternative 2): @@ -214,11 +214,11 @@ use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyPath; - $accessor = PropertyAccess::getPropertyAccessor(); + $propertyAccessor = PropertyAccess::getPropertyAccessor(); $propertyPath = new PropertyPath('some.path'); $value = $propertyAccessor->getValue($object, $propertyPath); - $accessor->setValue($object, $propertyPath, 'new value'); + $propertyAccessor->setValue($object, $propertyPath, 'new value'); ``` ### Routing diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php index a9aa7a5b8f..99a0f2e88c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php @@ -104,10 +104,31 @@ EOF $warmer->warmUp($warmupDir); + foreach (Finder::create()->files()->name('*.meta')->in($warmupDir) as $file) { + // fix meta references to the Kernel + $content = preg_replace( + '/C\:\d+\:"'.preg_quote($class.$this->getTempKernelSuffix(), '"/').'"/', + sprintf('C:%s:"%s"', strlen($class), $class), + file_get_contents($file) + ); + + // fix meta references to cache files + $realWarmupDir = substr($warmupDir, 0, -4); + $content = preg_replace_callback( + '/s\:\d+\:"'.preg_quote($warmupDir, '/').'([^"]+)"/', + function (array $matches) use ($realWarmupDir) { + $path = $realWarmupDir.$matches[1]; + return sprintf('s:%s:"%s"', strlen($path), $path); + }, + $content + ); + + file_put_contents($file, $content); + } + // fix container files and classes $regex = '/'.preg_quote($this->getTempKernelSuffix(), '/').'/'; - $finder = new Finder(); - foreach ($finder->files()->name(get_class($kernel->getContainer()).'*')->in($warmupDir) as $file) { + foreach (Finder::create()->files()->name(get_class($kernel->getContainer()).'*')->in($warmupDir) as $file) { $content = file_get_contents($file); $content = preg_replace($regex, '', $content); @@ -117,16 +138,6 @@ EOF file_put_contents(preg_replace($regex, '', $file), $content); unlink($file); } - - // fix meta references to the Kernel - foreach ($finder->files()->name('*.meta')->in($warmupDir) as $file) { - $content = preg_replace( - '/C\:\d+\:"'.preg_quote($class.$this->getTempKernelSuffix(), '"/').'"/', - sprintf('C:%s:"%s"', strlen($class), $class), - file_get_contents($file) - ); - file_put_contents($file, $content); - } } protected function getTempKernelSuffix() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index fcbfafe5c6..b658b66e61 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -269,8 +269,8 @@ class FrameworkExtension extends Extension $loader->load('routing.xml'); $container->setParameter('router.resource', $config['resource']); + $container->setParameter('router.cache_class_prefix', $container->getParameter('kernel.name').ucfirst($container->getParameter('kernel.environment'))); $router = $container->findDefinition('router.default'); - $argument = $router->getArgument(2); $argument['strict_requirements'] = $config['strict_requirements']; if (isset($config['type'])) { diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml index 14e2661f6d..6d6671b7ae 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml @@ -19,8 +19,8 @@ Symfony\Bundle\FrameworkBundle\Routing\RedirectableUrlMatcher Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper Symfony\Bundle\FrameworkBundle\CacheWarmer\RouterCacheWarmer - %kernel.name%%kernel.environment%UrlMatcher - %kernel.name%%kernel.environment%UrlGenerator + %router.cache_class_prefix%UrlMatcher + %router.cache_class_prefix%UrlGenerator Symfony\Component\HttpKernel\EventListener\RouterListener localhost http diff --git a/src/Symfony/Component/Console/Input/ArgvInput.php b/src/Symfony/Component/Console/Input/ArgvInput.php index 2618c0691a..9addf1483d 100644 --- a/src/Symfony/Component/Console/Input/ArgvInput.php +++ b/src/Symfony/Component/Console/Input/ArgvInput.php @@ -68,7 +68,6 @@ class ArgvInput extends Input protected function setTokens(array $tokens) { $this->tokens = $tokens; - $this->parse(); } /** diff --git a/src/Symfony/Component/Console/Input/StringInput.php b/src/Symfony/Component/Console/Input/StringInput.php index 93b1b83bb1..ecdb3e3dff 100644 --- a/src/Symfony/Component/Console/Input/StringInput.php +++ b/src/Symfony/Component/Console/Input/StringInput.php @@ -33,13 +33,19 @@ class StringInput extends ArgvInput * @param string $input An array of parameters from the CLI (in the argv format) * @param InputDefinition $definition A InputDefinition instance * + * @deprecated The second argument is deprecated as it does not work (will be removed in 3.0), use 'bind' method instead + * * @api */ public function __construct($input, InputDefinition $definition = null) { - parent::__construct(array(), $definition); + parent::__construct(array(), null); $this->setTokens($this->tokenize($input)); + + if (null !== $definition) { + $this->bind($definition); + } } /** diff --git a/src/Symfony/Component/Console/Tests/Input/StringInputTest.php b/src/Symfony/Component/Console/Tests/Input/StringInputTest.php index 4a165d4a30..1ce5fe6274 100644 --- a/src/Symfony/Component/Console/Tests/Input/StringInputTest.php +++ b/src/Symfony/Component/Console/Tests/Input/StringInputTest.php @@ -11,9 +11,9 @@ namespace Symfony\Component\Console\Tests\Input; -use Symfony\Component\Console\Input\StringInput; use Symfony\Component\Console\Input\InputDefinition; use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Input\StringInput; class StringInputTest extends \PHPUnit_Framework_TestCase { @@ -35,10 +35,14 @@ class StringInputTest extends \PHPUnit_Framework_TestCase array(new InputOption('foo', null, InputOption::VALUE_REQUIRED)) ); - $input = new StringInput('--foo=bar', $definition); - $actual = $input->getOption('foo'); + // call to bind + $input = new StringInput('--foo=bar'); + $input->bind($definition); + $this->assertEquals('bar', $input->getOption('foo')); - $this->assertEquals('bar', $actual); + // definition in constructor + $input = new StringInput('--foo=bar', $definition); + $this->assertEquals('bar', $input->getOption('foo')); } public function getTokenizeData() diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index d4a62b8bae..e7fcbf200b 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -431,7 +431,12 @@ class ContainerBuilder extends Container implements TaggedContainerInterface $this->loading[$id] = true; - $service = $this->createService($definition, $id); + try { + $service = $this->createService($definition, $id); + } catch (\Exception $e) { + unset($this->loading[$id]); + throw $e; + } unset($this->loading[$id]); diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php index de542db17b..bfd92798dc 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php @@ -19,6 +19,7 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Exception\RuntimeException; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\Config\Resource\FileResource; @@ -116,6 +117,26 @@ class ContainerBuilderTest extends \PHPUnit_Framework_TestCase $this->assertTrue($builder->get('bar') === $builder->get('bar'), '->get() always returns the same instance if the service is shared'); } + /** + * @covers \Symfony\Component\DependencyInjection\ContainerBuilder::get + * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException + * @expectedExceptionMessage You have requested a synthetic service ("foo"). The DIC does not know how to construct this service. + */ + public function testGetUnsetLoadingServiceWhenCreateServiceThrowsAnException() + { + $builder = new ContainerBuilder(); + $builder->register('foo', 'stdClass')->setSynthetic(true); + + // we expect a RuntimeException here as foo is synthetic + try { + $builder->get('foo'); + } catch (RuntimeException $e) { + } + + // we must also have the same RuntimeException here + $builder->get('foo'); + } + /** * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getServiceIds */ diff --git a/src/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php b/src/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php index 4b8cf07a66..122479b922 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php +++ b/src/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php @@ -238,4 +238,17 @@ class RedisMock return true; } + + public function select($dbnum) + { + if (!$this->connected) { + return false; + } + + if (0 > $dbnum) { + return false; + } + + return true; + } } diff --git a/src/Symfony/Component/Routing/RouteCollection.php b/src/Symfony/Component/Routing/RouteCollection.php index e53606da5f..b60b7f3d2c 100644 --- a/src/Symfony/Component/Routing/RouteCollection.php +++ b/src/Symfony/Component/Routing/RouteCollection.php @@ -65,6 +65,9 @@ class RouteCollection implements \IteratorAggregate, \Countable */ public function getParent() { + trigger_error('getParent() is deprecated since version 2.2 and will be removed in 2.3. There is no substitution ' . + 'because RouteCollection is not tree structure anymore.', E_USER_DEPRECATED); + return $this->parent; } @@ -77,6 +80,9 @@ class RouteCollection implements \IteratorAggregate, \Countable */ public function getRoot() { + trigger_error('getRoot() is deprecated since version 2.2 and will be removed in 2.3. There is no substitution ' . + 'because RouteCollection is not tree structure anymore.', E_USER_DEPRECATED); + $parent = $this; while ($parent->getParent()) { $parent = $parent->getParent(); @@ -157,7 +163,10 @@ class RouteCollection implements \IteratorAggregate, \Countable public function remove($name) { // just for BC - $root = $this->getRoot(); + $root = $this; + while ($root->parent) { + $root = $root->parent; + } foreach ((array) $name as $n) { unset($root->routes[$n]); @@ -184,6 +193,8 @@ class RouteCollection implements \IteratorAggregate, \Countable // this is to keep BC $numargs = func_num_args(); if ($numargs > 1) { + trigger_error('addCollection() should only be used with a single parameter. The params $prefix, $defaults, $requirements and $options ' . + 'are deprecated since version 2.2 and will be removed in 2.3. Use addPrefix() and addOptions() instead.', E_USER_DEPRECATED); $collection->addPrefix($this->prefix . func_get_arg(1)); if ($numargs > 2) { $collection->addDefaults(func_get_arg(2)); @@ -232,7 +243,13 @@ class RouteCollection implements \IteratorAggregate, \Countable $this->prefix = '/' . $prefix . $this->prefix; // this is to keep BC - $options = func_num_args() > 3 ? func_get_arg(3) : array(); + if (func_num_args() > 3) { + trigger_error('The fourth parameter ($options) of addPrefix() is deprecated since version 2.2 and will be removed in 2.3. ' . + 'Use addOptions() instead.', E_USER_DEPRECATED); + $options = func_get_arg(3); + } else { + $options = array(); + } foreach ($this->routes as $route) { $route->setPath('/' . $prefix . $route->getPath()); @@ -251,6 +268,9 @@ class RouteCollection implements \IteratorAggregate, \Countable */ public function getPrefix() { + trigger_error('getPrefix() is deprecated since version 2.2 and will be removed in 2.3. The method suggests that ' . + 'all routes in the collection would have this prefix, which is not necessarily true.', E_USER_DEPRECATED); + return $this->prefix; } diff --git a/src/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php b/src/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php index da72d6b3a9..72bee71002 100644 --- a/src/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php +++ b/src/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php @@ -150,7 +150,8 @@ class ApacheMatcherDumperTest extends \PHPUnit_Framework_TestCase $route3 = new Route('/route3', array(), array(), array(), 'b.example.com'); $collection2->add('route3', $route3); - $collection1->addCollection($collection2, '/c2'); + $collection2->addPrefix('/c2'); + $collection1->addCollection($collection2); $route4 = new Route('/route4', array(), array(), array(), 'a.example.com'); $collection1->add('route4', $route4); diff --git a/src/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php b/src/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php index 4764df617d..542ede85c0 100644 --- a/src/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php +++ b/src/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php @@ -118,14 +118,17 @@ class PhpMatcherDumperTest extends \PHPUnit_Framework_TestCase $collection1->add('overridden', new Route('/overridden1')); $collection1->add('foo1', new Route('/{foo}')); $collection1->add('bar1', new Route('/{bar}')); + $collection1->addPrefix('/b\'b'); $collection2 = new RouteCollection(); - $collection2->addCollection($collection1, '/b\'b'); + $collection2->addCollection($collection1); $collection2->add('overridden', new Route('/{var}', array(), array('var' => '.*'))); $collection1 = new RouteCollection(); $collection1->add('foo2', new Route('/{foo1}')); $collection1->add('bar2', new Route('/{bar1}')); - $collection2->addCollection($collection1, '/b\'b'); - $collection->addCollection($collection2, '/a'); + $collection1->addPrefix('/b\'b'); + $collection2->addCollection($collection1); + $collection2->addPrefix('/a'); + $collection->addCollection($collection2); // overridden through addCollection() and multiple sub-collections with no own prefix $collection1 = new RouteCollection(); @@ -137,15 +140,16 @@ class PhpMatcherDumperTest extends \PHPUnit_Framework_TestCase $collection3->add('hey', new Route('/hey/')); $collection2->addCollection($collection3); $collection1->addCollection($collection2); - $collection->addCollection($collection1, '/multi'); + $collection1->addPrefix('/multi'); + $collection->addCollection($collection1); // "dynamic" prefix $collection1 = new RouteCollection(); $collection1->add('foo3', new Route('/{foo}')); $collection1->add('bar3', new Route('/{bar}')); - $collection2 = new RouteCollection(); - $collection2->addCollection($collection1, '/b'); - $collection->addCollection($collection2, '/{_locale}'); + $collection1->addPrefix('/b'); + $collection1->addPrefix('{_locale}'); + $collection->addCollection($collection1); // route between collections $collection->add('ababa', new Route('/ababa')); @@ -153,7 +157,8 @@ class PhpMatcherDumperTest extends \PHPUnit_Framework_TestCase // collection with static prefix but only one route $collection1 = new RouteCollection(); $collection1->add('foo4', new Route('/{foo}')); - $collection->addCollection($collection1, '/aba'); + $collection1->addPrefix('/aba'); + $collection->addCollection($collection1); // prefix and host @@ -215,10 +220,12 @@ class PhpMatcherDumperTest extends \PHPUnit_Framework_TestCase $collection2->add('b', new Route('/{var}')); $collection3 = new RouteCollection(); $collection3->add('c', new Route('/{var}')); - - $collection2->addCollection($collection3, '/c'); - $collection1->addCollection($collection2, '/b'); - $collection->addCollection($collection1, '/a'); + $collection3->addPrefix('/c'); + $collection2->addCollection($collection3); + $collection2->addPrefix('/b'); + $collection1->addCollection($collection2); + $collection1->addPrefix('/a'); + $collection->addCollection($collection1); /* test case 2 */ diff --git a/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php b/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php index fee6fe2b6f..8a1428f170 100644 --- a/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php +++ b/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php @@ -130,14 +130,10 @@ class UrlMatcherTest extends \PHPUnit_Framework_TestCase public function testMatchWithPrefixes() { - $collection1 = new RouteCollection(); - $collection1->add('foo', new Route('/{foo}')); - - $collection2 = new RouteCollection(); - $collection2->addCollection($collection1, '/b'); - $collection = new RouteCollection(); - $collection->addCollection($collection2, '/a'); + $collection->add('foo', new Route('/{foo}')); + $collection->addPrefix('/b'); + $collection->addPrefix('/a'); $matcher = new UrlMatcher($collection, new RequestContext()); $this->assertEquals(array('_route' => 'foo', 'foo' => 'foo'), $matcher->match('/a/b/foo')); @@ -145,14 +141,10 @@ class UrlMatcherTest extends \PHPUnit_Framework_TestCase public function testMatchWithDynamicPrefix() { - $collection1 = new RouteCollection(); - $collection1->add('foo', new Route('/{foo}')); - - $collection2 = new RouteCollection(); - $collection2->addCollection($collection1, '/b'); - $collection = new RouteCollection(); - $collection->addCollection($collection2, '/{_locale}'); + $collection->add('foo', new Route('/{foo}')); + $collection->addPrefix('/b'); + $collection->addPrefix('/{_locale}'); $matcher = new UrlMatcher($collection, new RequestContext()); $this->assertEquals(array('_locale' => 'fr', '_route' => 'foo', 'foo' => 'foo'), $matcher->match('/fr/b/foo')); diff --git a/src/Symfony/Component/Routing/Tests/RouteCollectionTest.php b/src/Symfony/Component/Routing/Tests/RouteCollectionTest.php index 65f9967e6a..901317663f 100644 --- a/src/Symfony/Component/Routing/Tests/RouteCollectionTest.php +++ b/src/Symfony/Component/Routing/Tests/RouteCollectionTest.php @@ -54,16 +54,19 @@ class RouteCollectionTest extends \PHPUnit_Framework_TestCase $this->assertEquals('/foo2', $collection->get('foo')->getPath()); } - public function testIteratorWithOverriddenRoutes() + public function testIterator() { $collection = new RouteCollection(); $collection->add('foo', new Route('/foo')); $collection1 = new RouteCollection(); - $collection1->add('foo', new Route('/foo1')); + $collection1->add('bar', $bar = new Route('/bar')); + $collection1->add('foo', $foo = new Route('/foo-new')); $collection->addCollection($collection1); + $collection->add('last', $last = new Route('/last')); - $this->assertEquals('/foo1', $this->getFirstNamedRoute($collection, 'foo')->getPath()); + $this->assertInstanceOf('\ArrayIterator', $collection->getIterator()); + $this->assertSame(array('bar' => $bar, 'foo' => $foo, 'last' => $last), $collection->getIterator()->getArrayCopy()); } public function testCount() @@ -72,52 +75,38 @@ class RouteCollectionTest extends \PHPUnit_Framework_TestCase $collection->add('foo', new Route('/foo')); $collection1 = new RouteCollection(); - $collection1->add('foo1', new Route('/foo1')); + $collection1->add('bar', new Route('/bar')); $collection->addCollection($collection1); $this->assertCount(2, $collection); } - protected function getFirstNamedRoute(RouteCollection $routeCollection, $name) + public function testAddCollection() { - foreach ($routeCollection as $key => $route) { - if ($route instanceof RouteCollection) { - return $this->getFirstNamedRoute($route, $name); - } + $collection = new RouteCollection(); + $collection->add('foo', new Route('/foo')); - if ($name === $key) { - return $route; - } - } + $collection1 = new RouteCollection(); + $collection1->add('bar', $bar = new Route('/bar')); + $collection1->add('foo', $foo = new Route('/foo-new')); + + $collection2 = new RouteCollection(); + $collection2->add('grandchild', $grandchild = new Route('/grandchild')); + + $collection1->addCollection($collection2); + $collection->addCollection($collection1); + $collection->add('last', $last = new Route('/last')); + + $this->assertSame(array('bar' => $bar, 'foo' => $foo, 'grandchild' => $grandchild, 'last' => $last), $collection->all(), + '->addCollection() imports routes of another collection, overrides if necessary and adds them at the end'); } - public function testAddCollection() + public function testAddCollectionWithResources() { if (!class_exists('Symfony\Component\Config\Resource\FileResource')) { $this->markTestSkipped('The "Config" component is not available'); } - $collection = new RouteCollection(); - $collection->add('foo', $foo = new Route('/foo')); - $collection1 = new RouteCollection(); - $collection1->add('foo', $foo1 = new Route('/foo1')); - $collection1->add('bar', $bar1 = new Route('/bar1')); - $collection->addCollection($collection1); - $this->assertEquals(array('foo' => $foo1, 'bar' => $bar1), $collection->all(), '->addCollection() adds routes from another collection'); - - $collection = new RouteCollection(); - $collection->add('foo', $foo = new Route('/foo')); - $collection1 = new RouteCollection(); - $collection1->add('foo', $foo1 = new Route('/foo1')); - $collection->addCollection($collection1, '/{foo}', array('foo' => 'foo'), array('foo' => '\d+'), array('foo' => 'bar')); - $this->assertEquals('/{foo}/foo1', $collection->get('foo')->getPath(), '->addCollection() can add a prefix to all merged routes'); - $this->assertEquals(array('foo' => 'foo'), $collection->get('foo')->getDefaults(), '->addCollection() can add a prefix to all merged routes'); - $this->assertEquals(array('foo' => '\d+'), $collection->get('foo')->getRequirements(), '->addCollection() can add a prefix to all merged routes'); - $this->assertEquals( - array('foo' => 'bar', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'), - $collection->get('foo')->getOptions(), '->addCollection() can add an option to all merged routes' - ); - $collection = new RouteCollection(); $collection->addResource($foo = new FileResource(__DIR__.'/Fixtures/foo.xml')); $collection1 = new RouteCollection(); @@ -126,6 +115,33 @@ class RouteCollectionTest extends \PHPUnit_Framework_TestCase $this->assertEquals(array($foo, $foo1), $collection->getResources(), '->addCollection() merges resources'); } + public function testAddDefaultsAndRequirementsAndOptions() + { + $collection = new RouteCollection(); + $collection->add('foo', new Route('/{placeholder}')); + $collection1 = new RouteCollection(); + $collection1->add('bar', new Route('/{placeholder}', + array('_controller' => 'fixed', 'placeholder' => 'default'), array('placeholder' => '.+'), array('option' => 'value')) + ); + $collection->addCollection($collection1); + + $collection->addDefaults(array('placeholder' => 'new-default')); + $this->assertEquals(array('placeholder' => 'new-default'), $collection->get('foo')->getDefaults(), '->addDefaults() adds defaults to all routes'); + $this->assertEquals(array('_controller' => 'fixed', 'placeholder' => 'new-default'), $collection->get('bar')->getDefaults(), + '->addDefaults() adds defaults to all routes and overwrites existing ones'); + + $collection->addRequirements(array('placeholder' => '\d+')); + $this->assertEquals(array('placeholder' => '\d+'), $collection->get('foo')->getRequirements(), '->addRequirements() adds requirements to all routes'); + $this->assertEquals(array('placeholder' => '\d+'), $collection->get('bar')->getRequirements(), + '->addRequirements() adds requirements to all routes and overwrites existing ones'); + + $collection->addOptions(array('option' => 'new-value')); + $this->assertEquals( + array('option' => 'new-value', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'), + $collection->get('bar')->getOptions(), '->addOptions() adds options to all routes and overwrites existing ones' + ); + } + public function testAddPrefix() { $collection = new RouteCollection(); @@ -133,30 +149,20 @@ class RouteCollectionTest extends \PHPUnit_Framework_TestCase $collection2 = new RouteCollection(); $collection2->add('bar', $bar = new Route('/bar')); $collection->addCollection($collection2); - $this->assertSame('', $collection->getPrefix(), '->getPrefix() is initialized with ""'); $collection->addPrefix(' / '); - $this->assertSame('', $collection->getPrefix(), '->addPrefix() trims the prefix and a single slash has no effect'); - $collection->addPrefix('/{admin}', array('admin' => 'admin'), array('admin' => '\d+'), array('foo' => 'bar')); + $this->assertSame('/foo', $collection->get('foo')->getPattern(), '->addPrefix() trims the prefix and a single slash has no effect'); + $collection->addPrefix('/{admin}', array('admin' => 'admin'), array('admin' => '\d+')); $this->assertEquals('/{admin}/foo', $collection->get('foo')->getPath(), '->addPrefix() adds a prefix to all routes'); $this->assertEquals('/{admin}/bar', $collection->get('bar')->getPath(), '->addPrefix() adds a prefix to all routes'); $this->assertEquals(array('admin' => 'admin'), $collection->get('foo')->getDefaults(), '->addPrefix() adds defaults to all routes'); $this->assertEquals(array('admin' => 'admin'), $collection->get('bar')->getDefaults(), '->addPrefix() adds defaults to all routes'); $this->assertEquals(array('admin' => '\d+'), $collection->get('foo')->getRequirements(), '->addPrefix() adds requirements to all routes'); $this->assertEquals(array('admin' => '\d+'), $collection->get('bar')->getRequirements(), '->addPrefix() adds requirements to all routes'); - $this->assertEquals( - array('foo' => 'bar', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'), - $collection->get('foo')->getOptions(), '->addPrefix() adds an option to all routes' - ); - $this->assertEquals( - array('foo' => 'bar', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'), - $collection->get('bar')->getOptions(), '->addPrefix() adds an option to all routes' - ); $collection->addPrefix('0'); - $this->assertEquals('/0/{admin}', $collection->getPrefix(), '->addPrefix() ensures a prefix must start with a slash and must not end with a slash'); + $this->assertEquals('/0/{admin}/foo', $collection->get('foo')->getPattern(), '->addPrefix() ensures a prefix must start with a slash and must not end with a slash'); $collection->addPrefix('/ /'); - $this->assertSame('/ /0/{admin}', $collection->getPrefix(), '->addPrefix() can handle spaces if desired'); - $this->assertSame('/ /0/{admin}/foo', $collection->get('foo')->getPath(), 'the route path is in synch with the collection prefix'); - $this->assertSame('/ /0/{admin}/bar', $collection->get('bar')->getPath(), 'the route path in a sub-collection is in synch with the collection prefix'); + $this->assertSame('/ /0/{admin}/foo', $collection->get('foo')->getPath(), '->addPrefix() can handle spaces if desired'); + $this->assertSame('/ /0/{admin}/bar', $collection->get('bar')->getPath(), 'the route pattern of an added collection is in synch with the added prefix'); } public function testAddPrefixOverridesDefaultsAndRequirements() @@ -170,19 +176,6 @@ class RouteCollectionTest extends \PHPUnit_Framework_TestCase $this->assertEquals('https', $collection->get('bar')->getRequirement('_scheme'), '->addPrefix() overrides existing requirements'); } - public function testAddCollectionOverridesDefaultsAndRequirements() - { - $imported = new RouteCollection(); - $imported->add('foo', $foo = new Route('/foo')); - $imported->add('bar', $bar = new Route('/bar', array(), array('_scheme' => 'http'))); - - $collection = new RouteCollection(); - $collection->addCollection($imported, null, array(), array('_scheme' => 'https')); - - $this->assertEquals('https', $collection->get('foo')->getRequirement('_scheme'), '->addCollection() overrides existing requirements'); - $this->assertEquals('https', $collection->get('bar')->getRequirement('_scheme'), '->addCollection() overrides existing requirements'); - } - public function testResource() { if (!class_exists('Symfony\Component\Config\Resource\FileResource')) { @@ -191,7 +184,11 @@ class RouteCollectionTest extends \PHPUnit_Framework_TestCase $collection = new RouteCollection(); $collection->addResource($foo = new FileResource(__DIR__.'/Fixtures/foo.xml')); - $this->assertEquals(array($foo), $collection->getResources(), '->addResources() adds a resource'); + $collection->addResource($bar = new FileResource(__DIR__.'/Fixtures/bar.xml')); + $collection->addResource(new FileResource(__DIR__.'/Fixtures/foo.xml')); + + $this->assertEquals(array($foo, $bar), $collection->getResources(), + '->addResource() adds a resource and getResources() only returns unique ones by comparing the string representation'); } public function testUniqueRouteWithGivenName() @@ -217,13 +214,31 @@ class RouteCollectionTest extends \PHPUnit_Framework_TestCase $collection2 = new RouteCollection(); $collection2->add('b', $b = new Route('/b')); $collection1->addCollection($collection2); + $collection1->add('$péß^a|', $c = new Route('/special')); $this->assertSame($b, $collection1->get('b'), '->get() returns correct route in child collection'); + $this->assertSame($c, $collection1->get('$péß^a|'), '->get() can handle special characters'); $this->assertNull($collection2->get('a'), '->get() does not return the route defined in parent collection'); $this->assertNull($collection1->get('non-existent'), '->get() returns null when route does not exist'); $this->assertNull($collection1->get(0), '->get() does not disclose internal child RouteCollection'); } + public function testRemove() + { + $collection = new RouteCollection(); + $collection->add('foo', $foo = new Route('/foo')); + + $collection1 = new RouteCollection(); + $collection1->add('bar', $bar = new Route('/bar')); + $collection->addCollection($collection1); + $collection->add('last', $last = new Route('/last')); + + $collection->remove('foo'); + $this->assertSame(array('bar' => $bar, 'last' => $last), $collection->all(), '->remove() can remove a single route'); + $collection->remove(array('bar', 'last')); + $this->assertSame(array(), $collection->all(), '->remove() accepts an array and can remove multiple routes at once'); + } + public function testSetHost() { $collection = new RouteCollection(); diff --git a/src/Symfony/Component/Security/Resources/translations/security.fa.xlf b/src/Symfony/Component/Security/Resources/translations/security.fa.xlf index 0824221e0a..0b76290780 100644 --- a/src/Symfony/Component/Security/Resources/translations/security.fa.xlf +++ b/src/Symfony/Component/Security/Resources/translations/security.fa.xlf @@ -20,7 +20,7 @@ Cookie has already been used by someone else. - کوکی قبلا برای شخص دیگری استفاده شده است. + کوکی قبلا برای شخص دیگری استفاده شده است. Not privileged to request the resource. diff --git a/src/Symfony/Component/Validator/Validator.php b/src/Symfony/Component/Validator/Validator.php index 8221d60266..202e1e2f10 100644 --- a/src/Symfony/Component/Validator/Validator.php +++ b/src/Symfony/Component/Validator/Validator.php @@ -52,7 +52,7 @@ class Validator implements ValidatorInterface MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, TranslatorInterface $translator, - $translationDomain = null, + $translationDomain = 'validators', array $objectInitializers = array() ) { diff --git a/src/Symfony/Component/Yaml/Inline.php b/src/Symfony/Component/Yaml/Inline.php index 21a121a060..45978a1255 100644 --- a/src/Symfony/Component/Yaml/Inline.php +++ b/src/Symfony/Component/Yaml/Inline.php @@ -237,11 +237,6 @@ class Inline */ private static function parseQuotedScalar($scalar, &$i) { - // Only check the current item we're dealing with (for sequences) - $subject = substr($scalar, $i); - $items = preg_split('/[\'"]\s*(?:[,:]|[}\]]\s*,)/', $subject); - $subject = substr($subject, 0, strlen($items[0]) + 1); - if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) { throw new ParseException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i))); }