diff --git a/CHANGELOG-3.2.md b/CHANGELOG-3.2.md
index 2d191a0eadb05..9647bde2fc96c 100644
--- a/CHANGELOG-3.2.md
+++ b/CHANGELOG-3.2.md
@@ -7,6 +7,26 @@ in 3.2 minor versions.
To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash
To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v3.2.0...v3.2.1
+* 3.2.4 (2017-02-16)
+
+ * bug #21634 [VarDumper] Added missing persistent stream cast (lyrixx)
+ * bug #21436 [DependencyInjection] check for circular refs caused by method calls (xabbuh)
+ * bug #21400 [Serializer] fix upper camel case conversion (see #21399) (markusu49)
+ * bug #21599 [Console][Table] fixed render when using multiple rowspans. (aitboudad)
+ * bug #21613 [Process] Permit empty suffix on Windows (Bilge)
+ * bug #21057 [DI] Auto register extension configuration classes as a resource (ro0NL)
+ * bug #21607 Improve tracking of environment variables in the case of private services (tgalopin)
+ * bug #21592 [Validator] property constraints can be added in child classes (angelk, xabbuh)
+ * bug #21458 [Config] Early return for DirectoryResource (robfrawley)
+ * bug #21562 [DoctrineBridge] make sure that null can be the invalid value (xabbuh)
+ * bug #21556 [FrameworkBundle] Wire ArrayCache for annotation reader at bootstrap (nicolas-grekas)
+ * bug #21584 [WebProfilerBundle] Readd Symfony version status in the toolbar (wouterj)
+ * bug #21557 [VarDumper] Improve dump of AMQP* Object (lyrixx)
+ * bug #21579 [Security] LdapUserProvider should not throw an exception if the UID key does not exist in an LDAP entry (csarrazi)
+ * bug #21552 [FrameworkBundle] Fix annotations cache folder path (akeeman)
+ * bug #21542 [VarDumper] Fixed dumping of terminated generator (lyrixx)
+ * bug #21292 Ignore missing 'debug.file_link_formatter' service in Debug bundle (core23)
+
* 3.2.3 (2017-02-06)
* bug #21528 [Cache] Fix class exists checks in PhpArrayAdapter (nicolas-grekas)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index f740b56abf6f9..13d68464846b0 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -15,8 +15,8 @@ Symfony is the result of the work of many people who made the code better
- Johannes S (johannes)
- Kris Wallsmith (kriswallsmith)
- Jakub Zalas (jakubzalas)
- - Ryan Weaver (weaverryan)
- Kévin Dunglas (dunglas)
+ - Ryan Weaver (weaverryan)
- Javier Eguiluz (javier.eguiluz)
- Hugo Hamon (hhamon)
- Abdellatif Ait boudad (aitboudad)
@@ -26,16 +26,16 @@ Symfony is the result of the work of many people who made the code better
- Joseph Bielawski (stloyd)
- Karma Dordrak (drak)
- Lukas Kahwe Smith (lsmith)
- - Martin Hasoň (hason)
- Grégoire Pineau (lyrixx)
+ - Martin Hasoň (hason)
- Jeremy Mikola (jmikola)
- Jean-François Simon (jfsimon)
- Benjamin Eberlei (beberlei)
- Igor Wiedler (igorw)
- - Eriksen Costa (eriksencosta)
- Maxime Steinhausser (ogizanagi)
- - Jules Pietri (heah)
+ - Eriksen Costa (eriksencosta)
- Robin Chalas (chalas_r)
+ - Jules Pietri (heah)
- Sarah Khalil (saro0h)
- Jonathan Wage (jwage)
- Diego Saint Esteben (dosten)
@@ -46,14 +46,14 @@ Symfony is the result of the work of many people who made the code better
- stealth35 (stealth35)
- Alexander Mols (asm89)
- Bulat Shakirzyanov (avalanche123)
+ - Ener-Getick (energetick)
- Saša Stamenković (umpirsky)
- Henrik Bjørnskov (henrikbjorn)
- Miha Vrhovnik
- - Ener-Getick (energetick)
+ - Roland Franssen (ro0)
- Diego Saint Esteben (dii3g0)
- Konstantin Kudryashov (everzet)
- Iltar van der Berg (kjarli)
- - Roland Franssen (ro0)
- Bilal Amarni (bamarni)
- Florin Patan (florinpatan)
- Peter Rehm (rpet)
@@ -69,15 +69,15 @@ Symfony is the result of the work of many people who made the code better
- Deni
- Henrik Westphal (snc)
- Dariusz Górecki (canni)
- - Douglas Greenshields (shieldo)
- Titouan Galopin (tgalopin)
+ - Douglas Greenshields (shieldo)
+ - Pierre du Plessis (pierredup)
- Konstantin Myakshin (koc)
- Lee McDermott
- Brandon Turner
- Luis Cordova (cordoval)
- Graham Campbell (graham)
- Daniel Holmes (dholmes)
- - Pierre du Plessis (pierredup)
- Toni Uebernickel (havvg)
- Bart van den Burg (burgov)
- Jordan Alliot (jalliot)
@@ -102,18 +102,19 @@ Symfony is the result of the work of many people who made the code better
- Alexander Schwenn (xelaris)
- Florian Voutzinos (florianv)
- Colin Frei
+ - Jérémy DERUSSÉ (jderusse)
- Adrien Brault (adrienbrault)
- Joshua Thijssen
- Peter Kokot (maastermedia)
- excelwebzone
- Jacob Dreesen (jdreesen)
- - Jérémy DERUSSÉ (jderusse)
- Vladimir Reznichenko (kalessil)
- Tomáš Votruba (tomas_votruba)
+ - David Buchmann (dbu)
- Fabien Pennequin (fabienpennequin)
- Gordon Franke (gimler)
+ - Tobias Nyholm (tobias)
- Eric GELOEN (gelo)
- - David Buchmann (dbu)
- Tugdual Saunier (tucksaun)
- Théo FIDRY (theofidry)
- Robert Schönthal (digitalkaoz)
@@ -121,20 +122,20 @@ Symfony is the result of the work of many people who made the code better
- Stefano Sala (stefano.sala)
- Evgeniy (ewgraf)
- Juti Noppornpitak (shiroyuki)
- - Tobias Nyholm (tobias)
- Tigran Azatyan (tigranazatyan)
- Sebastian Hörl (blogsh)
- Daniel Gomes (danielcsgomes)
- Hidenori Goto (hidenorigoto)
- Sebastiaan Stok (sstok)
+ - Yonel Ceruto González (yonelceruto)
- Guilherme Blanco (guilhermeblanco)
- Pablo Godel (pgodel)
- Jérémie Augustin (jaugustin)
- Andréia Bohner (andreia)
- - Yonel Ceruto González (yonelceruto)
- Rafael Dohms (rdohms)
- Arnaud Kleinpeter (nanocom)
- jwdeitch
+ - Mikael Pajunen
- Joel Wurtz (brouznouf)
- Philipp Wahala (hifi)
- Vyacheslav Pavlov
@@ -144,7 +145,6 @@ Symfony is the result of the work of many people who made the code better
- Vincent AUBERT (vincent)
- Rouven Weßling (realityking)
- Teoh Han Hui (teohhanhui)
- - Mikael Pajunen
- Clemens Tolboom
- Helmer Aaviksoo
- Hiromi Hishida (77web)
@@ -165,6 +165,7 @@ Symfony is the result of the work of many people who made the code better
- Mario A. Alvarez Garcia (nomack84)
- Dennis Benkert (denderello)
- Benjamin Dulau (dbenjamin)
+ - James Halsall (jaitsu)
- Mathieu Lemoine (lemoinem)
- Andreas Hucks (meandmymonkey)
- Noel Guilbert (noel)
@@ -194,10 +195,12 @@ Symfony is the result of the work of many people who made the code better
- Sven Paulus (subsven)
- Rui Marinho (ruimarinho)
- Daniel Espendiller
+ - SpacePossum
- Dawid Nowak
- Eugene Wissner
- Julien Brochet (mewt)
- Tristan Darricau (nicofuma)
+ - Grégoire Paris (greg0ire)
- Sergey Linnik (linniksa)
- Michaël Perrin (michael.perrin)
- Marcel Beerta (mazen)
@@ -215,6 +218,7 @@ Symfony is the result of the work of many people who made the code better
- Manuel Reinhard (sprain)
- Danny Berger (dpb587)
- Jérôme Vasseur
+ - Adam Prager (padam87)
- Roman Marintšenko (inori)
- Christian Schmidt
- Xavier Montaña Carreras (xmontana)
@@ -223,13 +227,12 @@ Symfony is the result of the work of many people who made the code better
- Arjen Brouwer (arjenjb)
- Katsuhiro OGAWA
- Patrick McDougle (patrick-mcdougle)
- - James Halsall (jaitsu)
- Alif Rachmawadi
- Kristen Gilden (kgilden)
- - SpacePossum
- Pierre-Yves LEBECQ (pylebecq)
- Alex Pott
- Jakub Kucharovic (jkucharovic)
+ - Uwe Jäger (uwej711)
- Eugene Leonovich (rybakit)
- Filippo Tessarotto
- Joseph Rouff (rouffj)
@@ -237,7 +240,6 @@ Symfony is the result of the work of many people who made the code better
- GordonsLondon
- Jan Sorgalla (jsor)
- Ray
- - Grégoire Paris (greg0ire)
- Leo Feyer
- Chekote
- Thomas Adam
@@ -245,6 +247,7 @@ Symfony is the result of the work of many people who made the code better
- Jhonny Lidfors (jhonne)
- Diego Agulló (aeoris)
- jdhoek
+ - Pavel Batanov (scaytrase)
- Nikita Konstantinov
- Wodor Wodorski
- Thomas Lallement (raziel057)
@@ -277,7 +280,7 @@ Symfony is the result of the work of many people who made the code better
- Andrey Esaulov (andremaha)
- Grégoire Passault (gregwar)
- Ismael Ambrosi (iambrosi)
- - Uwe Jäger (uwej711)
+ - Baptiste Lafontaine
- Aurelijus Valeiša (aurelijus)
- Victor Bocharsky (bocharsky_bw)
- Jan Decavele (jandc)
@@ -286,7 +289,6 @@ Symfony is the result of the work of many people who made the code better
- Tiago Ribeiro (fixe)
- Hidde Boomsma (hboomsma)
- John Bafford (jbafford)
- - Pavel Batanov (scaytrase)
- Bob den Otter (bopp)
- Adrian Rudnik (kreischweide)
- Francesc Rosàs (frosas)
@@ -307,11 +309,12 @@ Symfony is the result of the work of many people who made the code better
- Matthew Lewinski (lewinski)
- Magnus Nordlander (magnusnordlander)
- alquerci
- - Adam Prager (padam87)
- Francesco Levorato
+ - Rob Frawley 2nd (robfrawley)
- Vitaliy Zakharov (zakharovvi)
- Tobias Sjösten (tobiassjosten)
- Gyula Sallai (salla)
+ - David Maicher (dmaicher)
- Inal DJAFAR (inalgnu)
- Christian Gärtner (dagardner)
- Tomasz Kowalczyk (thunderer)
@@ -347,7 +350,7 @@ Symfony is the result of the work of many people who made the code better
- Tobias Naumann (tna)
- Daniel Beyer
- Shein Alexey
- - Baptiste Lafontaine
+ - Romain Gautier (mykiwi)
- Joe Lencioni
- Daniel Tschinder
- Kai
@@ -386,6 +389,8 @@ Symfony is the result of the work of many people who made the code better
- Mihai Stancu
- Olivier Dolbeau (odolbeau)
- Jan Rosier (rosier)
+ - Thomas Royer (cydonia7)
+ - Josip Kruslin
- vagrant
- EdgarPE
- Florian Pfitzer (marmelatze)
@@ -397,9 +402,9 @@ Symfony is the result of the work of many people who made the code better
- Ariel Ferrandini (aferrandini)
- Dirk Pahl (dirkaholic)
- cedric lombardot (cedriclombardot)
- - David Maicher (dmaicher)
- Jonas Flodén (flojon)
- Christian Schmidt
+ - Amrouche Hamza
- Marcin Sikoń (marphi)
- Dominik Zogg (dominik.zogg)
- Marek Pietrzak
@@ -417,6 +422,7 @@ Symfony is the result of the work of many people who made the code better
- Fabrice Bernhard (fabriceb)
- Jérôme Macias (jeromemacias)
- Andrey Astakhov (aast)
+ - Thomas Calvet
- Fabian Lange (codingfabian)
- Frank Neff (fneff)
- Roman Lapin (memphys)
@@ -437,6 +443,7 @@ Symfony is the result of the work of many people who made the code better
- Roy Van Ginneken (rvanginneken)
- ondrowan
- Barry vd. Heuvel (barryvdh)
+ - Wouter J
- Evan S Kaufman (evanskaufman)
- mcben
- Jérôme Vieilledent (lolautruche)
@@ -451,7 +458,9 @@ Symfony is the result of the work of many people who made the code better
- Jakub Škvára (jskvara)
- Andrew Udvare (audvare)
- alexpods
+ - Arjen van der Meijden
- Michele Locati
+ - Dariusz Ruminski
- Erik Trapman (eriktrapman)
- De Cock Xavier (xdecock)
- Almog Baku (almogbaku)
@@ -494,6 +503,7 @@ Symfony is the result of the work of many people who made the code better
- Benjamin Laugueux (yzalis)
- Zach Badgett (zachbadgett)
- Aurélien Fredouelle
+ - Jérôme Parmentier (lctrs)
- Pavel Campr (pcampr)
- Johnny Robeson (johnny)
- Disquedur
@@ -517,12 +527,11 @@ Symfony is the result of the work of many people who made the code better
- Konstantin S. M. Möllers (ksmmoellers)
- Sinan Eldem
- Alexandre Dupuy (satchette)
- - Rob Frawley 2nd
+ - Andre Rømcke (andrerom)
- Nahuel Cuesta (ncuesta)
- Chris Boden (cboden)
- Asmir Mustafic (goetas)
- Stefan Gehrig (sgehrig)
- - Josip Kruslin
- Hany el-Kerdany
- Wang Jingyu
- Åsmund Garfors
@@ -551,11 +560,14 @@ Symfony is the result of the work of many people who made the code better
- maxime.steinhausser
- Stefan Warman
- Tristan Maindron (tmaindron)
+ - Wesley Lancel
- Ke WANG (yktd26)
- Strate
- Miquel Rodríguez Telep (mrtorrent)
- Sergey Kolodyazhnyy (skolodyazhnyy)
- umpirski
+ - Denis Brumann (dbrumann)
+ - Quentin de Longraye (quentinus95)
- Chris Heng (gigablah)
- Ulumuddin Yunus (joenoez)
- Luc Vieillescazes (iamluc)
@@ -580,6 +592,7 @@ Symfony is the result of the work of many people who made the code better
- Disparity
- origaminal
- Matteo Beccati (matteobeccati)
+ - Kevin (oxfouzer)
- Paweł Wacławczyk (pwc)
- Oleg Zinchenko (cystbear)
- Johannes Klauss (cloppy)
@@ -592,7 +605,6 @@ Symfony is the result of the work of many people who made the code better
- develop
- ReenExe
- Mark Sonnabaum
- - Thomas Royer (cydonia7)
- Richard Quadling
- jochenvdv
- Arturas Smorgun (asarturas)
@@ -608,7 +620,6 @@ Symfony is the result of the work of many people who made the code better
- Martin Hujer (martinhujer)
- Pascal Helfenstein
- Baldur Rensch (brensch)
- - Thomas Calvet
- Vladyslav Petrovych
- Alex Xandra Albert Sim
- Carson Full
@@ -636,9 +647,7 @@ Symfony is the result of the work of many people who made the code better
- Marc Morera (mmoreram)
- Andrew Hilobok (hilobok)
- Christian Soronellas (theunic)
- - Romain Gautier (mykiwi)
- Yosmany Garcia (yosmanyga)
- - Wouter J
- Wouter de Wild
- Miroslav Sustek
- Degory Valentine
@@ -673,10 +682,10 @@ Symfony is the result of the work of many people who made the code better
- Pierre Vanliefland (pvanliefland)
- Sofiane HADDAG (sofhad)
- frost-nzcr4
- - Arjen van der Meijden
- Abhoryo
- Fabian Vogler (fabian)
- Korvin Szanto
+ - Arjan Keeman
- Alaattin Kahramanlar (alaattin)
- Sergey Zolotov (enleur)
- Maksim Kotlyar (makasim)
@@ -718,7 +727,6 @@ Symfony is the result of the work of many people who made the code better
- Simone Di Maulo (toretto460)
- Christian Morgan
- Alexander Miehe (engerim)
- - Jérôme Parmentier (lctrs)
- Morgan Auchede (mauchede)
- Don Pinkster
- Maksim Muruev
@@ -779,8 +787,8 @@ Symfony is the result of the work of many people who made the code better
- Pieter
- Michael Tibben
- Sander Marechal
- - Andre Rømcke (andrerom)
- Radosław Benkel
+ - jean pasqualini (darkilliant)
- ttomor
- Mei Gwilym (meigwilym)
- Michael H. Arieli (excelwebzone)
@@ -790,12 +798,12 @@ Symfony is the result of the work of many people who made the code better
- Sander Coolen (scoolen)
- Nicolas Le Goff (nlegoff)
- Ben Oman
+ - Andreas Kleemann
- Manuele Menozzi
- Anton Babenko (antonbabenko)
- Irmantas Šiupšinskas (irmantas)
- Danilo Silva
- Zachary Tong (polyfractal)
- - Amrouche Hamza
- Hryhorii Hrebiniuk
- Dennis Fridrich (dfridrich)
- mcfedr (mcfedr)
@@ -809,6 +817,7 @@ Symfony is the result of the work of many people who made the code better
- boite
- MGDSoft
- Vadim Tyukov (vatson)
+ - David Wolter (davewww)
- Sortex
- chispita
- Wojciech Sznapka
@@ -817,6 +826,7 @@ Symfony is the result of the work of many people who made the code better
- Máximo Cuadros (mcuadros)
- tamirvs
- julien.galenski
+ - Bob van de Vijver
- Christian Neff
- Per Sandström (per)
- Goran Juric
@@ -824,7 +834,7 @@ Symfony is the result of the work of many people who made the code better
- Nicolas Macherey
- Lin Clark
- Jeremy David (jeremy.david)
- - Denis Brumann (dbrumann)
+ - Robin Lehrmann (robinlehrmann)
- Troy McCabe
- Ville Mattila
- ilyes kooli
@@ -837,6 +847,7 @@ Symfony is the result of the work of many people who made the code better
- Sergey Novikov (s12v)
- Marcos Quesada (marcos_quesada)
- Matthew Vickery (mattvick)
+ - Angel Koilov (po_taka)
- Dan Finnie
- Ken Marfilla (marfillaster)
- benatespina (benatespina)
@@ -934,6 +945,7 @@ Symfony is the result of the work of many people who made the code better
- Alberto Aldegheri
- heccjj
- Alexandre Melard
+ - Jay Klehr
- Sergey Yuferev
- Tobias Stöckler
- Mario Young
@@ -946,6 +958,7 @@ Symfony is the result of the work of many people who made the code better
- Xavier Coureau
- ConneXNL
- Aharon Perkel
+ - matze
- Abdul.Mohsen B. A. A
- Benoît Burnichon
- pthompson
@@ -1024,7 +1037,6 @@ Symfony is the result of the work of many people who made the code better
- Ahmed TAILOULOUTE (ahmedtai)
- Maxime Veber (nek-)
- Sullivan SENECHAL
- - Dariusz Ruminski
- Tadcka
- Beth Binkovitz
- Romain Geissler
@@ -1046,6 +1058,7 @@ Symfony is the result of the work of many people who made the code better
- Rafał Muszyński (rafmus90)
- Timothy Anido (xanido)
- Rick Prent
+ - skalpa
- Martin Eckhardt
- Pieter Jordaan
- Damien Tournoud
@@ -1094,7 +1107,6 @@ Symfony is the result of the work of many people who made the code better
- Mephistofeles
- Hoffmann András
- Olivier
- - Wesley Lancel
- pscheit
- Zdeněk Drahoš
- Dan Harper
@@ -1129,6 +1141,7 @@ Symfony is the result of the work of many people who made the code better
- Povilas S. (povilas)
- pborreli
- Eric Caron
+ - Richard Bradley
- 2manypeople
- Wing
- Thomas Bibb
@@ -1187,6 +1200,7 @@ Symfony is the result of the work of many people who made the code better
- Andy Stanberry
- Luiz “Felds” Liscia
- Thomas Rothe
+ - nietonfir
- alefranz
- avi123
- alsar
@@ -1232,6 +1246,7 @@ Symfony is the result of the work of many people who made the code better
- Yannick Warnier (ywarnier)
- Kevin Decherf
- Jason Woods
+ - klemens
- dened
- Dmitry Korotovsky
- Michael van Tricht
@@ -1247,6 +1262,7 @@ Symfony is the result of the work of many people who made the code better
- Andrey Chernykh
- Edvinas Klovas
- Drew Butler
+ - Peter Breuls
- Tischoi
- J Bruni
- Alexey Prilipko
@@ -1312,6 +1328,7 @@ Symfony is the result of the work of many people who made the code better
- Alan Chen
- Maerlyn
- Even André Fiskvik
+ - Arjan Keeman
- Erik van Wingerden
- Dane Powell
- Gerrit Drost
@@ -1359,6 +1376,7 @@ Symfony is the result of the work of many people who made the code better
- Marcin Szepczynski (szepczynski)
- Cyrille Jouineau (tuxosaurus)
- Yorkie Chadwick (yorkie76)
+ - GuillaumeVerdon
- Yanick Witschi
- Ondrej Mirtes
- akimsko
@@ -1513,6 +1531,7 @@ Symfony is the result of the work of many people who made the code better
- Choong Wei Tjeng (choonge)
- Kousuke Ebihara (co3k)
- Loïc Vernet (coil)
+ - Christian Gripp (core23)
- Christoph Schaefer (cvschaefer)
- Damon Jones (damon__jones)
- Łukasz Giza (destroyer)
@@ -1594,6 +1613,7 @@ Symfony is the result of the work of many people who made the code better
- simpson
- drublic
- Andreas Streichardt
+ - Pascal Hofmann
- smokeybear87
- Gustavo Adrian
- Kevin Weber
@@ -1616,7 +1636,6 @@ Symfony is the result of the work of many people who made the code better
- Muharrem Demirci (mdemirci)
- Evgeny Z (meze)
- Nicolas de Marqué (nicola)
- - Kevin (oxfouzer)
- Pierre Geyer (ptheg)
- Sam Fleming (sam_fleming)
- Thomas BERTRAND (sevrahk)
diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoubleNullableNameEntity.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoubleNullableNameEntity.php
new file mode 100644
index 0000000000000..29b247b9b1c36
--- /dev/null
+++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoubleNullableNameEntity.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Doctrine\Tests\Fixtures;
+
+use Doctrine\ORM\Mapping\Id;
+use Doctrine\ORM\Mapping\Column;
+use Doctrine\ORM\Mapping\Entity;
+
+/** @Entity */
+class DoubleNullableNameEntity
+{
+ /** @Id @Column(type="integer") */
+ protected $id;
+
+ /** @Column(type="string", nullable=true) */
+ public $name;
+
+ /** @Column(type="string", nullable=true) */
+ public $name2;
+
+ public function __construct($id, $name, $name2)
+ {
+ $this->id = $id;
+ $this->name = $name;
+ $this->name2 = $name2;
+ }
+}
diff --git a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php
index 2881ed5f723e2..aa2ecc7a3a485 100644
--- a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php
+++ b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php
@@ -22,6 +22,7 @@
use Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeObjectNoToStringIdEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\DoubleNameEntity;
+use Symfony\Bridge\Doctrine\Tests\Fixtures\DoubleNullableNameEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity2;
use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdNoToStringEntity;
@@ -142,6 +143,7 @@ private function createSchema(ObjectManager $em)
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity'),
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdNoToStringEntity'),
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\DoubleNameEntity'),
+ $em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\DoubleNullableNameEntity'),
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity'),
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity'),
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity2'),
@@ -231,7 +233,7 @@ public function testValidateUniquenessWithNull()
$this->assertNoViolation();
}
- public function testValidateUniquenessWithIgnoreNull()
+ public function testValidateUniquenessWithIgnoreNullDisabled()
{
$constraint = new UniqueEntity(array(
'message' => 'myMessage',
@@ -281,6 +283,34 @@ public function testAllConfiguredFieldsAreCheckedOfBeingMappedByDoctrineWithIgno
$this->validator->validate($entity1, $constraint);
}
+ public function testNoValidationIfFirstFieldIsNullAndNullValuesAreIgnored()
+ {
+ $constraint = new UniqueEntity(array(
+ 'message' => 'myMessage',
+ 'fields' => array('name', 'name2'),
+ 'em' => self::EM_NAME,
+ 'ignoreNull' => true,
+ ));
+
+ $entity1 = new DoubleNullableNameEntity(1, null, 'Foo');
+ $entity2 = new DoubleNullableNameEntity(2, null, 'Foo');
+
+ $this->validator->validate($entity1, $constraint);
+
+ $this->assertNoViolation();
+
+ $this->em->persist($entity1);
+ $this->em->flush();
+
+ $this->validator->validate($entity1, $constraint);
+
+ $this->assertNoViolation();
+
+ $this->validator->validate($entity2, $constraint);
+
+ $this->assertNoViolation();
+ }
+
public function testValidateUniquenessWithValidCustomErrorPath()
{
$constraint = new UniqueEntity(array(
diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php
index b079770c6b3d6..454111c2387d3 100644
--- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php
+++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php
@@ -81,6 +81,8 @@ public function validate($entity, Constraint $constraint)
/* @var $class \Doctrine\Common\Persistence\Mapping\ClassMetadata */
$criteria = array();
+ $hasNullValue = false;
+
foreach ($fields as $fieldName) {
if (!$class->hasField($fieldName) && !$class->hasAssociation($fieldName)) {
throw new ConstraintDefinitionException(sprintf('The field "%s" is not mapped by Doctrine, so it cannot be validated for uniqueness.', $fieldName));
@@ -88,6 +90,10 @@ public function validate($entity, Constraint $constraint)
$fieldValue = $class->reflFields[$fieldName]->getValue($entity);
+ if (null === $fieldValue) {
+ $hasNullValue = true;
+ }
+
if ($constraint->ignoreNull && null === $fieldValue) {
continue;
}
@@ -103,6 +109,11 @@ public function validate($entity, Constraint $constraint)
}
}
+ // validation doesn't fail if one of the fields is null and if null values should be ignored
+ if ($hasNullValue && $constraint->ignoreNull) {
+ return;
+ }
+
// skip validation if there are no criteria (this can happen when the
// "ignoreNull" option is enabled and fields to be checked are null
if (empty($criteria)) {
diff --git a/src/Symfony/Bridge/Twig/Extension/RoutingExtension.php b/src/Symfony/Bridge/Twig/Extension/RoutingExtension.php
index 7469183e75de1..81cef949c7408 100644
--- a/src/Symfony/Bridge/Twig/Extension/RoutingExtension.php
+++ b/src/Symfony/Bridge/Twig/Extension/RoutingExtension.php
@@ -40,11 +40,25 @@ public function getFunctions()
);
}
+ /**
+ * @param string $name
+ * @param array $parameters
+ * @param bool $relative
+ *
+ * @return string
+ */
public function getPath($name, $parameters = array(), $relative = false)
{
return $this->generator->generate($name, $parameters, $relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH);
}
+ /**
+ * @param string $name
+ * @param array $parameters
+ * @param bool $schemeRelative
+ *
+ * @return string
+ */
public function getUrl($name, $parameters = array(), $schemeRelative = false)
{
return $this->generator->generate($name, $parameters, $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL);
diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php
index dc88f172dcdd3..392d2a8784b0e 100644
--- a/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php
+++ b/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php
@@ -63,9 +63,7 @@ protected function getFragmentHandler($return)
$context->expects($this->any())->method('getCurrentRequest')->will($this->returnValue(Request::create('/')));
- $renderer = new FragmentHandler($context, array($strategy), false);
-
- return $renderer;
+ return new FragmentHandler($context, array($strategy), false);
}
protected function renderTemplate(FragmentHandler $renderer, $template = '{{ render("foo") }}')
diff --git a/src/Symfony/Bundle/DebugBundle/Resources/config/services.xml b/src/Symfony/Bundle/DebugBundle/Resources/config/services.xml
index 655d0ae5c7e89..ae7d91add15d4 100644
--- a/src/Symfony/Bundle/DebugBundle/Resources/config/services.xml
+++ b/src/Symfony/Bundle/DebugBundle/Resources/config/services.xml
@@ -38,7 +38,7 @@
0
-
+
diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php
index 43771d4f70e52..2e63e6385f534 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php
@@ -185,7 +185,7 @@ protected function describeContainerDefinition(Definition $definition, array $op
;
foreach ($definition->getAutowiringTypes() as $autowiringType) {
- $output .= "\n" . '- Autowiring Type: `' . $autowiringType . '`';
+ $output .= "\n".'- Autowiring Type: `'.$autowiringType.'`';
}
if ($definition->getFile()) {
diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php
index 4b75738b2fd1a..508899379f691 100644
--- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php
+++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php
@@ -13,6 +13,7 @@
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
/**
* @internal
@@ -27,7 +28,16 @@ public function process(ContainerBuilder $container)
// "annotations.cached_reader" is wired late so that any passes using
// "annotation_reader" at build time don't get any cache
if ($container->hasDefinition('annotations.cached_reader')) {
- $container->setAlias('annotation_reader', 'annotations.cached_reader');
+ $reader = $container->getDefinition('annotations.cached_reader');
+ $tags = $reader->getTags();
+
+ if (isset($tags['annotations.cached_reader'][0]['provider'])) {
+ if ($container->hasAlias($provider = $tags['annotations.cached_reader'][0]['provider'])) {
+ $provider = (string) $container->getAlias($provider);
+ }
+ $container->set('annotations.cached_reader', null);
+ $container->setDefinition('annotations.cached_reader', $reader->replaceArgument(1, new Reference($provider)));
+ }
}
}
}
diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
index 7429eed2f27a0..cfe687ad35916 100644
--- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
+++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
@@ -35,7 +35,6 @@
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer;
use Symfony\Component\Workflow;
-use Symfony\Component\Yaml\Yaml;
/**
* FrameworkExtension.
@@ -764,23 +763,14 @@ private function createPackageDefinition($basePath, array $baseUrls, Reference $
throw new \LogicException('An asset package cannot have base URLs and base paths.');
}
- if (!$baseUrls) {
- $package = new DefinitionDecorator('assets.path_package');
-
- return $package
- ->setPublic(false)
- ->replaceArgument(0, $basePath)
- ->replaceArgument(1, $version)
- ;
- }
-
- $package = new DefinitionDecorator('assets.url_package');
-
- return $package
+ $package = new DefinitionDecorator($baseUrls ? 'assets.url_package' : 'assets.path_package');
+ $package
->setPublic(false)
- ->replaceArgument(0, $baseUrls)
+ ->replaceArgument(0, $baseUrls ?: $basePath)
->replaceArgument(1, $version)
;
+
+ return $package;
}
private function createVersion(ContainerBuilder $container, $version, $format, $name)
@@ -1039,10 +1029,11 @@ private function registerAnnotationsConfiguration(array $config, ContainerBuilde
$container
->getDefinition('annotations.cached_reader')
- ->replaceArgument(1, new Reference($cacheService))
->replaceArgument(2, $config['debug'])
+ ->addTag('annotations.cached_reader', array('provider' => $cacheService))
->addAutowiringType(Reader::class)
;
+ $container->setAlias('annotation_reader', 'annotations.cached_reader');
} else {
$container->removeDefinition('annotations.cached_reader');
}
@@ -1235,7 +1226,6 @@ private function registerPropertyInfoConfiguration(array $config, ContainerBuild
private function registerCacheConfiguration(array $config, ContainerBuilder $container)
{
$version = substr(str_replace('/', '-', base64_encode(hash('sha256', uniqid(mt_rand(), true), true))), 0, 22);
- $container->getDefinition('cache.annotations')->replaceArgument(2, $version);
$container->getDefinition('cache.adapter.apcu')->replaceArgument(2, $version);
$container->getDefinition('cache.adapter.system')->replaceArgument(2, $version);
$container->getDefinition('cache.adapter.filesystem')->replaceArgument(2, $config['directory']);
diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml
index a2a0fb4065329..146a875ad7dc9 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml
+++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml
@@ -11,7 +11,9 @@
-
+
+
+
diff --git a/src/Symfony/Bundle/FrameworkBundle/Templating/Helper/CodeHelper.php b/src/Symfony/Bundle/FrameworkBundle/Templating/Helper/CodeHelper.php
index c4085e4ec0f93..ba36cbde0c884 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Templating/Helper/CodeHelper.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Templating/Helper/CodeHelper.php
@@ -133,7 +133,7 @@ public function fileExcerpt($file, $line)
$code = @highlight_file($file, true);
// remove main code/span tags
$code = preg_replace('#^\s*(.*)\s*#s', '\\1', $code);
- $content = preg_split('# #', $code);
+ $content = explode(' ', $code);
$lines = array();
for ($i = max($line - 3, 1), $max = min($line + 3, count($content)); $i <= $max; ++$i) {
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/TemplatePathsCacheWarmerTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/TemplatePathsCacheWarmerTest.php
index 062210d3a0585..74a33f3b43130 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/TemplatePathsCacheWarmerTest.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/TemplatePathsCacheWarmerTest.php
@@ -35,7 +35,7 @@ class TemplatePathsCacheWarmerTest extends TestCase
private $tmpDir;
- public function setUp()
+ protected function setUp()
{
$this->templateFinder = $this
->getMockBuilder(TemplateFinderInterface::class)
@@ -56,7 +56,7 @@ public function setUp()
$this->filesystem->mkdir($this->tmpDir);
}
- public function tearDown()
+ protected function tearDown()
{
$this->filesystem->remove($this->tmpDir);
}
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php
index fec9b4be16ab2..71b5fada8f0f4 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php
@@ -12,6 +12,7 @@
namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection;
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddAnnotationsCachedReaderPass;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension;
use Symfony\Component\Cache\Adapter\ApcuAdapter;
use Symfony\Component\Cache\Adapter\ChainAdapter;
@@ -818,6 +819,7 @@ protected function createContainerFromFile($file, $data = array(), $resetCompile
$container->getCompilerPassConfig()->setOptimizationPasses(array());
$container->getCompilerPassConfig()->setRemovingPasses(array());
}
+ $container->getCompilerPassConfig()->setBeforeRemovingPasses(array(new AddAnnotationsCachedReaderPass()));
$container->compile();
return self::$containerCache[$cacheKey] = $container;
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Resources/views/translation.html.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Resources/views/translation.html.php
index cb3c763f8f3c8..5a7cd354763d0 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Resources/views/translation.html.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Resources/views/translation.html.php
@@ -46,4 +46,4 @@
trans('typecast', ['a' => (int) '123'], 'not_messages'); ?>
transChoice('msg1', 10 + 1, [], 'not_messages'); ?>
-transChoice('msg2', intval(4.5), [], 'not_messages'); ?>
+transChoice('msg2', ceil(4.5), [], 'not_messages'); ?>
diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/SimpleFormFactory.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/SimpleFormFactory.php
index 9da6601ff547b..6241cf4f3912f 100644
--- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/SimpleFormFactory.php
+++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/SimpleFormFactory.php
@@ -77,17 +77,4 @@ protected function createListener($container, $id, $config, $userProvider)
return $listenerId;
}
-
- protected function createEntryPoint($container, $id, $config, $defaultEntryPoint)
- {
- $entryPointId = 'security.authentication.form_entry_point.'.$id;
- $container
- ->setDefinition($entryPointId, new DefinitionDecorator('security.authentication.form_entry_point'))
- ->addArgument(new Reference('security.http_utils'))
- ->addArgument($config['login_path'])
- ->addArgument($config['use_forward'])
- ;
-
- return $entryPointId;
- }
}
diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/config.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/config.html.twig
index 46234cda974dd..d80b3a5507ac4 100644
--- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/config.html.twig
+++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/config.html.twig
@@ -121,7 +121,7 @@
{% endset %}
- {{ include('@WebProfiler/Profiler/toolbar_item.html.twig', { link: true, name: 'config', status: block_status, additional_classes: 'sf-toolbar-block-right' }) }}
+ {{ include('@WebProfiler/Profiler/toolbar_item.html.twig', { link: true, name: 'config', status: block_status, additional_classes: 'sf-toolbar-block-right', block_attrs: 'title="' ~ symfony_version_status ~ '"' }) }}
{% endblock %}
{% block menu %}
diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_item.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_item.html.twig
index d25c5502ae8b0..aef89183cda1d 100644
--- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_item.html.twig
+++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_item.html.twig
@@ -1,4 +1,4 @@
-