diff --git a/CHANGELOG-4.3.md b/CHANGELOG-4.3.md index 9d60553f2e..0d18622314 100644 --- a/CHANGELOG-4.3.md +++ b/CHANGELOG-4.3.md @@ -7,6 +7,91 @@ in 4.3 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/v4.3.0...v4.3.1 +* 4.3.5 (2019-10-07) + + * bug #33742 [Crawler] document $default as string|null (nicolas-grekas) + * bug #32308 [Messenger] DoctrineTransport: ensure auto setup is only done once (bendavies) + * bug #33871 [HttpClient] bugfix exploding values of headers (michaljusiega) + * bug #33834 [Validator] Fix ValidValidator group cascading usage (fancyweb) + * bug #33863 [Routing] gracefully handle docref_root ini setting (nicolas-grekas) + * bug #33846 [Cache] give 100ms before starting the expiration countdown (nicolas-grekas) + * bug #33853 [HttpClient] fix "no_proxy" option ignored in NativeHttpClient (Harry-Dunne) + * bug #33841 [VarDumper] fix dumping uninitialized SplFileInfo (nicolas-grekas) + * bug #33842 [Cache] fix logger usage in CacheTrait::doGet() (nicolas-grekas) + * bug #33835 [Workflow] Fixed BC break on WorkflowInterface (lyrixx) + * bug #33799 [Security]: Don't let falsy usernames slip through impersonation (j4nr6n) + * bug #33814 [HttpFoundation] Check if data passed to SessionBagProxy::initialize is an array (mynameisbogdan) + * bug #33744 [DI] Add CSV env var processor tests / support PHP 7.4 (ro0NL) + * bug #33805 [FrameworkBundle] Fix wrong returned status code in ConfigDebugCommand (jschaedl) + * bug #33781 [AnnotationCacheWarmer] add RedirectController to annotation cache (jenschude) + * bug #33777 Fix the :only-of-type pseudo class selector (jakzal) + * bug #32051 [Serializer] Add CsvEncoder tests for PHP 7.4 (ro0NL) + * feature #33776 Copy phpunit.xsd to a predictable path (julienfalque) + * bug #33759 [Security/Http] fix parsing X509 emailAddress (nicolas-grekas) + * bug #33733 [Serializer] fix denormalization of string-arrays with only one element (mkrauser) + * bug #33754 [Cache] fix known tag versions ttl check (SwenVanZanten) + * bug #33646 [HttpFoundation] allow additinal characters in not raw cookies (marie) + * bug #33748 [Console] Do not include hidden commands in suggested alternatives (m-vo) + * bug #33625 [DependencyInjection] Fix wrong exception when service is synthetic (k0d3r1s) + * bug #32979 [Messenger] return empty envelopes when RetryableException occurs (surikman) + * bug #32522 [Validator] Accept underscores in the URL validator, as the URL will load (battye) + * bug #32437 Fix toolbar load when GET params are present in "_wdt" route (Molkobain) + * bug #32925 [Translation] Collect original locale in case of fallback translation (digilist) + * bug #33691 [HttpClient] fix race condition when reading response with informational status (nicolas-grekas) + * bug #33727 [HttpClient] workaround bad Content-Length sent by old libcurl (nicolas-grekas) + * bug #31198 [FrameworkBundle] Fix framework bundle lock configuration not working as expected (HypeMC) + * bug #33719 [Cache] dont override native Memcached options (nicolas-grekas) + * bug #33703 [Cache] fail gracefully when locking is not supported (nicolas-grekas) + * bug #33713 Fix exceptions (PDOException) error code type (fruty) + * bug #32335 [Form] Names for buttons should start with lowercase (mcfedr) + * bug #33706 [Mailer][Messenger] ensure legacy event dispatcher compatibility (xabbuh) + * bug #33688 Add missing row_attr option to FormType (mcsky) + * bug #33693 [Security] use LegacyEventDispatcherProxy (dmaicher) + * bug #33675 [PhpUnit] Fix usleep mock return value (fabpot) + * bug #33652 [Cache] skip igbinary on PHP 7.4.0 (nicolas-grekas) + * bug #33643 [HttpClient] fix throwing HTTP exceptions when the 1st chunk is emitted (nicolas-grekas) + * bug #33618 fix tests depending on other components' tests (xabbuh) + * bug #33626 [PropertyInfo] ensure compatibility with type resolver 0.5 (xabbuh) + * bug #33620 [Twig] Fix Twig config extra keys (fabpot) + * bug #33600 [Messenger] Fix exception message of failed message is dropped on retry (tienvx) + * bug #33601 [HttpClient] Add default value for Accept header (numerogeek) + * bug #33340 [Finder] Adjust regex to correctly match comments in gitignore contents (Jeroeny) + * bug #33588 [PropertyInfo] ensure compatibility with type resolver 0.5 (xabbuh) + * bug #33575 [WebProfilerBundle] Fix time panel legend buttons (fancyweb) + * bug #33571 [Inflector] add support 'see' to 'ee' for singularize 'fees' to 'fee' (maxhelias) + * bug #32763 [Console] Get dimensions from stty on windows if possible (rtek) + * bug #33570 Fixed cache pools affecting each other due to an overwritten seed variable (roed) + * bug #33517 [Yaml] properly catch legacy tag syntax usages (xabbuh) + * bug #33546 [DependencyInjection] Accept existing interfaces as valid named args (fancyweb) + * bug #33547 [HttpClient] Re-enable Server Push support (dunglas) + * bug #33521 Fixed incompatibility between ServiceSubscriberTrait and classes with protected $container property (a-menshchikov) + * bug #33518 [Yaml] don't dump a scalar tag value on its own line (xabbuh) + * bug #33505 [HttpClient] fallbackto CURLMOPT_MAXCONNECTS when CURLMOPT_MAX_HOST_CONNECTIONS is not available (nicolas-grekas) + * bug #32818 [HttpKernel] Fix getFileLinkFormat() to avoid returning the wrong URL in Profiler (Arman-Hosseini) + * bug #33487 [HttpKernel] Fix Apache mod_expires Session Cache-Control issue (pbowyer) + * bug #33469 [FrameworkBundle] Fixed suggested package for missing server:dump command (lyrixx) + * bug #31964 [Router] routing cache crash when using generator_class (dFayet) + * bug #33481 [Messenger] fix empty amqp body returned as false (Tobion) + * bug #33387 [Mailer] maintain sender/recipient name in SMTP envelopes (xabbuh) + * bug #33449 Fix gmail relay (Beno!t POLASZEK) + * bug #33391 [HttpClient] fix support for 103 Early Hints and other informational status codes (nicolas-grekas) + * bug #33444 [HttpClient] improve handling of HTTP/2 PUSH, disable it by default (nicolas-grekas) + * bug #33435 [Validator] Only handle numeric values in DivisibleBy (fancyweb) + * bug #33437 Fix #33427 (sylfabre) + * bug #33439 [Validator] Sync string to date behavior and throw a better exception (fancyweb) + * bug #33436 [DI] fix support for "!tagged_locator foo" (nicolas-grekas) + * bug #32903 [PHPUnit Bridge] Avoid registering listener twice (alexpott) + * bug #33432 [Mailer] Fix Mailgun support when a response is not JSON as expected (fabpot) + * bug #33402 [Finder] Prevent unintentional file locks in Windows (jspringe) + * bug #33376 [Mailer] Remove the default dispatcher in AbstractTransport (fabpot) + * bug #33357 [FrameworkBundle] Fix about command not showing .env vars (brentybh) + * bug #33396 Fix #33395 PHP 5.3 compatibility (kylekatarnls) + * bug #33363 [Routing] fix static route reordering when a previous dynamic route conflicts (nicolas-grekas) + * bug #33385 [Console] allow Command::getName() to return null (nicolas-grekas) + * bug #33353 Return null as Expire header if it was set to null (danrot) + * bug #33382 [ProxyManager] remove ProxiedMethodReturnExpression polyfill (nicolas-grekas) + * bug #33377 [Yaml] fix dumping not inlined scalar tag values (xabbuh) + * 4.3.4 (2019-08-26) * bug #33335 [DependencyInjection] Fixed the `getServiceIds` implementation to always return aliases (pdommelen) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 963f9e9602..2cf905be32 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -6,36 +6,36 @@ Symfony is the result of the work of many people who made the code better - Fabien Potencier (fabpot) - Nicolas Grekas (nicolas-grekas) - - Bernhard Schussek (bschussek) - Christian Flothmann (xabbuh) + - Bernhard Schussek (bschussek) - Tobias Schultze (tobion) - Christophe Coevoet (stof) - Robin Chalas (chalas_r) - Jordi Boggiano (seldaek) - - Victor Berchet (victor) - Kévin Dunglas (dunglas) + - Victor Berchet (victor) - Maxime Steinhausser (ogizanagi) - Ryan Weaver (weaverryan) - Javier Eguiluz (javier.eguiluz) - - Jakub Zalas (jakubzalas) - Roland Franssen (ro0) + - Jakub Zalas (jakubzalas) - Johannes S (johannes) - - Kris Wallsmith (kriswallsmith) - Grégoire Pineau (lyrixx) + - Kris Wallsmith (kriswallsmith) - Hugo Hamon (hhamon) + - Yonel Ceruto (yonelceruto) - Abdellatif Ait boudad (aitboudad) - Samuel ROZE (sroze) - - Yonel Ceruto (yonelceruto) - Romain Neutron (romain) - Pascal Borreli (pborreli) - Wouter De Jong (wouterj) - Joseph Bielawski (stloyd) - Karma Dordrak (drak) - Lukas Kahwe Smith (lsmith) + - Alexander M. Turek (derrabus) - Martin Hasoň (hason) - Hamza Amrouche (simperfit) - Jeremy Mikola (jmikola) - - Alexander M. Turek (derrabus) - Jean-François Simon (jfsimon) - Jules Pietri (heah) - Benjamin Eberlei (beberlei) @@ -44,21 +44,21 @@ Symfony is the result of the work of many people who made the code better - Eriksen Costa (eriksencosta) - Guilhem Niot (energetick) - Sarah Khalil (saro0h) + - Thomas Calvet (fancyweb) - Tobias Nyholm (tobias) - Jonathan Wage (jwage) - Lynn van der Berg (kjarli) - Diego Saint Esteben (dosten) - - Thomas Calvet (fancyweb) - Alexandre Salomé (alexandresalome) - William Durand (couac) - ornicar + - Pierre du Plessis (pierredup) - Dany Maillard (maidmaid) - Francis Besset (francisbesset) - stealth35 ‏ (stealth35) - Alexander Mols (asm89) - - Pierre du Plessis (pierredup) - - Matthias Pigulla (mpdude) - Konstantin Myakshin (koc) + - Matthias Pigulla (mpdude) - Bulat Shakirzyanov (avalanche123) - Grégoire Paris (greg0ire) - Saša Stamenković (umpirsky) @@ -69,13 +69,13 @@ Symfony is the result of the work of many people who made the code better - Miha Vrhovnik - Diego Saint Esteben (dii3g0) - Gábor Egyed (1ed) - - Konstantin Kudryashov (everzet) - Titouan Galopin (tgalopin) + - Konstantin Kudryashov (everzet) + - David Maicher (dmaicher) - Bilal Amarni (bamarni) - Mathieu Piot (mpiot) - - David Maicher (dmaicher) - - Florin Patan (florinpatan) - Gabriel Ostrolucký (gadelat) + - Florin Patan (florinpatan) - Vladimir Reznichenko (kalessil) - Jáchym Toušek (enumag) - Michel Weimerskirch (mweimerskirch) @@ -83,6 +83,7 @@ Symfony is the result of the work of many people who made the code better - Issei Murasawa (issei_m) - Eric Clemmons (ericclemmons) - Charles Sarrazin (csarrazi) + - Jan Schädlich (jschaedl) - Christian Raue - Arnout Boks (aboks) - Deni @@ -90,7 +91,6 @@ Symfony is the result of the work of many people who made the code better - Dariusz Górecki (canni) - Douglas Greenshields (shieldo) - David Buchmann (dbu) - - Jan Schädlich (jschaedl) - Dariusz Ruminski - Lee McDermott - Brandon Turner @@ -114,30 +114,30 @@ Symfony is the result of the work of many people who made the code better - Baptiste Clavié (talus) - marc.weistroff - Tomáš Votruba (tomas_votruba) + - Jérôme Vasseur (jvasseur) - lenar - Alexander Schwenn (xelaris) - Włodzimierz Gajda (gajdaw) - - Jérôme Vasseur (jvasseur) + - Sebastiaan Stok (sstok) + - Adrien Brault (adrienbrault) - Peter Kokot (maastermedia) - Jacob Dreesen (jdreesen) - Florian Voutzinos (florianv) - - Sebastiaan Stok (sstok) - Colin Frei - Javier Spagnoletti (phansys) - - Adrien Brault (adrienbrault) - Joshua Thijssen - Daniel Wehner (dawehner) - excelwebzone - Gordon Franke (gimler) + - Teoh Han Hui (teohhanhui) - Oskar Stark (oskarstark) + - Alex Pott - Fabien Pennequin (fabienpennequin) - Théo FIDRY (theofidry) - - Teoh Han Hui (teohhanhui) - Eric GELOEN (gelo) - Joel Wurtz (brouznouf) - Lars Strojny (lstrojny) - Tugdual Saunier (tucksaun) - - Alex Pott - Jannik Zschiesche (apfelbox) - Robert Schönthal (digitalkaoz) - Florian Lonqueu-Brochard (florianlb) @@ -152,6 +152,7 @@ Symfony is the result of the work of many people who made the code better - Daniel Gomes (danielcsgomes) - Hidenori Goto (hidenorigoto) - Andréia Bohner (andreia) + - Julien Falque (julienfalque) - Arnaud Kleinpeter (nanocom) - Guilherme Blanco (guilhermeblanco) - SpacePossum @@ -160,7 +161,6 @@ Symfony is the result of the work of many people who made the code better - François-Xavier de Guillebon (de-gui_f) - Oleg Voronkovich - Philipp Wahala (hifi) - - Julien Falque (julienfalque) - Rafael Dohms (rdohms) - jwdeitch - Mikael Pajunen @@ -172,6 +172,7 @@ Symfony is the result of the work of many people who made the code better - Richard Shank (iampersistent) - Thomas Rabaix (rande) - Vincent Touzet (vincenttouzet) + - Gregor Harlan (gharlan) - jeremyFreeAgent (jeremyfreeagent) - Rouven Weßling (realityking) - Alexander Schranz (alexander-schranz) @@ -193,6 +194,7 @@ Symfony is the result of the work of many people who made the code better - James Halsall (jaitsu) - Matthieu Napoli (mnapoli) - Florent Mata (fmata) + - Arman Hosseini - Warnar Boekkooi (boekkooi) - Dmitrii Chekaliuk (lazyhammer) - Clément JOBEILI (dator) @@ -206,11 +208,11 @@ Symfony is the result of the work of many people who made the code better - Mario A. Alvarez Garcia (nomack84) - Dennis Benkert (denderello) - DQNEO - - Gregor Harlan (gharlan) + - mcfedr (mcfedr) - Gary PEGEOT (gary-p) - Ruben Gonzalez (rubenrua) - Benjamin Dulau (dbenjamin) - - Arman Hosseini + - Andreas Braun - Mathieu Lemoine (lemoinem) - Christian Schmidt - Andreas Hucks (meandmymonkey) @@ -241,7 +243,6 @@ Symfony is the result of the work of many people who made the code better - jeff - John Kary (johnkary) - Andreas Schempp (aschempp) - - Andreas Braun - Justin Hileman (bobthecow) - Blanchon Vincent (blanchonvincent) - Michele Orselli (orso) @@ -265,7 +266,6 @@ Symfony is the result of the work of many people who made the code better - julien pauli (jpauli) - Lorenz Schori - Sébastien Lavoie (lavoiesl) - - mcfedr (mcfedr) - Dariusz - Michael Babker (mbabker) - Francois Zaninotto @@ -314,12 +314,14 @@ Symfony is the result of the work of many people who made the code better - Jhonny Lidfors (jhonne) - Diego Agulló (aeoris) - jdhoek + - Maxime Helias (maxhelias) - David Prévot - Bob den Otter (bopp) - Thomas Schulz (king2500) - Frank de Jonge (frenkynet) - Nikita Konstantinov - Wodor Wodorski + - dFayet - Thomas Lallement (raziel057) - Colin O'Dell (colinodell) - Giorgio Premi @@ -343,6 +345,7 @@ Symfony is the result of the work of many people who made the code better - Christian Schmidt - Patrick Landolt (scube) - MatTheCat + - David Badura (davidbadura) - Chad Sikorra (chadsikorra) - Chris Smith (cs278) - Florian Klein (docteurklein) @@ -361,6 +364,7 @@ Symfony is the result of the work of many people who made the code better - Jerzy Zawadzki (jzawadzki) - Wouter J - Ismael Ambrosi (iambrosi) + - Ruud Kamphuis (ruudk) - Emmanuel BORGES (eborges78) - Aurelijus Valeiša (aurelijus) - Jan Decavele (jandc) @@ -374,7 +378,6 @@ Symfony is the result of the work of many people who made the code better - Francesc Rosàs (frosas) - Romain Pierre (romain-pierre) - Julien Galenski (ruian) - - Maxime Helias - Bongiraud Dominique - janschoenherr - Emanuele Gaspari (inmarelibero) @@ -382,7 +385,6 @@ Symfony is the result of the work of many people who made the code better - Berny Cantos (xphere81) - Thierry Thuon (lepiaf) - Ricard Clau (ricardclau) - - dFayet - Mark Challoner (markchalloner) - Gennady Telegin (gtelegin) - Erin Millard @@ -410,10 +412,10 @@ Symfony is the result of the work of many people who made the code better - Robbert Klarenbeek (robbertkl) - Eric Masoero (eric-masoero) - JhonnyL - - David Badura (davidbadura) - hossein zolfi (ocean) - Clément Gautier (clementgautier) - Thomas Bisignani (toma) + - Dāvis Zālītis (k0d3r1s) - Sanpi - Eduardo Gulias (egulias) - giulio de donato (liuggio) @@ -436,6 +438,7 @@ Symfony is the result of the work of many people who made the code better - Tamas Szijarto - Michele Locati - Pavel Volokitin (pvolok) + - Valentine Boineau (valentineboineau) - Arthur de Moulins (4rthem) - Matthias Althaus (althaus) - Nicolas Dewez (nicolas_dewez) @@ -447,13 +450,13 @@ Symfony is the result of the work of many people who made the code better - Joe Lencioni - Daniel Tschinder - vladimir.reznichenko - - Ruud Kamphuis (ruudk) - Kai - Lee Rowlands - Krzysztof Piasecki (krzysztek) - Maximilian Reichel (phramz) - Loick Piera (pyrech) - Alain Hippolyte (aloneh) + - Grenier Kévin (mcsky_biig) - Karoly Negyesi (chx) - Ivan Kurnosov - Xavier HAUSHERR @@ -481,9 +484,11 @@ Symfony is the result of the work of many people who made the code better - Jeanmonod David (jeanmonod) - Christopher Davis (chrisguitarguy) - Webnet team (webnet) + - Farhad Safarov - Jan Schumann - Niklas Fiekas - Markus Bachmann (baachi) + - Kévin THERAGE (kevin_therage) - lancergr - Mihai Stancu - Ivan Nikolaev (destillat) @@ -499,6 +504,7 @@ Symfony is the result of the work of many people who made the code better - EdgarPE - Florian Pfitzer (marmelatze) - Asier Illarramendi (doup) + - Sylvain Fabre (sylfabre) - Martijn Cuppens - Vlad Gregurco (vgregurco) - Maciej Malarz (malarzm) @@ -517,6 +523,7 @@ Symfony is the result of the work of many people who made the code better - Tobias Weichart - Gonzalo Vilaseca (gonzalovilaseca) - Marcin Sikoń (marphi) + - Tien Vo (tienvx) - Denis Brumann (dbrumann) - Dominik Zogg (dominik.zogg) - Marek Pietrzak @@ -533,6 +540,7 @@ Symfony is the result of the work of many people who made the code better - Anton Bakai - Martin Auswöger - Rhodri Pugh (rodnaph) + - battye - Sam Fleming (sam_fleming) - Alex Bakhturin - Patrick Reimers (preimers) @@ -606,7 +614,6 @@ Symfony is the result of the work of many people who made the code better - Nate (frickenate) - Timothée Barray (tyx) - jhonnyL - - Grenier Kévin (mcsky_biig) - sasezaki - Dawid Pakuła (zulusx) - Florian Rey (nervo) @@ -621,6 +628,7 @@ Symfony is the result of the work of many people who made the code better - Kevin Saliou (kbsali) - Shawn Iwinski - Gawain Lynch (gawain) + - mmokhi - NothingWeAre - Ryan - Alexander Deruwe (aderuwe) @@ -643,9 +651,11 @@ Symfony is the result of the work of many people who made the code better - Disquedur - Michiel Boeckaert (milio) - Geoffrey Tran (geoff) + - Kyle - Jan Behrens - Mantas Var (mvar) - Chris Tanaskoski + - Terje Bråten - Sebastian Krebs - Piotr Stankowski - Baptiste Leduc (bleduc) @@ -669,6 +679,7 @@ Symfony is the result of the work of many people who made the code better - Kyle Evans (kevans91) - Charles-Henri Bruyand - Max Rath (drak3) + - Oleg Andreyev - Stéphane Escandell (sescandell) - Konstantin S. M. Möllers (ksmmoellers) - James Johnston @@ -676,7 +687,6 @@ Symfony is the result of the work of many people who made the code better - Alexandre Dupuy (satchette) - Malte Blättermann - Desjardins Jérôme (jewome62) - - Kévin THERAGE (kevin_therage) - Simeon Kolev (simeon_kolev9) - Joost van Driel (j92) - Jonas Elfering @@ -693,7 +703,6 @@ Symfony is the result of the work of many people who made the code better - Gunnstein Lye (glye) - Maxime Douailin - Jean Pasdeloup (pasdeloup) - - Sylvain Fabre (sylfabre) - Benjamin Cremer (bcremer) - Javier López (loalf) - Reinier Kip @@ -712,6 +721,7 @@ Symfony is the result of the work of many people who made the code better - DerManoMann - Rostyslav Kinash - Dennis Fridrich (dfridrich) + - Mardari Dorel (dorumd) - Daisuke Ohata - Vincent Simonin - Alex Bogomazov (alebo) @@ -730,6 +740,7 @@ Symfony is the result of the work of many people who made the code better - Miquel Rodríguez Telep (mrtorrent) - Sergey Kolodyazhnyy (skolodyazhnyy) - umpirski + - M. Vondano - Quentin de Longraye (quentinus95) - Chris Heng (gigablah) - Shaun Simmons (simshaun) @@ -750,7 +761,7 @@ Symfony is the result of the work of many people who made the code better - Kristijan Kanalas - Stephan Vock - Benjamin Zikarsky (bzikarsky) - - battye + - Ruben Jacobs (rubenj) - Simon Schick (simonsimcity) - redstar504 - Tristan Roussel @@ -799,6 +810,7 @@ Symfony is the result of the work of many people who made the code better - Indra Gunawan (guind) - Peter Ward - Davide Borsatto (davide.borsatto) + - Markus Fasselt (digilist) - Julien DIDIER (juliendidier) - Dominik Ritter (dritter) - Sebastian Grodzicki (sgrodzicki) @@ -935,7 +947,6 @@ Symfony is the result of the work of many people who made the code better - Benoît Bourgeois - mantulo - Stefan Kruppa - - mmokhi - corphi - JoppeDC - grizlik @@ -1005,10 +1016,8 @@ Symfony is the result of the work of many people who made the code better - Pablo Lozano (arkadis) - Erik Saunier (snickers) - Rootie - - Kyle - Daniel Alejandro Castro Arellano (lexcast) - sensio - - Terje Bråten - Thomas Jarrand - Antoine Bluchet (soyuka) - Sebastien Morel (plopix) @@ -1031,7 +1040,6 @@ Symfony is the result of the work of many people who made the code better - The Whole Life to Learn - Mikkel Paulson - ergiegonzaga - - Farhad Safarov - Liverbool (liverbool) - Sam Malone - Phan Thanh Ha (haphan) @@ -1039,7 +1047,9 @@ Symfony is the result of the work of many people who made the code better - neghmurken - xaav - Mahmoud Mostafa (mahmoud) + - Julien Turby - Ahmed Abdou + - Daniel Iwaniec - Pieter - Michael Tibben - Billie Thompson @@ -1115,6 +1125,7 @@ Symfony is the result of the work of many people who made the code better - Chris Tiearney - Oliver Hoff - Ole Rößner (basster) + - rtek - Faton (notaf) - Tom Houdmont - Per Sandström (per) @@ -1133,6 +1144,7 @@ Symfony is the result of the work of many people who made the code better - ilyes kooli - gr1ev0us - mlazovla + - Alejandro Diaz Torres - Max Beutel - Antanas Arvasevicius - Pierre Dudoret @@ -1152,6 +1164,7 @@ Symfony is the result of the work of many people who made the code better - Ken Marfilla (marfillaster) - benatespina (benatespina) - Denis Kop + - HypeMC - Jean-Guilhem Rouel (jean-gui) - jfcixmedia - Dominic Tubach @@ -1167,6 +1180,7 @@ Symfony is the result of the work of many people who made the code better - Soner Sayakci - hugofonseca (fonsecas72) - Marc Duboc (icemad) + - Matthias Krauser (mkrauser) - Martynas Narbutas - Toon Verwerft (veewee) - Bailey Parker @@ -1216,6 +1230,7 @@ Symfony is the result of the work of many people who made the code better - Mathias STRASSER (roukmoute) - Thomason, James - Gordienko Vladislav + - marie - Viacheslav Sychov - Alexandre Quercia (alquerci) - Helmut Hummel (helhum) @@ -1307,8 +1322,8 @@ Symfony is the result of the work of many people who made the code better - Ilia (aliance) - Chris McCafferty (cilefen) - Mo Di (modi) - - Tien Vo (tienvx) - Pablo Schläpfer + - SuRiKmAn - Gert de Pagter - Jelte Steijaert (jelte) - David Négrier (moufmouf) @@ -1319,11 +1334,13 @@ Symfony is the result of the work of many people who made the code better - Alex Vasilchenko - sez-open - Xavier Coureau + - fruty - ConneXNL - Aharon Perkel - matze - Rubén Calvo (rubencm) - Abdul.Mohsen B. A. A + - Swen van Zanten - Benoît Burnichon - pthompson - Malaney J. Hill @@ -1360,6 +1377,7 @@ Symfony is the result of the work of many people who made the code better - sl_toto (sl_toto) - Walter Dal Mut (wdalmut) - abluchet + - Ruud Arentsen - Matthieu - Albin Kerouaton - Sébastien HOUZÉ @@ -1385,11 +1403,11 @@ Symfony is the result of the work of many people who made the code better - Constantine Shtompel - Jules Lamur - Renato Mendes Figueiredo + - pdommelen - Eric Stern - ShiraNai7 - Cedrick Oka - Antal Áron (antalaron) - - Markus Fasselt (digilist) - Vašek Purchart (vasek-purchart) - Janusz Jabłoński (yanoosh) - Fleuv @@ -1408,6 +1426,7 @@ Symfony is the result of the work of many people who made the code better - Andreas Frömer - Philip Frank - Lance McNearney + - Jeroen Spee (jeroens) - Giorgio Premi - ncou - Ian Carroll @@ -1420,6 +1439,7 @@ Symfony is the result of the work of many people who made the code better - Luis Galeas - Martin Pärtel - Bastien Jaillot (bastnic) + - Daniel Rotter (danrot) - Frédéric Bouchery (fbouchery) - Patrick Daley (padrig) - Xavier Briand (xavierbriand) @@ -1440,7 +1460,6 @@ Symfony is the result of the work of many people who made the code better - Daniel González Zaballos (dem3trio) - Emmanuel Vella (emmanuel.vella) - Guillaume BRETOU (guiguiboy) - - Dāvis Zālītis (k0d3r1s) - Carsten Nielsen (phreaknerd) - Roger Guasch (rogerguasch) - Jay Severson @@ -1559,6 +1578,7 @@ Symfony is the result of the work of many people who made the code better - povilas - Gavin Staniforth - Alessandro Tagliapietra (alex88) + - Andy Palmer (andyexeter) - Biji (biji) - Jérôme Tanghe (deuchnord) - Alex Teterin (errogaht) @@ -1606,7 +1626,6 @@ Symfony is the result of the work of many people who made the code better - Jibé Barth (jibbarth) - Matthew Foster (mfoster) - Reyo Stallenberg (reyostallenberg) - - Ruben Jacobs (rubenj) - Paul Seiffert (seiffert) - Vasily Khayrulin (sirian) - Stefan Koopmanschap (skoop) @@ -1648,6 +1667,7 @@ Symfony is the result of the work of many people who made the code better - Peter Bex - Manatsawin Hanmongkolchai - Gunther Konig + - Joe Springe - Mickael GOETZ - Maciej Schmidt - Dennis Væversted @@ -1677,12 +1697,12 @@ Symfony is the result of the work of many people who made the code better - me_shaon - 蝦米 - Grayson Koonce (breerly) - - Mardari Dorel (dorumd) - Andrey Helldar (helldar) - Karim Cassam Chenaï (ka) - Maksym Slesarenko (maksym_slesarenko) - Michal Kurzeja (mkurzeja) - Nicolas Bastien (nicolas_bastien) + - Peter Bowyer (pbowyer) - Nikola Svitlica (thecelavi) - Denis (yethee) - Andrew Zhilin (zhil) @@ -1760,7 +1780,6 @@ Symfony is the result of the work of many people who made the code better - Yannick Warnier (ywarnier) - Kevin Decherf - Jason Woods - - Oleg Andreyev - klemens - dened - Dmitry Korotovsky @@ -1777,6 +1796,7 @@ Symfony is the result of the work of many people who made the code better - taiiiraaa - Trevor Suarez - gedrox + - Bohan Yang - Alan Bondarchuk - Joe Bennett - dropfen @@ -1810,6 +1830,7 @@ Symfony is the result of the work of many people who made the code better - Jan Marek (janmarek) - Mark de Haan (markdehaan) - Dan Patrick (mdpatrick) + - Geoffrey Monte (numerogeek) - Pedro Magalhães (pmmaga) - Rares Vlaseanu (raresvla) - tante kinast (tante) @@ -1907,6 +1928,7 @@ Symfony is the result of the work of many people who made the code better - hainey - Juan M Martínez - Gilles Gauthier + - Pavinthan - ddebree - Kuba Werłos - Gyula Szucs @@ -2032,11 +2054,13 @@ Symfony is the result of the work of many people who made the code better - jc - BenjaminBeck - Aurelijus Rožėnas + - Beno!t POLASZEK - Jordan Hoff - znerol - Christian Eikermann - Kai Eichinger - Antonio Angelino + - Jens Schulze - Matt Fields - Niklas Keller - Andras Debreczeni @@ -2115,6 +2139,7 @@ Symfony is the result of the work of many people who made the code better - Lebnik - nsbx - Shude + - Richard Hodgson - Ondřej Führer - Sema - Elan Ruusamäe @@ -2134,6 +2159,7 @@ Symfony is the result of the work of many people who made the code better - Benjamin Long - Ben Miller - Peter Gribanov + - Matteo Galli - kwiateusz - jspee - Ilya Bulakh @@ -2172,6 +2198,7 @@ Symfony is the result of the work of many people who made the code better - Lin Lu - arduanov - sualko + - Molkobain - Bilge - ADmad - Nicolas Roudaire @@ -2282,6 +2309,7 @@ Symfony is the result of the work of many people who made the code better - Wouter Sioen (wouter_sioen) - Xavier Amado (xamado) - Jesper Søndergaard Pedersen (zerrvox) + - Alexander Menshchikov (zmey_kk) - Florent Cailhol - szymek - Kovacs Nicolas diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index 651cdb9c3b..c34377fa0d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -544,7 +544,7 @@ class Configuration implements ConfigurationInterface ->scalarNode('cookie_domain')->end() ->enumNode('cookie_secure')->values([true, false, 'auto'])->end() ->booleanNode('cookie_httponly')->defaultTrue()->end() - ->enumNode('cookie_samesite')->values([null, Cookie::SAMESITE_LAX, Cookie::SAMESITE_STRICT])->defaultNull()->end() + ->enumNode('cookie_samesite')->values([null, Cookie::SAMESITE_LAX, Cookie::SAMESITE_STRICT, Cookie::SAMESITE_NONE])->defaultNull()->end() ->booleanNode('use_cookies')->end() ->scalarNode('gc_divisor')->end() ->scalarNode('gc_probability')->defaultValue(1)->end() diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php index f7500f05e3..28103a3522 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php @@ -144,7 +144,7 @@ class RememberMeFactory implements SecurityFactoryInterface if ('secure' === $name) { $builder->enumNode($name)->values([true, false, 'auto'])->defaultValue('auto' === $value ? null : $value); } elseif ('samesite' === $name) { - $builder->enumNode($name)->values([null, Cookie::SAMESITE_LAX, Cookie::SAMESITE_STRICT])->defaultValue($value); + $builder->enumNode($name)->values([null, Cookie::SAMESITE_LAX, Cookie::SAMESITE_STRICT, Cookie::SAMESITE_NONE])->defaultValue($value); } elseif (\is_bool($value)) { $builder->booleanNode($name)->defaultValue($value); } else { diff --git a/src/Symfony/Component/Cache/Adapter/FilesystemTagAwareAdapter.php b/src/Symfony/Component/Cache/Adapter/FilesystemTagAwareAdapter.php index 2e8f6419dc..615af35e13 100644 --- a/src/Symfony/Component/Cache/Adapter/FilesystemTagAwareAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/FilesystemTagAwareAdapter.php @@ -11,12 +11,10 @@ namespace Symfony\Component\Cache\Adapter; -use Symfony\Component\Cache\Exception\LogicException; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\Traits\FilesystemTrait; -use Symfony\Component\Filesystem\Filesystem; /** * Stores tag id <> cache id relationship as a symlink, and lookup on invalidation calls. @@ -27,8 +25,8 @@ use Symfony\Component\Filesystem\Filesystem; class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements PruneableInterface { use FilesystemTrait { - doSave as doSaveCache; - doDelete as doDeleteCache; + doSave as private doSaveCache; + doDelete as private doDeleteCache; } /** @@ -36,11 +34,6 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune */ private const TAG_FOLDER = 'tags'; - /** - * @var Filesystem|null - */ - private $fs; - public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, MarshallerInterface $marshaller = null) { $this->marshaller = $marshaller ?? new DefaultMarshaller(); @@ -55,7 +48,6 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune { $failed = $this->doSaveCache($values, $lifetime); - $fs = $this->getFilesystem(); // Add Tags as symlinks foreach ($addTagData as $tagId => $ids) { $tagFolder = $this->getTagFolder($tagId); @@ -65,12 +57,15 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune } $file = $this->getFile($id); - $fs->symlink($file, $this->getFile($id, true, $tagFolder)); + + if (!@symlink($file, $this->getFile($id, true, $tagFolder))) { + @unlink($file); + $failed[] = $id; + } } } // Unlink removed Tags - $files = []; foreach ($removeTagData as $tagId => $ids) { $tagFolder = $this->getTagFolder($tagId); foreach ($ids as $id) { @@ -78,10 +73,9 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune continue; } - $files[] = $this->getFile($id, false, $tagFolder); + @unlink($this->getFile($id, false, $tagFolder)); } } - $fs->remove($files); return $failed; } @@ -94,15 +88,12 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune $ok = $this->doDeleteCache($ids); // Remove tags - $files = []; - $fs = $this->getFilesystem(); foreach ($tagData as $tagId => $idMap) { $tagFolder = $this->getTagFolder($tagId); foreach ($idMap as $id) { - $files[] = $this->getFile($id, false, $tagFolder); + @unlink($this->getFile($id, false, $tagFolder)); } } - $fs->remove($files); return $ok; } @@ -113,33 +104,45 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune protected function doInvalidate(array $tagIds): bool { foreach ($tagIds as $tagId) { - $tagsFolder = $this->getTagFolder($tagId); - if (!file_exists($tagsFolder)) { + if (!file_exists($tagsFolder = $this->getTagFolder($tagId))) { continue; } - foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($tagsFolder, \FilesystemIterator::SKIP_DOTS)) as $itemLink) { - if (!$itemLink->isLink()) { - throw new LogicException('Expected a (sym)link when iterating over tag folder, non link found: '.$itemLink); + set_error_handler(static function () {}); + + try { + if (rename($tagsFolder, $renamed = substr_replace($tagsFolder, bin2hex(random_bytes(4)), -1))) { + $tagsFolder = $renamed.\DIRECTORY_SEPARATOR; + } else { + $renamed = null; } - $valueFile = $itemLink->getRealPath(); - if ($valueFile && file_exists($valueFile)) { - @unlink($valueFile); + foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($tagsFolder, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::CURRENT_AS_PATHNAME)) as $itemLink) { + unlink(realpath($itemLink) ?: $itemLink); + unlink($itemLink); } - @unlink((string) $itemLink); + if (null === $renamed) { + continue; + } + + $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + + for ($i = 0; $i < 38; ++$i) { + for ($j = 0; $j < 38; ++$j) { + rmdir($tagsFolder.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j]); + } + rmdir($tagsFolder.$chars[$i]); + } + rmdir($renamed); + } finally { + restore_error_handler(); } } return true; } - private function getFilesystem(): Filesystem - { - return $this->fs ?? $this->fs = new Filesystem(); - } - private function getTagFolder(string $tagId): string { return $this->getFile($tagId, false, $this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR).\DIRECTORY_SEPARATOR; diff --git a/src/Symfony/Component/DomCrawler/Crawler.php b/src/Symfony/Component/DomCrawler/Crawler.php index 57331af77a..f176d1c646 100644 --- a/src/Symfony/Component/DomCrawler/Crawler.php +++ b/src/Symfony/Component/DomCrawler/Crawler.php @@ -595,18 +595,18 @@ class Crawler implements \Countable, \IteratorAggregate * * Pass true as the 2nd argument to normalize whitespaces. * - * @param mixed $default When provided and the current node is empty, this value is returned and no exception is thrown - * @param bool $normalizeWhitespace Whether whitespaces should be trimmed and normalized to single spaces + * @param string|null $default When not null: the value to return when the current node is empty + * @param bool $normalizeWhitespace Whether whitespaces should be trimmed and normalized to single spaces * * @return string The node value * * @throws \InvalidArgumentException When current node is empty */ - public function text(/* $default = null, bool $normalizeWhitespace = false */) + public function text(/* string $default = null, bool $normalizeWhitespace = false */) { if (!$this->nodes) { - if (0 < \func_num_args()) { - return func_get_arg(0); + if (0 < \func_num_args() && null !== func_get_arg(0)) { + return (string) func_get_arg(0); } throw new \InvalidArgumentException('The current node list is empty.'); @@ -624,17 +624,17 @@ class Crawler implements \Countable, \IteratorAggregate /** * Returns the first node of the list as HTML. * - * @param mixed $default When provided and the current node is empty, this value is returned and no exception is thrown + * @param string|null $default When not null: the value to return when the current node is empty * * @return string The node html * * @throws \InvalidArgumentException When current node is empty */ - public function html(/* $default = null */) + public function html(/* string $default = null */) { if (!$this->nodes) { - if (0 < \func_num_args()) { - return func_get_arg(0); + if (0 < \func_num_args() && null !== func_get_arg(0)) { + return (string) func_get_arg(0); } throw new \InvalidArgumentException('The current node list is empty.'); diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php index ce23fbde42..376a00c11f 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php @@ -40,7 +40,11 @@ final class DateTimeImmutableToDateTimeTransformer implements DataTransformerInt throw new TransformationFailedException('Expected a \DateTimeImmutable.'); } - return \DateTime::createFromFormat(\DateTime::RFC3339, $value->format(\DateTime::RFC3339)); + if (\PHP_VERSION_ID >= 70300) { + return \DateTime::createFromImmutable($value); + } + + return \DateTime::createFromFormat('U.u', $value->format('U.u'))->setTimezone($value->getTimezone()); } /** diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php index 9313e4f178..c8b6549778 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php @@ -16,16 +16,33 @@ use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeImmutableToDat class DateTimeImmutableToDateTimeTransformerTest extends TestCase { - public function testTransform() + /** + * @dataProvider provider + */ + public function testTransform(\DateTime $expectedOutput, \DateTimeImmutable $input) { $transformer = new DateTimeImmutableToDateTimeTransformer(); - $input = new \DateTimeImmutable('2010-02-03 04:05:06 UTC'); - $expectedOutput = new \DateTime('2010-02-03 04:05:06 UTC'); $actualOutput = $transformer->transform($input); - $this->assertInstanceOf(\DateTime::class, $actualOutput); $this->assertEquals($expectedOutput, $actualOutput); + $this->assertEquals($expectedOutput->getTimezone(), $actualOutput->getTimezone()); + } + + public function provider() + { + return [ + [ + new \DateTime('2010-02-03 04:05:06 UTC'), + new \DateTimeImmutable('2010-02-03 04:05:06 UTC'), + ], + [ + (new \DateTime('2019-10-07 +11:00')) + ->setTime(14, 27, 11, 10042), + (new \DateTimeImmutable('2019-10-07 +11:00')) + ->setTime(14, 27, 11, 10042), + ], + ]; } public function testTransformEmpty() @@ -43,16 +60,17 @@ class DateTimeImmutableToDateTimeTransformerTest extends TestCase $transformer->transform(new \DateTime()); } - public function testReverseTransform() + /** + * @dataProvider provider + */ + public function testReverseTransform(\DateTime $input, \DateTimeImmutable $expectedOutput) { $transformer = new DateTimeImmutableToDateTimeTransformer(); - $input = new \DateTime('2010-02-03 04:05:06 UTC'); - $expectedOutput = new \DateTimeImmutable('2010-02-03 04:05:06 UTC'); $actualOutput = $transformer->reverseTransform($input); - $this->assertInstanceOf(\DateTimeImmutable::class, $actualOutput); $this->assertEquals($expectedOutput, $actualOutput); + $this->assertEquals($expectedOutput->getTimezone(), $actualOutput->getTimezone()); } public function testReverseTransformEmpty() diff --git a/src/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php b/src/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php index 32624c963f..3f6150ba9f 100644 --- a/src/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php +++ b/src/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php @@ -80,9 +80,9 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter } $dotenvVars = []; - foreach (explode(',', getenv('SYMFONY_DOTENV_VARS')) as $name) { - if ('' !== $name && false !== $value = getenv($name)) { - $dotenvVars[$name] = $value; + foreach (explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? '') as $name) { + if ('' !== $name && isset($_ENV[$name])) { + $dotenvVars[$name] = $_ENV[$name]; } } diff --git a/src/Symfony/Component/Messenger/Tests/Transport/Doctrine/DoctrineIntegrationTest.php b/src/Symfony/Component/Messenger/Tests/Transport/Doctrine/DoctrineIntegrationTest.php index 6770733964..fa05a43b0b 100644 --- a/src/Symfony/Component/Messenger/Tests/Transport/Doctrine/DoctrineIntegrationTest.php +++ b/src/Symfony/Component/Messenger/Tests/Transport/Doctrine/DoctrineIntegrationTest.php @@ -21,29 +21,27 @@ use Symfony\Component\Messenger\Transport\Doctrine\Connection; */ class DoctrineIntegrationTest extends TestCase { + /** @var \Doctrine\DBAL\Connection */ private $driverConnection; + /** @var Connection */ private $connection; + /** @var string */ + private $sqliteFile; - /** - * @after - */ - public function cleanup() + protected function setUp(): void { - @unlink(sys_get_temp_dir().'/symfony.messenger.sqlite'); - } - - /** - * @before - */ - public function createConnection() - { - $dsn = getenv('MESSENGER_DOCTRINE_DSN') ?: 'sqlite:///'.sys_get_temp_dir().'/symfony.messenger.sqlite'; + $this->sqliteFile = sys_get_temp_dir().'/symfony.messenger.sqlite'; + $dsn = getenv('MESSENGER_DOCTRINE_DSN') ?: 'sqlite:///'.$this->sqliteFile; $this->driverConnection = DriverManager::getConnection(['url' => $dsn]); $this->connection = new Connection([], $this->driverConnection); - // call send to auto-setup the table - $this->connection->setup(); - // ensure the table is clean for tests - $this->driverConnection->exec('DELETE FROM messenger_messages'); + } + + protected function tearDown(): void + { + $this->driverConnection->close(); + if (file_exists($this->sqliteFile)) { + unlink($this->sqliteFile); + } } public function testConnectionSendAndGet() @@ -75,6 +73,7 @@ class DoctrineIntegrationTest extends TestCase public function testItRetrieveTheFirstAvailableMessage() { + $this->connection->setup(); // insert messages // one currently handled $this->driverConnection->insert('messenger_messages', [ @@ -108,6 +107,7 @@ class DoctrineIntegrationTest extends TestCase public function testItCountMessages() { + $this->connection->setup(); // insert messages // one currently handled $this->driverConnection->insert('messenger_messages', [ @@ -148,6 +148,7 @@ class DoctrineIntegrationTest extends TestCase public function testItRetrieveTheMessageThatIsOlderThanRedeliverTimeout() { + $this->connection->setup(); $twoHoursAgo = new \DateTime('now'); $twoHoursAgo->modify('-2 hours'); $this->driverConnection->insert('messenger_messages', [ @@ -173,10 +174,7 @@ class DoctrineIntegrationTest extends TestCase public function testTheTransportIsSetupOnGet() { - // If the table does not exist and we call the get (i.e run messenger:consume) the table must be setup - // so first delete the tables - $this->driverConnection->exec('DROP TABLE messenger_messages'); - + $this->assertFalse($this->driverConnection->getSchemaManager()->tablesExist('messenger_messages')); $this->assertNull($this->connection->get()); $this->connection->send('the body', ['my' => 'header']); diff --git a/src/Symfony/Component/Messenger/Transport/Doctrine/Connection.php b/src/Symfony/Component/Messenger/Transport/Doctrine/Connection.php index ea42b0a6fd..193e920c40 100644 --- a/src/Symfony/Component/Messenger/Transport/Doctrine/Connection.php +++ b/src/Symfony/Component/Messenger/Transport/Doctrine/Connection.php @@ -51,12 +51,14 @@ class Connection private $configuration = []; private $driverConnection; private $schemaSynchronizer; + private $autoSetup; public function __construct(array $configuration, DBALConnection $driverConnection, SchemaSynchronizer $schemaSynchronizer = null) { $this->configuration = array_replace_recursive(self::DEFAULT_OPTIONS, $configuration); $this->driverConnection = $driverConnection; $this->schemaSynchronizer = $schemaSynchronizer ?? new SingleDatabaseSynchronizer($this->driverConnection); + $this->autoSetup = $this->configuration['auto_setup']; } public function getConfiguration(): array @@ -130,9 +132,7 @@ class Connection public function get(): ?array { - if ($this->configuration['auto_setup']) { - $this->setup(); - } + get: $this->driverConnection->beginTransaction(); try { $query = $this->createAvailableMessagesQueryBuilder() @@ -169,6 +169,11 @@ class Connection } catch (\Throwable $e) { $this->driverConnection->rollBack(); + if ($this->autoSetup && $e instanceof TableNotFoundException) { + $this->setup(); + goto get; + } + throw $e; } } @@ -212,6 +217,8 @@ class Connection } else { $this->driverConnection->getConfiguration()->setFilterSchemaAssetsExpression($assetFilter); } + + $this->autoSetup = false; } public function getMessageCount(): int @@ -225,10 +232,6 @@ class Connection public function findAll(int $limit = null): array { - if ($this->configuration['auto_setup']) { - $this->setup(); - } - $queryBuilder = $this->createAvailableMessagesQueryBuilder(); if (null !== $limit) { $queryBuilder->setMaxResults($limit); @@ -243,10 +246,6 @@ class Connection public function find($id): ?array { - if ($this->configuration['auto_setup']) { - $this->setup(); - } - $queryBuilder = $this->createQueryBuilder() ->where('m.id = ?'); @@ -287,8 +286,12 @@ class Connection $stmt = $this->driverConnection->prepare($sql); $stmt->execute($parameters); } catch (TableNotFoundException $e) { + if ($this->driverConnection->isTransactionActive()) { + throw $e; + } + // create table - if (!$this->driverConnection->isTransactionActive() && $this->configuration['auto_setup']) { + if ($this->autoSetup) { $this->setup(); } // statement not prepared ? SQLite throw on exception on prepare if the table does not exist diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf index db534528d1..bfa9b1284e 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf @@ -334,6 +334,38 @@ This value should be valid JSON. Verdien er ikke gyldig JSON. + + This collection should contain only unique elements. + Samlingen kan kun inneholde unike elementer. + + + This value should be positive. + Denne verdien må være positiv. + + + This value should be either positive or zero. + Denne verdien må være positiv eller null. + + + This value should be negative. + Denne verdien må være negativ. + + + This value should be either negative or zero. + Denne verdien må være negativ eller null. + + + This value is not a valid timezone. + Verdien er ikke en gyldig tidssone. + + + This password has been leaked in a data breach, it must not be used. Please use another password. + Dette passordet er lekket i et datainnbrudd, det må ikke tas i bruk. Vennligst bruk et annet passord. + + + This value should be between {{ min }} and {{ max }}. + Verdien må være mellom {{ min }} og {{ max }}. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf index b3e8f0f42f..bf7da2f06c 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf @@ -334,6 +334,38 @@ This value should be valid JSON. Detta värde ska vara giltig JSON. + + This collection should contain only unique elements. + Denna samling bör endast innehålla unika element. + + + This value should be positive. + Detta värde bör vara positivt. + + + This value should be either positive or zero. + Detta värde bör vara antingen positivt eller noll. + + + This value should be negative. + Detta värde bör vara negativt. + + + This value should be either negative or zero. + Detta värde bör vara antingen negativt eller noll. + + + This value is not a valid timezone. + Detta värde är inte en giltig tidszon. + + + This password has been leaked in a data breach, it must not be used. Please use another password. + Det här lösenordet har läckt ut vid ett dataintrång, det får inte användas. Använd ett annat lösenord. + + + This value should be between {{ min }} and {{ max }}. + Detta värde bör ligga mellan {{ min }} och {{ max }}. + diff --git a/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php b/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php index 27a45bff26..ad7bb7166f 100644 --- a/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php +++ b/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php @@ -33,7 +33,8 @@ class SymfonyCaster $clone = null; foreach (self::$requestGetters as $prop => $getter) { - if (null === $a[Caster::PREFIX_PROTECTED.$prop]) { + $key = Caster::PREFIX_PROTECTED.$prop; + if (\array_key_exists($key, $a) && null === $a[$key]) { if (null === $clone) { $clone = clone $request; } @@ -47,7 +48,9 @@ class SymfonyCaster public static function castHttpClient($client, array $a, Stub $stub, $isNested) { $multiKey = sprintf("\0%s\0multi", \get_class($client)); - $a[$multiKey] = new CutStub($a[$multiKey]); + if (isset($a[$multiKey])) { + $a[$multiKey] = new CutStub($a[$multiKey]); + } return $a; }