From af496eaef020be1eb9cd436d5bff8541962620aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Fri, 9 Jan 2015 11:43:02 +0100 Subject: [PATCH 1/6] [FrameworkBundle] FormDataCollector should be loaded only if form config is enabled --- .../FrameworkBundle/Resources/config/collectors.xml | 10 ---------- .../FrameworkBundle/Resources/config/form_debug.xml | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/collectors.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/collectors.xml index def9aea920..1f4bf0392e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/collectors.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/collectors.xml @@ -13,8 +13,6 @@ Symfony\Component\HttpKernel\DataCollector\TimeDataCollector Symfony\Component\HttpKernel\DataCollector\MemoryDataCollector Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector - Symfony\Component\Form\Extension\DataCollector\FormDataCollector - Symfony\Component\Form\Extension\DataCollector\FormDataExtractor @@ -57,13 +55,5 @@ - - - - - - - - diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/form_debug.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/form_debug.xml index 5d4faac4ac..1e8e3c8983 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/form_debug.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/form_debug.xml @@ -7,6 +7,8 @@ Symfony\Component\Form\Extension\DataCollector\Proxy\ResolvedTypeFactoryDataCollectorProxy Symfony\Component\Form\Extension\DataCollector\Type\DataCollectorTypeExtension + Symfony\Component\Form\Extension\DataCollector\FormDataCollector + Symfony\Component\Form\Extension\DataCollector\FormDataExtractor @@ -22,5 +24,13 @@ + + + + + + + + From cd4349df508a66c9d5f51aac7397fa1f39008d11 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Fri, 16 Jan 2015 15:59:09 +0100 Subject: [PATCH 2/6] execute cheaper checks before more expensive ones --- src/Symfony/Component/Yaml/Escaper.php | 12 ++++++------ src/Symfony/Component/Yaml/Inline.php | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/Yaml/Escaper.php b/src/Symfony/Component/Yaml/Escaper.php index 2820778fea..f4987652aa 100644 --- a/src/Symfony/Component/Yaml/Escaper.php +++ b/src/Symfony/Component/Yaml/Escaper.php @@ -72,15 +72,15 @@ class Escaper */ public static function requiresSingleQuoting($value) { - // Determines if the PHP value contains any single characters that would - // cause it to require single quoting in YAML. - if (preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value)) { + // Determines if a PHP value is entirely composed of a value that would + // require single quoting in YAML. + if (in_array(strtolower($value), array('null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'))) { return true; } - // Determines if a PHP value is entirely composed of a value that would - // require single quoting in YAML. - return in_array(strtolower($value), array('null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off')); + // Determines if the PHP value contains any single characters that would + // cause it to require single quoting in YAML. + return preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value); } /** diff --git a/src/Symfony/Component/Yaml/Inline.php b/src/Symfony/Component/Yaml/Inline.php index 1bdcf87623..3aa248b2f4 100644 --- a/src/Symfony/Component/Yaml/Inline.php +++ b/src/Symfony/Component/Yaml/Inline.php @@ -132,13 +132,13 @@ class Inline } return $repr; + case '' == $value: + return "''"; case Escaper::requiresDoubleQuoting($value): return Escaper::escapeWithDoubleQuotes($value); case Escaper::requiresSingleQuoting($value): case preg_match(self::getTimestampRegex(), $value): return Escaper::escapeWithSingleQuotes($value); - case '' == $value: - return "''"; default: return $value; } From afa1e2079d5531d8be82fd7f44a62bd3f5b13f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Baptiste=20Clavi=C3=A9?= Date: Thu, 8 Jan 2015 15:00:11 +0100 Subject: [PATCH 3/6] Fixes ArgvInput's argument getter with empty tokens If an empty token is provided (from automated tools, or on purpose when running a command), the argument getter was not checking the other tokens, as '' == false in php, which is the stop condition of the while loop in this method. This method should now rely on the count of tokens rather than the value of the return of array_shift --- src/Symfony/Component/Console/Input/ArgvInput.php | 6 ++++-- src/Symfony/Component/Console/Tests/Input/ArgvInputTest.php | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Console/Input/ArgvInput.php b/src/Symfony/Component/Console/Input/ArgvInput.php index 7234f75608..f5cc5d136b 100644 --- a/src/Symfony/Component/Console/Input/ArgvInput.php +++ b/src/Symfony/Component/Console/Input/ArgvInput.php @@ -309,9 +309,11 @@ class ArgvInput extends Input public function getParameterOption($values, $default = false) { $values = (array) $values; - $tokens = $this->tokens; - while ($token = array_shift($tokens)) { + + while (0 < count($tokens)) { + $token = array_shift($tokens); + foreach ($values as $value) { if ($token === $value || 0 === strpos($token, $value.'=')) { if (false !== $pos = strpos($token, '=')) { diff --git a/src/Symfony/Component/Console/Tests/Input/ArgvInputTest.php b/src/Symfony/Component/Console/Tests/Input/ArgvInputTest.php index 451b108179..bdbe3543b8 100644 --- a/src/Symfony/Component/Console/Tests/Input/ArgvInputTest.php +++ b/src/Symfony/Component/Console/Tests/Input/ArgvInputTest.php @@ -304,6 +304,7 @@ class ArgvInputTest extends \PHPUnit_Framework_TestCase array(array('app/console', 'foo:bar', '-e', 'dev'), array('-e', '--env'), 'dev'), array(array('app/console', 'foo:bar', '--env=dev'), array('-e', '--env'), 'dev'), array(array('app/console', 'foo:bar', '--env=dev', '--en=1'), array('--en'), '1'), + array(array('app/console', 'foo:bar', '--env=dev', '', '--en=1'), array('--en'), '1'), ); } From 414583607c672b91c34061205218851100cc7434 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 16 Jan 2015 16:35:16 +0100 Subject: [PATCH 4/6] [Form] Improved exception message if the data class is not found --- src/Symfony/Component/Form/FormConfigBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Form/FormConfigBuilder.php b/src/Symfony/Component/Form/FormConfigBuilder.php index 1d70a49644..d8ebed7403 100644 --- a/src/Symfony/Component/Form/FormConfigBuilder.php +++ b/src/Symfony/Component/Form/FormConfigBuilder.php @@ -193,7 +193,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface self::validateName($name); if (null !== $dataClass && !class_exists($dataClass)) { - throw new InvalidArgumentException(sprintf('The data class "%s" is not a valid class.', $dataClass)); + throw new InvalidArgumentException(sprintf('Class "%s" not found. Is the "data_class" form option set correctly?', $dataClass)); } $this->name = (string) $name; From 02bc23a7359bd60b799823aa6cb6dea79e7ba3b2 Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Wed, 7 Jan 2015 12:58:10 +0000 Subject: [PATCH 5/6] [Twig][Bridge][TranslationDefaultDomain] add support of named arguments. --- .../TranslationDefaultDomainNodeVisitor.php | 30 +++++++++++++--- .../Extension/TranslationExtensionTest.php | 34 +++++++++++++++++++ ...ranslationDefaultDomainNodeVisitorTest.php | 7 ++++ .../Tests/NodeVisitor/TwigNodeProvider.php | 26 ++++++++------ 4 files changed, 81 insertions(+), 16 deletions(-) diff --git a/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php b/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php index 8e7e7f48e3..841eb0dca2 100644 --- a/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php +++ b/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php @@ -62,14 +62,20 @@ class TranslationDefaultDomainNodeVisitor implements \Twig_NodeVisitorInterface } if ($node instanceof \Twig_Node_Expression_Filter && in_array($node->getNode('filter')->getAttribute('value'), array('trans', 'transchoice'))) { - $ind = 'trans' === $node->getNode('filter')->getAttribute('value') ? 1 : 2; $arguments = $node->getNode('arguments'); - if (!$arguments->hasNode($ind)) { - if (!$arguments->hasNode($ind - 1)) { - $arguments->setNode($ind - 1, new \Twig_Node_Expression_Array(array(), $node->getLine())); + $ind = 'trans' === $node->getNode('filter')->getAttribute('value') ? 1 : 2; + if ($this->isNamedArguments($arguments)) { + if (!$arguments->hasNode('domain') && !$arguments->hasNode($ind)) { + $arguments->setNode('domain', $this->scope->get('domain')); } + } else { + if (!$arguments->hasNode($ind)) { + if (!$arguments->hasNode($ind - 1)) { + $arguments->setNode($ind - 1, new \Twig_Node_Expression_Array(array(), $node->getLine())); + } - $arguments->setNode($ind, $this->scope->get('domain')); + $arguments->setNode($ind, $this->scope->get('domain')); + } } } elseif ($node instanceof TransNode) { if (null === $node->getNode('domain')) { @@ -103,4 +109,18 @@ class TranslationDefaultDomainNodeVisitor implements \Twig_NodeVisitorInterface { return -10; } + + /** + * @return bool + */ + private function isNamedArguments($arguments) + { + foreach ($arguments as $name => $node) { + if (!is_int($name)) { + return true; + } + } + + return false; + } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php index 8bd2838899..979301d466 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php @@ -148,6 +148,40 @@ class TranslationExtensionTest extends TestCase $this->assertEquals('foo (foo)foo (custom)foo (foo)foo (custom)foo (foo)foo (custom)', trim($template->render(array()))); } + public function testDefaultTranslationDomainWithNamedArguments() + { + $templates = array( + 'index' => ' + {%- trans_default_domain "foo" %} + + {%- block content %} + {{- "foo"|trans(arguments = {}, domain = "custom") }} + {{- "foo"|transchoice(count = 1) }} + {{- "foo"|transchoice(count = 1, arguments = {}, domain = "custom") }} + {{- "foo"|trans({}, domain = "custom") }} + {{- "foo"|trans({}, "custom", locale = "fr") }} + {{- "foo"|transchoice(1, arguments = {}, domain = "custom") }} + {{- "foo"|transchoice(1, {}, "custom", locale = "fr") }} + {% endblock %} + ', + + 'base' => ' + {%- block content "" %} + ', + ); + + $translator = new Translator('en', new MessageSelector()); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', array('foo' => 'foo (messages)'), 'en'); + $translator->addResource('array', array('foo' => 'foo (custom)'), 'en', 'custom'); + $translator->addResource('array', array('foo' => 'foo (foo)'), 'en', 'foo'); + $translator->addResource('array', array('foo' => 'foo (fr)'), 'fr', 'custom'); + + $template = $this->getTemplate($templates, $translator); + + $this->assertEquals('foo (custom)foo (foo)foo (custom)foo (custom)foo (fr)foo (custom)foo (fr)', trim($template->render(array()))); + } + protected function getTemplate($template, $translator = null) { if (null === $translator) { diff --git a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php index 24a6215e67..5e69c0939b 100644 --- a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php +++ b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php @@ -78,6 +78,13 @@ class TranslationDefaultDomainNodeVisitorTest extends TestCase array(TwigNodeProvider::getTransFilter(self::$message)), array(TwigNodeProvider::getTransChoiceFilter(self::$message)), array(TwigNodeProvider::getTransTag(self::$message)), + // with named arguments + array(TwigNodeProvider::getTransFilter(self::$message, null, array( + 'arguments' => new \Twig_Node_Expression_Array(array(), 0), + ))), + array(TwigNodeProvider::getTransChoiceFilter(self::$message), null, array( + 'arguments' => new \Twig_Node_Expression_Array(array(), 0), + )), ); } } diff --git a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php index 277e777483..0e401f62ea 100644 --- a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php +++ b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php @@ -29,12 +29,14 @@ class TwigNodeProvider ); } - public static function getTransFilter($message, $domain = null) + public static function getTransFilter($message, $domain = null, $arguments = null) { - $arguments = $domain ? array( - new \Twig_Node_Expression_Array(array(), 0), - new \Twig_Node_Expression_Constant($domain, 0), - ) : array(); + if (!$arguments) { + $arguments = $domain ? array( + new \Twig_Node_Expression_Array(array(), 0), + new \Twig_Node_Expression_Constant($domain, 0), + ) : array(); + } return new \Twig_Node_Expression_Filter( new \Twig_Node_Expression_Constant($message, 0), @@ -44,13 +46,15 @@ class TwigNodeProvider ); } - public static function getTransChoiceFilter($message, $domain = null) + public static function getTransChoiceFilter($message, $domain = null, $arguments = null) { - $arguments = $domain ? array( - new \Twig_Node_Expression_Constant(0, 0), - new \Twig_Node_Expression_Array(array(), 0), - new \Twig_Node_Expression_Constant($domain, 0), - ) : array(); + if (!$arguments) { + $arguments = $domain ? array( + new \Twig_Node_Expression_Constant(0, 0), + new \Twig_Node_Expression_Array(array(), 0), + new \Twig_Node_Expression_Constant($domain, 0), + ) : array(); + } return new \Twig_Node_Expression_Filter( new \Twig_Node_Expression_Constant($message, 0), From 3a3ecd3353a35b3d153baddb9c909fc73dc18d17 Mon Sep 17 00:00:00 2001 From: rkerner Date: Fri, 19 Dec 2014 16:45:58 +0100 Subject: [PATCH 6/6] [HttpFoundation] [Request] fix baseUrl parsing to fix wrong path_info --- .../Component/HttpFoundation/Request.php | 2 +- .../HttpFoundation/Tests/RequestTest.php | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php index 5cfb7a4866..51e8f96c22 100644 --- a/src/Symfony/Component/HttpFoundation/Request.php +++ b/src/Symfony/Component/HttpFoundation/Request.php @@ -1693,7 +1693,7 @@ class Request return $prefix; } - if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, dirname($baseUrl))) { + if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, dirname($baseUrl).'/')) { // directory portion of $baseUrl matches return rtrim($prefix, '/'); } diff --git a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php index 1c93bbfee9..109a267fd8 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php @@ -223,6 +223,21 @@ class RequestTest extends \PHPUnit_Framework_TestCase $request = Request::create('http://test.com/?foo'); $this->assertEquals('/?foo', $request->getRequestUri()); $this->assertEquals(array('foo' => ''), $request->query->all()); + + ## assume rewrite rule: (.*) --> app/app.php ; app/ is a symlink to a symfony web/ directory + $request = Request::create('http://test.com/apparthotel-1234', 'GET', array(), array(), array(), + array( + 'DOCUMENT_ROOT' => '/var/www/www.test.com', + 'SCRIPT_FILENAME' => '/var/www/www.test.com/app/app.php', + 'SCRIPT_NAME' => '/app/app.php', + 'PHP_SELF' => '/app/app.php/apparthotel-1234', + )); + $this->assertEquals('http://test.com/apparthotel-1234', $request->getUri()); + $this->assertEquals('/apparthotel-1234', $request->getPathInfo()); + $this->assertEquals('', $request->getQueryString()); + $this->assertEquals(80, $request->getPort()); + $this->assertEquals('test.com', $request->getHttpHost()); + $this->assertFalse($request->isSecure()); } /** @@ -1299,7 +1314,7 @@ class RequestTest extends \PHPUnit_Framework_TestCase { return array( array( - '/foo%20bar', + '/foo%20bar/', array( 'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo bar/app.php', 'SCRIPT_NAME' => '/foo bar/app.php',