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)));
}