diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0870dcfdd5cc4..f6d70f0581cc3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -24,13 +24,8 @@ /src/Symfony/Component/Form/ @xabbuh @yceruto # HttpKernel /src/Symfony/Component/HttpKernel/Log/Logger.php @dunglas -# LDAP -/src/Symfony/Component/Ldap/ @csarrazi # Lock /src/Symfony/Component/Lock/ @jderusse -# Messenger -/src/Symfony/Bridge/Doctrine/Messenger/ @sroze -/src/Symfony/Component/Messenger/ @sroze # OptionsResolver /src/Symfony/Component/OptionsResolver/ @yceruto # PropertyInfo diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e6333054fe172..58caff2209f37 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@ | Q | A | ------------- | --- -| Branch? | 6.1 for features / 4.4, 5.4 or 6.0 for bug fixes +| Branch? | 6.2 for features / 4.4, 5.4, 6.0 or 6.1 for bug fixes | Bug fix? | yes/no | New feature? | yes/no | Deprecations? | yes/no diff --git a/.github/composer-config.json b/.github/composer-config.json index 6e17bc21e4582..bf796b6b3d85a 100644 --- a/.github/composer-config.json +++ b/.github/composer-config.json @@ -7,6 +7,9 @@ "symfony/proxy-manager-bridge": "source", "symfony/validator": "source", "*": "dist" + }, + "allow-plugins": { + "symfony/flex": true } } } diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2836521932ddf..0000000000000 --- a/.travis.yml +++ /dev/null @@ -1,123 +0,0 @@ -language: php - -dist: bionic - -git: - depth: 1 - -addons: - apt_packages: - - parallel - - zookeeperd - - libzookeeper-mt-dev - -matrix: - include: - - php: 7.3 - fast_finish: true - -cache: - directories: - - .phpunit - - ~/php-ext - -before_install: - - | - # General configuration - set -e - stty cols 120 - sudo sed -i 's/127\.0\.1\.1 localhost/127.0.0.1 localhost/' /etc/hosts - cp .github/composer-config.json "$(composer config home)/config.json" - - nanoseconds () { - local cmd="date" - local format="+%s%N" - local os=$(uname) - if hash gdate > /dev/null 2>&1; then - cmd="gdate" - elif [[ "$os" = Darwin ]]; then - format="+%s000000000" - fi - $cmd -u $format - } - export -f nanoseconds - - # tfold is a helper to create folded reports - tfold () { - local title="$PHP $1" - local fold=$(echo $title | sed -r 's/[^-_A-Za-z0-9]+/./g') - shift - local id=$(printf %08x $(( RANDOM * RANDOM ))) - local start=$(nanoseconds) - echo -e "travis_fold:start:$fold" - echo -e "travis_time:start:$id" - echo -e "\\e[1;34m$title\\e[0m" - - bash -xc "$*" 2>&1 - local ok=$? - local end=$(nanoseconds) - echo -e "\\ntravis_time:end:$id:start=$start,finish=$end,duration=$(($end-$start))" - (exit $ok) && - echo -e "\\e[32mOK\\e[0m $title\\n\\ntravis_fold:end:$fold" || - echo -e "\\e[41mKO\\e[0m $title\\n" - (exit $ok) - } - export -f tfold - - # tpecl is a helper to compile and cache php extensions - tpecl () { - local ext_name=$1 - local ext_so=$2 - local INI=$3 - local input=${4:-yes} - local ext_dir=$(php -r "echo ini_get('extension_dir');") - local ext_cache=~/php-ext/$(basename $ext_dir)/$ext_name - - if [[ -e $ext_cache/$ext_so ]]; then - echo extension = $ext_cache/$ext_so >> $INI - else - rm ~/.pearrc /tmp/pear 2>/dev/null || true - mkdir -p $ext_cache - echo $input | pecl -q install -f $ext_name && - cp $ext_dir/$ext_so $ext_cache - fi - } - export -f tpecl - - - | - # php.ini configuration - for PHP in $TRAVIS_PHP_VERSION $php_extra; do - INI=~/.phpenv/versions/$PHP/etc/conf.d/travis.ini - echo date.timezone = Europe/Paris >> $INI - echo memory_limit = -1 >> $INI - echo default_socket_timeout = 10 >> $INI - echo session.gc_probability = 0 >> $INI - echo opcache.enable_cli = 1 >> $INI - echo apc.enable_cli = 1 >> $INI - done - find ~/.phpenv -name xdebug.ini -delete - - composer self-update - composer self-update --2 - - - | - # Install extra PHP extensions - for PHP in $TRAVIS_PHP_VERSION $php_extra; do - export PHP=$PHP - phpenv global $PHP - INI=~/.phpenv/versions/$PHP/etc/conf.d/travis.ini - if [[ $PHP != 8.* ]]; then - tfold ext.zookeeper tpecl zookeeper-0.7.2 zookeeper.so $INI - fi - done - -install: - - export COMPONENTS=$(find src/Symfony -mindepth 2 -type f -name phpunit.xml.dist -not -wholename '*/Bridge/PhpUnit/*' -printf '%h\n' | sort) - - export COMPOSER_ROOT_VERSION=$(grep ' VERSION = ' src/Symfony/Component/HttpKernel/Kernel.php | grep -P -o '[0-9]+\.[0-9]+').x-dev - - composer update --no-progress --ansi - - ./phpunit install - -script: - - echo "$COMPONENTS" | parallel --gnu -j +3 "tfold {} ./phpunit --exclude-group tty,benchmark,intl-data {}" - - tfold src/Symfony/Component/Console.tty ./phpunit src/Symfony/Component/Console --group tty - - tfold src/Symfony/Bridge/Twig.tty ./phpunit src/Symfony/Bridge/Twig --group tty diff --git a/CHANGELOG-4.4.md b/CHANGELOG-4.4.md index 6d426f3b98105..823de8fa24c9f 100644 --- a/CHANGELOG-4.4.md +++ b/CHANGELOG-4.4.md @@ -7,6 +7,41 @@ in 4.4 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.4.0...v4.4.1 +* 4.4.42 (2022-05-27) + + * bug #46448 [DependencyInjection] Fix "proxy" tag: resolve its parameters and pass it to child definitions (nicolas-grekas) + * bug #46442 [FrameworkBundle] Revert "bug #46125 Always add CacheCollectorPass (fancyweb)" (chalasr) + * bug #46443 [DoctrineBridge] Don't reinit managers when they are proxied as ghost objects (nicolas-grekas) + * bug #46427 [FrameworkBundle] fix wiring of annotations.cached_reader (nicolas-grekas) + * bug #46434 [FrameworkBundle] Fix BC break in abstract config commands (yceruto) + * bug #46424 [Form] do not accept array input when a form is not multiple (xabbuh) + * bug #46367 [Mime] Throw exception when body in Email attach method is not ok (alamirault) + * bug #46421 [VarDumper][VarExporter] Deal with DatePeriod->include_end_date on PHP 8.2 (nicolas-grekas) + * bug #46401 [Cache] Throw when "redis_sentinel" is used with a non-Predis "class" option (buffcode) + * bug #46414 Bootstrap 4 fieldset for row errors (konradkozaczenko) + * bug #46412 [FrameworkBundle] Fix dumping extension config without bundle (yceruto) + * bug #46407 [Filesystem] Safeguard (sym)link calls (derrabus) + * bug #46098 [Form] Fix same choice loader with different choice values (HeahDude) + * bug #46380 [HttpClient] Add missing HttpOptions::setMaxDuration() (nicolas-grekas) + * bug #46249 [HttpFoundation] [Session] Regenerate invalid session id (peter17) + * bug #46366 [Mime] Add null check for EmailHeaderSame (magikid) + * bug #46364 [Config] Fix looking for single files in phars with GlobResource (nicolas-grekas) + * bug #46365 [HttpKernel] Revert "bug #46327 Allow ErrorHandler ^5.0 to be used" (nicolas-grekas) + * bug #46114 Fixes "Incorrectly nested style tag found" error when using multi-line header content (Perturbatio) + * bug #46325 [Ldap] Fix LDAP connection options (buffcode) + * bug #46317 [Security/Http] Ignore invalid URLs found in failure/success paths (nicolas-grekas) + * bug #46327 [HttpKernel] Allow ErrorHandler ^5.0 to be used in HttpKernel 4.4 (mpdude) + * bug #46297 [Serializer] Fix JsonSerializableNormalizer ignores circular reference handler in $context (BreyndotEchse) + * bug #45981 [Serializer][PropertyInfo] Fix support for "false" built-in type on PHP 8.2 (alexandre-daubois) + * bug #46277 [HttpKernel] Fix SessionListener without session in request (edditor) + * bug #46282 [DoctrineBridge] Treat firstResult === 0 like null (derrabus) + * bug #46278 [Workflow] Fix deprecated syntax for interpolated strings (nicolas-grekas) + * bug #46264 [Console] Better required argument check in InputArgument (jnoordsij) + * bug #46262 [EventDispatcher] Fix removing listeners when using first-class callable syntax (javer) + * bug #46216 [Form] fix populating single widget time view data with different timezones (xabbuh) + * bug #46221 [DomCrawler][VarDumper] Fix html-encoding emojis (nicolas-grekas) + * bug #46167 [VarExporter] Fix exporting DateTime objects on PHP 8.2 (nicolas-grekas) + * 4.4.41 (2022-04-27) * bug #46154 [Mailer] Restore X-Transport after failure (zenas1210) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index bd30bf752af21..b20e486f89471 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -7,471 +7,437 @@ The Symfony Connect username in parenthesis allows to get more information - Fabien Potencier (fabpot) - Nicolas Grekas (nicolas-grekas) - Christian Flothmann (xabbuh) - - Alexander M. Turek (derrabus) - Bernhard Schussek (bschussek) - - Tobias Schultze (tobion) + - Alexander M. Turek (derrabus) - Robin Chalas (chalas_r) + - Tobias Schultze (tobion) - Christophe Coevoet (stof) - - Jérémy DERUSSÉ (jderusse) - - Wouter De Jong (wouterj) + - Jordi Boggiano (seldaek) - Grégoire Pineau (lyrixx) - Maxime Steinhausser (ogizanagi) - Kévin Dunglas (dunglas) - - Thomas Calvet (fancyweb) - - Jordi Boggiano (seldaek) - Victor Berchet (victor) - - Javier Eguiluz (javier.eguiluz) - - Ryan Weaver (weaverryan) + - Jérémy DERUSSÉ (jderusse) + - Thomas Calvet (fancyweb) - Roland Franssen (ro0) - - Jakub Zalas (jakubzalas) + - Wouter de Jong (wouterj) - Johannes S (johannes) + - Ryan Weaver (weaverryan) - Kris Wallsmith (kriswallsmith) + - Jakub Zalas (jakubzalas) + - Javier Eguiluz (javier.eguiluz) + - Yonel Ceruto (yonelceruto) - Tobias Nyholm (tobias) - - Yonel Ceruto González (yonelceruto) - - Oskar Stark (oskarstark) - Hugo Hamon (hhamon) - - Ait Boudad Abdellatif (aitboudad) - Samuel ROZE (sroze) - - Romain Neutron (romain) + - Oskar Stark (oskarstark) - Pascal Borreli (pborreli) - - Jules Pietri (heah) + - Romain Neutron - Joseph Bielawski (stloyd) - - Amrouche Hamza (simperfit) - - Karma Dordrak (drak) + - Drak (drak) + - Abdellatif Ait boudad (aitboudad) - Lukas Kahwe Smith (lsmith) + - Hamza Amrouche (simperfit) - Martin Hasoň (hason) - Jeremy Mikola (jmikola) - Jean-François Simon (jfsimon) - Benjamin Eberlei (beberlei) + - Igor Wiedler + - Jules Pietri - Jan Schädlich (jschaedl) - - Igor Wiedler (igorw) - - Eriksen Costa (eriksencosta) - Kevin Bond (kbond) - - Ener-Getick (energetick) - - Sarah Khalil (saro0h) + - Jonathan Wage (jwage) - Jérôme Tamarelle (gromnan) - - Pierre du Plessis (pierredup) - - Vasilij Duško (staff) - Valentin Udaltsov (vudaltsov) - - Iltar van der Berg (kjarli) - - Jonathan Wage (jwage) - Matthias Pigulla (mpdude) - - Diego Saint Esteben (dosten) - - Grégoire Paris (greg0ire) - Alexandre Salomé (alexandresalome) - - William Durand (couac) + - Grégoire Paris (greg0ire) + - William DURAND - ornicar - - Titouan Galopin (tgalopin) - - Konstantin Myakshin (koc) - Dany Maillard (maidmaid) - - Francis Besset (francisbesset) + - Eriksen Costa + - Diego Saint Esteben (dosten) - stealth35 ‏ (stealth35) - Alexander Mols (asm89) - - Laurent VOULLEMIER (lvo) - - Vasilij Dusko | CREATION + - Pierre du Plessis (pierredup) + - Francis Besset (francisbesset) - Bulat Shakirzyanov (avalanche123) + - Iltar van der Berg - David Maicher (dmaicher) - - Gábor Egyed (1ed) - - gadelat (gadelat) + - Gabriel Ostrolucký (gadelat) + - Miha Vrhovnik (mvrhov) - Saša Stamenković (umpirsky) - - Peter Rehm (rpet) - - Henrik Bjørnskov (henrikbjorn) - - Antoine M (amakdessi) - - Miha Vrhovnik + - Titouan Galopin (tgalopin) + - Gábor Egyed (1ed) - Mathieu Piot (mpiot) - - Diego Saint Esteben (dii3g0) + - Sarah Khalil (saro0h) - Konstantin Kudryashov (everzet) - - Vladimir Reznichenko (kalessil) + - Guilhem N (guilhemn) - Bilal Amarni (bamarni) + - Eriksen Costa - Florin Patan (florinpatan) - - Jáchym Toušek (enumag) - - Alex Pott - - Michel Weimerskirch (mweimerskirch) + - Vladimir Reznichenko (kalessil) + - Peter Rehm (rpet) + - Vasilij Duško (staff) + - Henrik Bjørnskov (henrikbjorn) + - Antoine Makdessi (amakdessi) + - Laurent VOULLEMIER (lvo) - Andrej Hudec (pulzarraider) - Christian Raue - - Issei Murasawa (issei_m) - Eric Clemmons (ericclemmons) - - Graham Campbell (graham) - - Charles Sarrazin (csarrazi) - - Alexander Schranz (alexander-schranz) - - Vasilij Dusko + - Michel Weimerskirch (mweimerskirch) + - Issei Murasawa (issei_m) - Douglas Greenshields (shieldo) - - David Buchmann (dbu) + - Jáchym Toušek (enumag) + - Alexander Schranz (alexander-schranz) + - Denis (yethee) - Arnout Boks (aboks) - - Deni + - Charles Sarrazin (csarrazi) + - David Buchmann (dbu) - Henrik Westphal (snc) - Dariusz Górecki (canni) + - Ener-Getick + - Alex Pott - Fran Moreno (franmomu) + - Graham Campbell (graham) - HypeMC (hypemc) - - Jérôme Vasseur (jvasseur) - - Mathieu Santostefano (welcomattic) - - Dariusz Ruminski - Lee McDermott - Brandon Turner - Luis Cordova (cordoval) - Daniel Holmes (dholmes) - - Sebastiaan Stok (sstok) - - Alexandre Daubois (alexandre-daubois) - Toni Uebernickel (havvg) - Bart van den Burg (burgov) + - Vasilij Dusko | CREATION - Jordan Alliot (jalliot) + - Mathieu Santostefano (welcomattic) - John Wards (johnwards) - - Tomas Norkūnas (norkunas) - - Julien Falque (julienfalque) - - Vincent Langlet (deviling) - - Baptiste Clavié (talus) - - Massimiliano Arione (garak) - - Mathias Arlaud (mtarld) + - Dariusz Ruminski + - Konstantin Myakshin (koc) - Antoine Hérault (herzult) - - Paráda József (paradajozsef) + - Alexandre Daubois (alexandre-daubois) + - Julien Falque (julienfalque) + - Konstantin.Myakshin - Arnaud Le Blanc (arnaud-lb) - - Przemysław Bogusz (przemyslaw-bogusz) + - Sebastiaan Stok (sstok) - Maxime STEINHAUSSER - - Michal Piotrowski (eventhorizon) - - Tomáš Votruba (tomas_votruba) + - Massimiliano Arione (garak) - Tim Nagel (merk) - Chris Wilkinson (thewilkybarkid) - - Peter Kokot (maastermedia) - - Lars Strojny (lstrojny) + - Jérôme Vasseur (jvasseur) - Brice BERNARD (brikou) - - Ahmed TAILOULOUTE (ahmedtai) - - Gregor Harlan (gharlan) + - Jules Pietri + - Tomas Norkūnas (norkunas) + - Michal Piotrowski - marc.weistroff + - Peter Kokot (maastermedia) + - Lars Strojny (lstrojny) - lenar - - Alexander Schwenn (xelaris) - - Jérémy Romey (jeremyfreeagent) - Włodzimierz Gajda (gajdaw) - - Christian Scheb - Adrien Brault (adrienbrault) - - Maxime Helias (maxhelias) - - Yanick Witschi (toflar) - Jacob Dreesen (jdreesen) - - Malte Schlüter (maltemaltesich) - - Joel Wurtz (brouznouf) - - Théo FIDRY (theofidry) + - Théo FIDRY - Florian Voutzinos (florianv) - Teoh Han Hui (teohhanhui) + - Przemysław Bogusz (przemyslaw-bogusz) - Colin Frei - Javier Spagnoletti (phansys) - - Gary PEGEOT (gary-p) + - Vincent Langlet (deviling) + - excelwebzone + - HeahDude + - Joel Wurtz (brouznouf) + - Paráda József (paradajozsef) + - Baptiste Clavié (talus) + - Alexander Schwenn (xelaris) + - Fabien Pennequin (fabienpennequin) + - Gordon Franke (gimler) + - Malte Schlüter (maltemaltesich) - Ruud Kamphuis (ruudk) - - Joshua Thijssen + - Vasilij Dusko + - Yanick Witschi (toflar) - Daniel Wehner (dawehner) - Tugdual Saunier (tucksaun) - - excelwebzone - - Gordon Franke (gimler) - - Saif Eddin Gmati (azjezz) - - Richard van Laak (rvanlaak) - - Jesse Rushlow (geeshoe) - - Fabien Pennequin (fabienpennequin) - - Olivier Dolbeau (odolbeau) - - Smaine Milianni (ismail1432) - - Eric GELOEN (gelo) - - Matthieu Napoli (mnapoli) - - Ion Bazan (ionbazan) - - Jannik Zschiesche (apfelbox) + - Mathias Arlaud (mtarld) - Robert Schönthal (digitalkaoz) - - Florian Lonqueu-Brochard (florianlb) - - Tigran Azatyan (tigranazatyan) - - YaFou - - Gabriel Caruso (carusogabriel) + - Eric GELOEN (gelo) + - Gary PEGEOT (gary-p) + - Gabriel Caruso + - Joshua Thijssen - Stefano Sala (stefano.sala) - - Andréia Bohner (andreia) - - Evgeniy (ewgraf) - - Vincent AUBERT (vincent) + - Mathieu Lechat (mat_the_cat) + - Maxime Helias (maxhelias) + - OGAWA Katsuhiro (fivestar) + - Jhonny Lidfors (jhonne) + - jeremyFreeAgent (jeremyfreeagent) - Juti Noppornpitak (shiroyuki) - - Simon Berger - - Anthony MARTIN (xurudragon) - - Alexander Menshchikov (zmey_kk) + - Gregor Harlan (gharlan) + - Smaine Milianni (ismail1432) + - Anthony MARTIN - Sebastian Hörl (blogsh) + - Tigran Azatyan (tigranazatyan) + - Ion Bazan (ionbazan) - Daniel Gomes (danielcsgomes) - Hidenori Goto (hidenorigoto) - - Jan Rosier (rosier) - - Alessandro Chitolina (alekitto) - - Albert Casademont (acasademont) - Arnaud Kleinpeter (nanocom) - Guilherme Blanco (guilhermeblanco) - - Marco Pivetta (ocramius) - SpacePossum - - Pablo Godel (pgodel) + - Richard van Laak (rvanlaak) - Andreas Braun - - Jérémie Augustin (jaugustin) + - Pablo Godel (pgodel) + - Tomáš Votruba (tomas_votruba) - François-Xavier de Guillebon (de-gui_f) - - Oleg Voronkovich - - hacfi (hifi) + - Alessandro Chitolina (alekitto) - Rafael Dohms (rdohms) - - George Mponos (gmponos) - jwdeitch - - Jeroen Spee (jeroens) + - Saif Eddin Gmati (azjezz) - Jérôme Parmentier (lctrs) - - Fabien Bourigault (fbourigault) - - Joe Bennett (kralos) + - Ahmed TAILOULOUTE (ahmedtai) - Michael Babker (mbabker) - - Mikael Pajunen - - Andreas Schempp (aschempp) - - Alessandro Lai (jean85) - - Romaric Drigon (romaricdrigon) - - Christopher Hertel (chertel) + - Jérémy Derussé + - Matthieu Napoli (mnapoli) - Arman Hosseini (arman) + - Sokolov Evgeniy (ewgraf) - Rokas Mikalkėnas (rokasm) + - Andréia Bohner (andreia) - Niels Keurentjes (curry684) - Vyacheslav Pavlov - - Andreas Möller (localheinz) + - Albert Casademont (acasademont) + - George Mponos (gmponos) - Richard Shank (iampersistent) - - Wouter J - - Thomas Rabaix (rande) - - Chi-teck - - Baptiste Leduc (korbeil) - - Timo Bakx (timobakx) + - Marco Pivetta (ocramius) - Vincent Touzet (vincenttouzet) - - Nate Wiebe (natewiebe13) + - Simon Berger + - Olivier Dolbeau (odolbeau) - Rouven Weßling (realityking) - - Ben Davies (bendavies) + - YaFou - Clemens Tolboom + - Oleg Voronkovich - Helmer Aaviksoo - - Remon van de Kamp (rpkamp) - - Filippo Tessarotto (slamdunk) - - Hiromi Hishida (77web) - - Michael Käfer (michael_kaefer) + - 77web - Matthieu Ouellette-Vachon (maoueh) - Michał Pipa (michal.pipa) - Dawid Nowak - - Martin Hujer (martinhujer) + - Jannik Zschiesche - Roman Martinuk (a2a4) - Amal Raghav (kertz) - - Jonathan Ingram (jonathaningram) + - Jonathan Ingram - Artur Kotyrba + - Wouter J - Tyson Andre - GDIBass - Samuel NELA (snela) - - David Prévot - - Hugo Monteiro (monteiro) - - Dmitrii Poddubnyi (karser) + - Vincent AUBERT (vincent) + - Fabien Bourigault (fbourigault) - zairig imad (zairigimad) - - Tien Vo (tienvx) - Colin O'Dell (colinodell) - - Timothée Barray (tyx) + - Ben Davies (bendavies) - James Halsall (jaitsu) + - Christian Scheb + - Guillaume (guill) - Florent Mata (fmata) + - Christopher Hertel (chertel) + - Mikael Pajunen - Warnar Boekkooi (boekkooi) - - Benjamin Leveque (benji07) + - Justin Hileman (bobthecow) + - Alessandro Lai (jean85) + - Anthony GRASSIOT (antograssiot) - Dmitrii Chekaliuk (lazyhammer) - Clément JOBEILI (dator) - - Mathieu Lechat (mat_the_cat) - - Jeroen Noten (jeroennoten) + - Tom Van Looy (tvlooy) - Marek Štípek (maryo) + - Jesse Rushlow (geeshoe) - Daniel Espendiller - - Possum + - Arnaud PETITPAS (apetitpa) - Dorian Villet (gnutix) - - Michaël Perrin (michael.perrin) + - Martin Hujer (martinhujer) - Sergey Linnik (linniksa) - - Richard Miller (mr_r_miller) + - Richard Miller - Mario A. Alvarez Garcia (nomack84) - - Dennis Benkert (denderello) + - Thomas Rabaix (rande) + - D (denderello) - DQNEO - - Hidde Wieringa (hiddewie) - - Antonio Pauletich (x-coder264) + - David Prévot - Andre Rømcke (andrerom) - - Philippe Segatori - - Thibaut Cheymol (tcheymol) - - Sebastien Morel (plopix) - - mcfedr (mcfedr) - - Nicolas Philippe (nikophil) + - Jeroen Spee (jeroens) + - Andreas Schempp (aschempp) - Ruben Gonzalez (rubenrua) - Benjamin Dulau (dbenjamin) - - Baptiste Lafontaine (magnetik) + - mcfedr (mcfedr) + - Remon van de Kamp - Mathieu Lemoine (lemoinem) - - Justin Hileman (bobthecow) - - Denis Brumann (dbrumann) - Christian Schmidt - Andreas Hucks (meandmymonkey) - - Tom Van Looy (tvlooy) - - Guillaume Pédelagrabe + - Jan Rosier (rosier) - Noel Guilbert (noel) - - Anthony GRASSIOT (antograssiot) - Stadly - Stepan Anchugov (kix) - - François Pluchino (francoispluchino) - bronze1man - sun (sun) - Larry Garfield (crell) - - Edi Modrić (emodric) - - Gocha Ossinkine (ossinkine) + - Michael Käfer (michael_kaefer) + - Andreas Möller (localheinz) - Leo Feyer (leofeyer) + - Philipp Wahala (hifi) - Nikolay Labinskiy (e-moe) - Martin Schuhfuß (usefulthink) - apetitpa - - Matthieu Bontemps (mbontemps) - - apetitpa - - Guilliam Xavier - Pierre Minnieur (pminnieur) - - fivestar - Dominique Bongiraud - - dFayet - - Jeremy Livingston (jeremylivingston) - - Karoly Gossler (connorhu) - - soyuka - - Michael Lee (zerustech) - - Matthieu Auger (matthieuauger) + - Hugo Monteiro (monteiro) + - Baptiste Leduc (korbeil) + - Timo Bakx (timobakx) + - Dmitrii Poddubnyi (karser) + - Julien Pauli + - Florian Lonqueu-Brochard (florianlb) + - Joe Bennett (kralos) - Leszek Prabucki (l3l0) - - Emanuele Panzeri (thepanz) - François Zaninotto (fzaninotto) - Dustin Whittle (dustinwhittle) - jeff - John Kary (johnkary) + - Võ Xuân Tiến (tienvx) - fd6130 (fdtvui) - - Blanchon Vincent (blanchonvincent) - Maciej Malarz (malarzm) - Michele Orselli (orso) + - Denis Brumann (dbrumann) - Sven Paulus (subsven) - - Daniel STANCU - Maxime Veber (nek-) - - Sylvain Fabre (sylfabre) - - Loick Piera (pyrech) - - Clara van Miert - Valentine Boineau (valentineboineau) - - Bastien Jaillot (bastnic) - Rui Marinho (ruimarinho) - Patrick Landolt (scube) - - Michał (bambucha15) - - Eugene Wissner - - Bohan Yang (brentybh) + - Filippo Tessarotto (slamdunk) + - Jeroen Noten (jeroennoten) + - Possum + - Jérémie Augustin (jaugustin) + - Edi Modrić (emodric) - Pascal Montoya - - Julien Brochet (mewt) - - Tristan Darricau (nicofuma) + - Julien Brochet + - Gocha Ossinkine (ossinkine) + - François Pluchino (francoispluchino) + - Tristan Darricau (tristandsensio) - Victor Bocharsky (bocharsky_bw) - - Bozhidar Hristov (warxcell) + - henrikbjorn + - Fritz Michael Gschwantner (fritzmg) - Marcel Beerta (mazen) - - Thomas Landauer (thomas-landauer) - - Pavel Batanov (scaytrase) + - Chi-teck - Mantis Development - - Loïc Faugeron - - quentin neyrat (qneyrat) - - Marcin Szepczynski (czepol) + - Guilliam Xavier + - Hidde Wieringa (hiddewie) + - dFayet + - Antonio Pauletich (x-coder264) - Rob Frawley 2nd (robfrawley) - - Ahmed Raafat - - julien pauli (jpauli) - - Lorenz Schori - - Sébastien Lavoie (lavoiesl) + - Nikita Konstantinov (unkind) + - Michael Lee (zerustech) - Dariusz + - soyuka - Farhad Safarov (safarov) + - Nate Wiebe (natewiebe13) - Hugo Alliaume (kocal) - - BoShurik - - Thomas Lallement (raziel057) - Michael Voříšek - Francois Zaninotto - - Claude Khedhiri (ck-developer) - - Alexander Kotynia (olden) - Daniel Tschinder - Christian Schmidt - - Marcos Sánchez + - Alexander Kotynia (olden) - Elnur Abdurrakhimov (elnur) - Manuel Reinhard (sprain) - - Harm van Tilborg (hvt) - - Danny Berger (dpb587) - - Antonio J. García Lagar (ajgarlag) + - Nicolas Philippe (nikophil) - Adam Prager (padam87) - - Judicaël RUFFIEUX (axanagor) - Benoît Burnichon (bburnichon) - - Roman Marintšenko (inori) + - maxime.steinhausser + - Roman Ring (inori) - Xavier Montaña Carreras (xmontana) - - Mickaël Andrieu (mickaelandrieu) + - Timothée Barray (tyx) + - Romaric Drigon (romaricdrigon) + - Sylvain Fabre (sylfabre) - Soner Sayakci - Xavier Perez - Arjen Brouwer (arjenjb) - - Katsuhiro OGAWA - Artem Lopata - Patrick McDougle (patrick-mcdougle) - Marc Weistroff (futurecat) + - Danny Berger (dpb587) - Alif Rachmawadi - Anton Chernikov (anton_ch1989) - - Kristen Gilden (kgilden) - - Pierre-Yves LEBECQ (pylebecq) + - Pierre-Yves Lebecq (pylebecq) + - Benjamin Leveque (benji07) - Jordan Samouh (jordansamouh) - - Jakub Kucharovic (jkucharovic) - Sullivan SENECHAL (soullivaneuh) - - Thomas Bisignani (toma) + - Loick Piera (pyrech) - Uwe Jäger (uwej711) - Dāvis Zālītis (k0d3r1s) + - Lynn van der Berg (kjarli) + - Michaël Perrin (michael.perrin) - Eugene Leonovich (rybakit) - Joseph Rouff (rouffj) - Félix Labrecque (woodspire) - GordonsLondon - - Nguyen Xuan Quynh (xuanquynh) - Jan Sorgalla (jsor) - Ray + - Philipp Cordes (corphi) - Chekote - Aleksandar Jakovljevic (ajakov) - Thomas Adam - - Jhonny Lidfors (jhonne) - - Diego Agulló (aeoris) + - Thomas Landauer (thomas-landauer) - jdhoek - Jurica Vlahoviček (vjurica) - Bob den Otter (bopp) - Thomas Schulz (king2500) - - Frank de Jonge (frenkynet) - - Artem Henvald (artemgenvald) - - Lescot Edouard (idetox) - - Nikita Konstantinov - - Wodor Wodorski - - Guilhem N (guilhemn) - - Mohammad Emran Hasan (phpfour) + - Frank de Jonge + - Jules Pietri + - Sebastien Morel (plopix) - Christopher Davis (chrisguitarguy) - - Dmitriy Mamontov (mamontovdmitriy) - - Ben Ramsey (ramsey) - - Laurent Masforné (heisenberg) + - Karoly Gossler (connorhu) + - Matthieu Auger (matthieuauger) + - Josip Kruslin (jkruslin) + - Thomas Lallement (raziel057) - Sergey (upyx) - Giorgio Premi - - Guillaume (guill) - renanbr - - Matthew Smeets - - Alex Rock Ancelet (pierstoval) + - Sébastien Lavoie (lavoiesl) + - Alex Rock (pierstoval) + - Wodor Wodorski - Beau Simensen (simensen) - - Johann Pardanaud - - Michael Hirschler (mvhirsch) - Robert Kiss (kepten) - - Zan Baldwin (zanderbaldwin) - - Roumen Damianoff (roumen) + - Zan Baldwin (zanbaldwin) + - Antonio J. García Lagar (ajgarlag) + - Alexandre Quercia (alquerci) + - Marcos Sánchez + - BoShurik + - Zmey - Kim Hemsø Rasmussen (kimhemsoe) - - Oleg Andreyev - - Martin Herndl (herndlm) - - Pavel Kirpitsov (pavel-kirpichyov) + - Oleg Andreyev (oleg.andreyev) + - jaugustin - Pascal Luna (skalpa) - Wouter Van Hecke + - Baptiste Lafontaine (magnetik) - Iker Ibarguren (ikerib) - - Bob van de Vijver (bobvandevijver) + - Indra Gunawan (indragunawan) - Peter Kruithof (pkruithof) - Antoine Lamirault - Michael Holm (hollo) - Arjen van der Meijden - - Markus Fasselt (digilist) - - Damien Alexandre (damienalexandre) - - Simon Mönch (sm) + - Blanchon Vincent (blanchonvincent) + - Michał (bambucha15) - Christian Schmidt - Marcin Sikoń (marphi) - - Gonzalo Vilaseca (gonzalovilaseca) - Ben Hakim - - Haralan Dobrev (hkdobrev) - Marco Petersen (ocrampete16) - - MatTheCat + - Bohan Yang (brentybh) + - Bastien Jaillot (bastnic) - Vilius Grigaliūnas - David Badura (davidbadura) - - Chad Sikorra (chadsikorra) - Alan Poulain (alanpoulain) - Chris Smith (cs278) + - Thomas Bisignani (toma) - Florian Klein (docteurklein) - W0rma - Manuel Kiessling (manuelkiessling) - - Dimitri Gritsajuk (ottaviano) - Alexey Kopytko (sanmai) - - Gijs van Lammeren - - Pol Dellaiera (drupol) - Atsuhiro KUBO (iteman) - - Alireza Mirsepassi (alirezamirsepassi) - rudy onfroy (ronfroy) - Serkan Yildiz (srknyldz) - Andrew Moore (finewolf) - Bertrand Zuchuat (garfield-fr) + - Marc Morera (mmoreram) - Sébastien Alfaiate (seb33300) - Gabor Toth (tgabi333) - realmfoo @@ -479,216 +445,198 @@ The Symfony Connect username in parenthesis allows to get more information - Andrey Esaulov (andremaha) - Grégoire Passault (gregwar) - Jerzy Zawadzki (jzawadzki) - - Phil Taylor (prazgod) - Ismael Ambrosi (iambrosi) - Craig Duncan (duncan3dc) - Emmanuel BORGES (eborges78) - Aurelijus Valeiša (aurelijus) - Jan Decavele (jandc) - Gustavo Piltcher - - flack (flack) - Stepan Tanasiychuk (stfalcon) - Ivan Kurnosov - Tiago Ribeiro (fixe) - - Hidde Boomsma (hboomsma) - - John Bafford (jbafford) - Raul Fraile (raulfraile) - Adrian Rudnik (kreischweide) + - Pavel Batanov (scaytrase) - Francesc Rosàs (frosas) - - Romain Pierre (romain-pierre) - - Julien Galenski (ruian) - - Dieter - Bongiraud Dominique - Kyle - janschoenherr - Emanuele Gaspari (inmarelibero) - Dariusz Rumiński - - Chris Tanaskoski - - James Hemery - - Berny Cantos (xphere81) - Andrii Bodnar - - Thierry Thuon (lepiaf) - - Antonio Jose Cerezo (ajcerezo) - - Ricard Clau (ricardclau) - - Mark Challoner (markchalloner) - - Loïc Frémont (loic425) - - Oleksandr Barabolia (oleksandrbarabolia) + - Artem (artemgenvald) + - Thierry T (lepiaf) + - Lorenz Schori + - Jeremy Livingston (jeremylivingston) - ivan - - Greg Anderson - - Tri Pham (phamuyentri) - Urinbayev Shakhobiddin (shokhaa) - - Gennady Telegin (gtelegin) - - Krystian Marcisz (simivar) - - Toni Rudolf (toooni) - - Dalibor Karlović (dkarlovi) + - Ahmed Raafat + - Philippe Segatori + - Thibaut Cheymol (tcheymol) - Erin Millard - - Artur Melo (restless) - Matthew Lewinski (lewinski) - Magnus Nordlander (magnusnordlander) - - Carlos Pereira De Amorim (epitre) - - Rodrigo Aguilera - - Vladimir Varlamov (iamvar) + - Islam Israfilov (islam93) + - Ricard Clau (ricardclau) + - Roumen Damianoff - Thomas Royer (cydonia7) - Nicolas LEFEVRE (nicoweb) - - alquerci + - Emanuele Panzeri (thepanz) - Mateusz Sip (mateusz_sip) - Francesco Levorato - Vitaliy Zakharov (zakharovvi) - Tobias Sjösten (tobiassjosten) - Gyula Sallai (salla) - - Benjamin Cremer (bcremer) + - Bob van de Vijver (bobvandevijver) - Hendrik Luup (hluup) - Inal DJAFAR (inalgnu) - Christian Gärtner (dagardner) + - Martin Herndl (herndlm) - Dmytro Borysovskyi (dmytr0) - Tomasz Kowalczyk (thunderer) + - Johann Pardanaud + - Pavel Kirpitsov (pavel-kirpichyov) - Artur Eshenbrener - - Dries Vints + - Harm van Tilborg (hvt) - Thomas Perez (scullwm) - Yoann RENARD (yrenard) + - smoench - Felix Labrecque - Yaroslav Kiliba - Terje Bråten - - Renan Gonçalves (renan_saddam) + - Gonzalo Vilaseca (gonzalovilaseca) + - Markus Fasselt (digilist) - Tim Goudriaan (codedmonkey) - Tarmo Leppänen (tarlepp) - Martin Auswöger + - Jakub Kucharovic (jkucharovic) + - Daniel STANCU + - Kristen Gilden - Hubert Lenoir (hubert_lenoir) - Robbert Klarenbeek (robbertkl) - Hamza Makraz (makraz) - Eric Masoero (eric-masoero) - Vitalii Ekert (comrade42) - - JhonnyL + - Clara van Miert + - Haralan Dobrev (hkdobrev) - hossein zolfi (ocean) + - Alexander Menshchikov - Clément Gautier (clementgautier) - - Koen Reiniers (koenre) - - Sanpi + - Damien Alexandre (damienalexandre) + - Sanpi (sanpi) - Eduardo Gulias (egulias) - giulio de donato (liuggio) - - Mohamed Gamal - ShinDarth - Stéphane PY (steph_py) - Philipp Kräutli (pkraeutli) - Rhodri Pugh (rodnaph) - - Grzegorz Zdanowski (kiler129) - - Kirill chEbba Chebunin (chebba) - - Fritz Michael Gschwantner (fritzmg) + - Grzegorz (Greg) Zdanowski (kiler129) + - Dimitri Gritsajuk (ottaviano) + - Kirill chEbba Chebunin + - Pol Dellaiera (drupol) - + - Alex (aik099) - Fabien Villepinte - SiD (plbsid) - - Matthew Grasmick - Greg Thornton (xdissent) - - BENOIT POLASZEK (bpolaszek) - Alex Bowers - - Piotr Kugla (piku235) - - Philipp Cordes - - Jeroen Thora (bolle) + - Quynh Xuan Nguyen (seriquynh) - Costin Bereveanu (schniper) - - Loïc Chardonnet (gnusat) - Marek Kalnik (marekkalnik) - Vyacheslav Salakhutdinov (megazoll) + - Maksym Slesarenko (maksym_slesarenko) - Hassan Amouhzi + - Warxcell (warxcell) - Daniel Gorgan - Tamas Szijarto - Michele Locati - Pavel Volokitin (pvolok) - Arthur de Moulins (4rthem) - Matthias Althaus (althaus) - - Nicolas Dewez (nicolas_dewez) - Saif Eddin G - Endre Fejes - Tobias Naumann (tna) - - Greg ORIOL - Daniel Beyer - - Manuel Alejandro Paz Cetina + - flack (flack) - Shein Alexey - - Jacek Jędrzejewski (jacek.jedrzejewski) - - Romain Gautier (mykiwi) - - Stefan Kruppa + - Phil Taylor (prazgod) - Joe Lencioni - Daniel Tschinder + - Diego Agulló (aeoris) - vladimir.reznichenko - Kai - Lee Rowlands - - Krzysztof Piasecki (krzysztek) - Maximilian Reichel (phramz) - Alain Hippolyte (aloneh) - Grenier Kévin (mcsky_biig) - Karoly Negyesi (chx) - Xavier HAUSHERR - Albert Jessurum (ajessu) + - Romain Pierre - Laszlo Korte - Jonathan Scheiber (jmsche) - - Miha Vrhovnik - Alessandro Desantis - hubert lecorche (hlecorche) - Vladyslav Loboda - - fritzmg - Marc Morales Valldepérez (kuert) - - Jean-Baptiste GOMOND (mjbgo) - - Vadim Kharitonov (virtuozzz) + - Vadim Kharitonov (vadim) - Oscar Cubo Medina (ocubom) - Karel Souffriau - Christophe L. (christophelau) - - Sander Toonen (xatoo) - Anthon Pang (robocoder) + - Julien Galenski (ruian) + - Ben Scott (bpscott) - Marko Kaznovac (kaznovac) - Pablo Lozano (arkadis) - - Marc Laporte - - Michał Jusięga - - Bernd Stellwag - - Sébastien Santoro (dereckson) - - Gennadi Janzen - Brian King - - Michel Salib (michelsalib) - - geoffrey + - quentin neyrat (qneyrat) + - Chris Tanaskoski - Steffen Roßkamp - Alexandru Furculita (afurculita) - - Valentin Jonovs (valentins-jonovs) - - Bastien DURAND (deamon) + - Michel Salib (michelsalib) + - Valentin Jonovs + - geoffrey - Jeanmonod David (jeanmonod) - - Christin Gruber (christingruber) - - Andrey Sevastianov - Webnet team (webnet) - - marie + - Ben Ramsey (ramsey) + - Berny Cantos (xphere81) + - Antonio Jose Cerezo (ajcerezo) + - Marcin Szepczynski (czepol) + - Lescot Edouard (idetox) + - Mohammad Emran Hasan (phpfour) + - Dmitriy Mamontov (mamontovdmitriy) - Jan Schumann - - Noémi Salaün (noemi-salaun) - Niklas Fiekas - - Philippe Segatori + - Mark Challoner (markchalloner) - Markus Bachmann (baachi) - Kévin THERAGE (kevin_therage) - - Michel Hunziker - Gunnstein Lye (glye) - - scyzoryck - - Matthias Krauser (mkrauser) - Erkhembayar Gantulga (erheme318) - Alexis Lefebvre - - Lorenzo Millucci (lmillucci) - - Jérôme Tamarelle (jtamarelle-prismamedia) - - Andrii Popov (andrii-popov) - - Islam93 + - Greg Anderson - lancergr - - Mihai Stancu + - Tri Pham (phamuyentri) - Ivan Nikolaev (destillat) - Gildas Quéméner (gquemener) - - Pierrick VIGNAND (pierrick) + - Laurent Masforné (heisenberg) + - Claude Khedhiri (ck-developer) - Desjardins Jérôme (jewome62) - Arturs Vonda - - Josip Kruslin - - Xavier Briand (xavierbriand) + - Matthew Smeets + - Toni Rudolf (toooni) - Asmir Mustafic (goetas) - - DerManoMann - - Stefan Gehrig (sgehrig) - vagrant - - Aurimas Niekis (gcds) - - EdgarPE - - Florian Pfitzer (marmelatze) + - Benjamin Cremer (bcremer) - Asier Illarramendi (doup) + - AKeeman (akeeman) - Martijn Cuppens + - Restless-ET - Vlad Gregurco (vgregurco) - Boris Vujicic (boris.vujicic) + - Dries Vints + - Judicaël RUFFIEUX (axanagor) - Chris Sedlmayr (catchamonkey) - - Indra Gunawan (indragunawan) + - DerManoMann - Jérôme Tanghe (deuchnord) - Mathias STRASSER (roukmoute) - simon chrzanowski (simonch) @@ -700,9 +648,8 @@ The Symfony Connect username in parenthesis allows to get more information - Marcin Michalski (marcinmichalski) - Vitaliy Tverdokhlib (vitaliytv) - Ariel Ferrandini (aferrandini) - - Niklas Keller - Dirk Pahl (dirkaholic) - - cedric lombardot (cedriclombardot) + - Cédric Lombardot (cedriclombardot) - Dane Powell - Arkadius Stefanski (arkadius) - Jonas Flodén (flojon) @@ -710,519 +657,413 @@ The Symfony Connect username in parenthesis allows to get more information - Tobias Weichart - Miro Michalicka - M. Vondano - - Dominik Zogg (dominik.zogg) - - Marek Pietrzak - - Tavo Nieves J + - Dominik Zogg + - Tavo Nieves J (tavoniievez) - Luc Vieillescazes (iamluc) - Lukáš Holeczy (holicz) - Erik Saunier (snickers) - - franek (franek) + - François Dume (franek) - Jerzy (jlekowski) - Raulnet - - Christian Wahler - Giso Stallenberg (gisostallenberg) - - Gintautas Miselis - Rob Bast - Roberto Espinoza (respinoza) - Pierre Rineau - - Andreas Leathley (iquito) - - Soufian EZ-ZANTAR (soezz) - - Arun Philip - - Zander Baldwin + - Soufian EZ ZANTAR (soezz) - Marek Zajac - Adam Harvey + - Cătălin Dan (dancatalin) + - ilyes kooli (skafandri) - Anton Bakai - - Vadim Borodavko (javer) - - Xesxen - battye - Sam Fleming (sam_fleming) - - William Arslett - Alex Bakhturin - Patrick Reimers (preimers) + - Brayden Williams (redstar504) - insekticid - - Alexander Obuhovich (aik099) - Jérémy M (th3mouk) - - Vitaliy Ryaboy (vitaliy) - boombatower - - Fabrice Bernhard (fabriceb) + - Alireza Mirsepassi (alirezamirsepassi) - Jérôme Macias (jeromemacias) - Andrey Astakhov (aast) - ReenExe - - Adrien Lucas (adrienlucas) - Fabian Lange (codingfabian) - - Frank Neff (fneff) - - Roman Lapin (memphys) - Yoshio HANAWA - - Randy Geraads - Jan van Thoor (janvt) - - Gladhon - Joshua Nye - Martin Kirilov (wucdbm) + - Koen Reiniers (koenre) - Nathan Dench (ndenc2) - - Thibault Richard (t-richard) + - Gijs van Lammeren - Sebastian Bergmann - - Miroslav Sustek + - Matthew Grasmick + - Miroslav Šustek (sustmi) - Pablo Díez (pablodip) - - Michel Roca (mroca) - Kevin McBride - Sergio Santoro - - Robin van der Vleuten (robinvdvleuten) - Philipp Rieber (bicpi) - Manuel de Ruiter (manuel) - Nathanael Noblet (gnat) - nikos.sotiropoulos + - BENOIT POLASZEK (bpolaszek) - Eduardo Oliveira (entering) - Oleksii Zhurbytskyi - Bilge - - Ilya Antipenko (aivus) + - Eugene Wissner - Ricardo Oliveira (ricardolotr) - Roy Van Ginneken (rvanginneken) - - Steve Grunwell - ondrowan - Barry vd. Heuvel (barryvdh) - - Jon Dufresne + - Chad Sikorra (chadsikorra) - Fabien S (bafs) - Evan S Kaufman (evanskaufman) - - Alex Bacart - mcben - Jérôme Vieilledent (lolautruche) - Roman Anasal - - Maks Slesarenko - Filip Procházka (fprochazka) - - mmoreram - - Yannick Ihmels (ihmels) + - Jeroen Thora (bolle) - Markus Lanthaler (lanthaler) - Remi Collet + - Piotr Kugla (piku235) - Vicent Soria Durá (vicentgodella) - Michael Moravec - - Carlos Buenosvinos (carlosbuenosvinos) - Leevi Graham (leevigraham) - Anthony Ferrara - Ioan Negulescu + - Greg ORIOL - Jakub Škvára (jskvara) - Andrew Udvare (audvare) - alexpods - - Dennis Langen (nijusan) - - Adrien Wilmet (adrienfr) - - Adam Szaraniec (mimol) + - Adam Szaraniec - Dariusz Ruminski - - Erik Trapman (eriktrapman) + - Romain Gautier (mykiwi) + - Matthieu Bontemps + - Erik Trapman - De Cock Xavier (xdecock) - - Almog Baku (almogbaku) - Evert Harmeling (evertharmeling) + - Nicolas Dewez (nicolas_dewez) - Scott Arciszewski - Xavier HAUSHERR - Norbert Orzechowicz (norzechowicz) - - stlrnz - - Denis Charrier (brucewouaigne) + - Fabrice Bernhard (fabriceb) - Matthijs van den Bos (matthijs) - - Simon Podlipsky (simpod) - - DemigodCode - bhavin (bhavin4u) - Jaik Dean (jaikdean) + - Krzysztof Piasecki (krzysztek) - Pavel Popov (metaer) - Lenard Palko - - arai - Nils Adermann (naderman) - Tom Klingenberg - Gábor Fási - - DUPUCH (bdupuch) - - Dadang NH (dadangnh) + - R. Achmad Dadang Nur Hidayanto (dadangnh) - Nate (frickenate) - - Joachim Løvgaard (loevgaard) - Stefan Kruppa - - jhonnyL + - Jacek Jędrzejewski (jacek.jedrzejewski) + - Stefan Kruppa - sasezaki - - Kristof Van Cauwenbergh (kristofvc) - Dawid Pakuła (zulusx) - - Marco Lipparini (liarco) - Florian Rey (nervo) - Rodrigo Borrego Bernabé (rodrigobb) + - John Bafford (jbafford) - Emanuele Iannone - - Jörn Lang (j.lang) - Petr Duda (petrduda) - - Marcos Rezende (rezehnde) + - Marcos Rezende (rezende79) - Denis Gorbachev (starfall) - - Peter van Dommelen - - Tim van Densen - Martin Morávek (keeo) - - Steven Surowiec - Kevin Saliou (kbsali) + - Steven Surowiec (steves) - Shawn Iwinski + - Dieter - Samuele Lilli (doncallisto) - Gawain Lynch (gawain) - - Peter Bowyer (pbowyer) - Wojciech Kania - - mmokhi - - NothingWeAre - - Andrii Dembitskyi + - mmokhi - Ryan - - Lctrs - Alexander Deruwe (aderuwe) - Dave Hulbert (dave1010) - - Konstantin Grachev (grachevko) - Ivan Rey (ivanrey) + - M. (mbontemps) - Marcin Chyłek (songoq) - - Ben Scott - Ned Schwartz - - Anderson Müller - Ziumin - - Jeremy Benoist - Lenar Lõhmus - - Daniël Brekelmans (dbrekelmans) - - Simon Heimberg (simon_heimberg) - - Benjamin Laugueux (yzalis) + - Sander Toonen (xatoo) - Zach Badgett (zachbadgett) + - Loïc Faugeron - Aurélien Fredouelle - Pavel Campr (pcampr) - Andrii Dembitskyi + - Forfarle (forfarle) - Johnny Robeson (johnny) - - Pavol Tuka - Disquedur - - Michiel Boeckaert (milio) - Benjamin Morel - - Dmitriy Derepko - Geoffrey Tran (geoff) - - Thiago Cordeiro (thiagocordeiro) - - Jan Behrens - - Dragos Protung (dragosprotung) + - Jannik Zschiesche + - Bernd Stellwag + - Jan Ole Behrens (deegital) - Romain Monteil (ker0x) - Mantas Var (mvar) - Terje Bråten - - Yann LUCAS (drixs6o9) - Sebastian Krebs - Piotr Stankowski - - Stewart Malik - - Stefan Graupner (efrane) - - Gemorroj (gemorroj) - - Baptiste Leduc (bleduc) - Julien Maulny - - Mihail Krasilnikov (krasilnikovm) - - iamvar - - Pierre Tondereau - - Alex Vo (votanlean) - - Daniel González (daniel.gonzalez) - - Piergiuseppe Longo - - Kevin Auivinet - - Aurélien MARTIN - - Malte Schlüter - - Jules Matsounga (hyoa) - - Quentin Dequippe (qdequippe) - - khoptynskyi - - Jean-Christophe Cuvelier [Artack] + - Gennadi Janzen + - James Hemery - julien57 - - Julien Montel (julienmgel) - Mátyás Somfai (smatyas) - - Alexandre Tranchant (alexandre_t) - - Anthony Moutte - - Thomas Ferney (thomasf) - - Simon DELICATA - - Hallison Boaventura (hallisonboaventura) + - Bastien DURAND (deamon) - Dmitry Simushev - alcaeus - - Thomas Talbot (ioni) - Fred Cox - - Iliya Miroslavov Iliev (i.miroslavov) - - Safonov Nikita (ns3777k) + - Simon DELICATA - vitaliytv - Egor Taranov - - Nicolas Martin (cocorambo) + - Philippe Segatori + - Loïc Frémont (loic425) - Jon Gotlin (jongotlin) - Adrian Nguyen (vuphuong87) - benjaminmal + - Andrey Sevastianov + - Oleksandr Barabolia (oleksandrbarabolia) - Khoo Yong Jun + - Christin Gruber (christingruber) - Sebastian Blum - - Laurent Clouet - - aubx + - Daniel González (daniel.gonzalez) - Julien Turby - - Marvin Butkereit - - Eduard Bulava (nonanerz) - Renan - Ricky Su (ricky) - - Igor Timoshenko (igor.timoshenko) + - scyzoryck - Kyle Evans (kevans91) - - Benoit Mallo - - Charles-Henri Bruyand - Max Rath (drak3) - - Valentin - - pizzaminded + - marie - Stéphane Escandell (sescandell) - - Konstantin S. M. Möllers (ksmmoellers) - Fractal Zombie - - linh - James Johnston + - Noémi Salaün (noemi-salaun) - Sinan Eldem - - Kajetan Kołtuniak (kajtii) - - Damien Fayet (rainst0rm) + - Gennady Telegin - Alexandre Dupuy (satchette) - - MatTheCat + - Michel Hunziker - Malte Blättermann - - Islam Israfilov (islam93) - Simeon Kolev (simeon_kolev9) - Joost van Driel (j92) - Jonas Elfering + - Mihai Stancu - Nahuel Cuesta (ncuesta) - Chris Boden (cboden) + - EStyles (insidestyles) - Christophe Villeger (seragan) + - Krystian Marcisz (simivar) + - Matthias Krauser (mkrauser) - Julien Fredon - - Jacek Wilczyński (jacekwilczynski) - Xavier Leune (xleune) - Hany el-Kerdany - Wang Jingyu - Åsmund Garfors - Maxime Douailin - - Jean Pasdeloup (pasdeloup) + - Jean Pasdeloup + - Michael Hirschler (mvhirsch) + - Lorenzo Millucci (lmillucci) - Javier López (loalf) - Reinier Kip + - Jérôme Tamarelle (jtamarelle-prismamedia) - Geoffrey Brier (geoffrey-brier) - Alexandre Parent - Roger Guasch (rogerguasch) - DT Inier (gam6itko) - Vladimir Tsykun - - Andrei O - Dustin Dobervich (dustin10) - Luis Tacón (lutacon) - Dmitrii Tarasov (dtarasov) - - Karl Shea - dantleech - Philipp Kolesnikov - - Valentin - Maxim Dovydenok (shiftby) - - Anne-Sophie Bachelard (annesophie) - Sebastian Marek (proofek) - - Jan Vernieuwe (vernija) + - Carlos Pereira De Amorim (epitre) - zenmate - - Michal Trojanowski - - j.schmitt + - Andrii Popov (andrii-popov) - David Fuhr - - Evgeny Anisiforov - - smoench - - Max Grigorian (maxakawizard) + - Rodrigo Aguilera + - Vladimir Varlamov (iamvar) + - Aurimas Niekis (gcds) - Martins Sipenko - Guilherme Augusto Henschel - Rostyslav Kinash - - Cristoforo Cervino (cristoforocervino) - Dennis Fridrich (dfridrich) - Mardari Dorel (dorumd) - Daisuke Ohata - Vincent Simonin + - Pierrick VIGNAND (pierrick) - Alex Bogomazov (alebo) - - maxime.steinhausser - - Claus Due (namelesscoder) - - adev - - Alexandru Patranescu + - aaa2000 (aaa2000) - Andy Palmer (andyexeter) - - Stefan Warman + - Stefan Warman (warmans) - Tristan Maindron (tmaindron) - - Behnoush norouzali (behnoush) + - Behnoush Norouzali (behnoush) - Marko H. Tamminen (gzumba) - Wesley Lancel + - Xavier Briand (xavierbriand) - Ke WANG (yktd26) - - Timothée BARRAY - - Nilmar Sanchez Muguercia - Ivo Bathke (ivoba) - - Ippei SUmida (ippey_s) + - Ippei Sumida (ippey_s) - David Molineus - Strate - - Jon Green - Anton A. Sumin - Israel J. Carberry - Miquel Rodríguez Telep (mrtorrent) + - Stefan Gehrig (sgehrig) - Sergey Kolodyazhnyy (skolodyazhnyy) - umpirski - Quentin de Longraye (quentinus95) - Chris Heng (gigablah) - - Shaun Simmons (simshaun) - Richard Bradley - - Ulumuddin Yunus (joenoez) + - Ulumuddin Cahyadi Yunus (joenoez) - rtek - - Benjamin Dos Santos - - Jérémy Jarrié (gagnar) - - Adrien Jourdier - - Tomas Javaisis - - Ivan Grigoriev + - Adrien Jourdier (eclairia) + - Florian Pfitzer (marmelatze) + - Ivan Grigoriev (greedyivan) - Johann Saunier (prophet777) - Kevin SCHNEKENBURGER - Fabien Salles (blacked) - - Andreas Erhard - - John VanDeWeghe - - Sergey Belyshkin + - Andreas Erhard (andaris) + - Sergey Belyshkin (sbelyshkin) - Michael Devery (mickadoo) - Antoine Corcy - Ahmed Ashraf (ahmedash95) - Gert Wijnalda (cinamo) - Luca Saba (lucasaba) - - maxime.perrimond - - Sascha Grossenbacher - - cthulhu - - Rémi Leclerc - - Jonas Hünig + - Sascha Grossenbacher (berdir) + - Robin Lehrmann - Szijarto Tamas - Thomas P - - Robin Lehrmann (robinlehrmann) - - Catalin Dan - Jaroslav Kuba - - Kristijan Kanalas - - Stephan Vock - Benjamin Zikarsky (bzikarsky) + - Kristijan Kanalaš (kristijan_kanalas_infostud) + - sl_toto (sl_toto) + - Marek Pietrzak (mheki) - “Filip - - Marion Hurteau - - Dmitrii Lozhkin - - Sobhan Sharifi (50bhan) - - Stephen - - Tomasz (timitao) - - Nguyen Tuan Minh (tuanminhgp) - - Malte Schlüter + - Mickaël Andrieu (mickaelandrieu) - Simon Watiau (simonwatiau) - Ruben Jacobs (rubenj) - Simon Schick (simonsimcity) - - redstar504 - Tristan Roussel + - Niklas Keller - Cameron Porter - Hossein Bukhamsin - Oliver Hoff + - William Arslett - Christian Sciberras (uuf6429) - - Arthur Woimbée - - Théo DELCEY - - Disparity - - Andrii Serdiuk (andreyserdjuk) - - dangkhoagms (dangkhoagms) - - Floran Brutel (notFloran) (floran) - origaminal - Matteo Beccati (matteobeccati) + - Renan Gonçalves (renan_saddam) + - Vitaliy Ryaboy (vitaliy) - Kevin (oxfouzer) - Paweł Wacławczyk (pwc) - - Sagrario Meneses - Oleg Zinchenko (cystbear) - Baptiste Meyer (meyerbaptiste) - - Stefano A. (stefano93) - Tales Santos (tsantos84) - Johannes Klauss (cloppy) - Evan Villemez - - Florian Hermann (fhermann) - fzerorubigd - Thomas Ploch - Benjamin Grandfond (benjamin) - Tiago Brito (blackmx) - - Roromix - - Maxime AILLOUD (mailloud) + - Gintautas Miselis (naktibalda) - Richard van den Brand (ricbra) - Toon Verwerft (veewee) - - mohammadreza honarkhah - develop - flip111 + - Douglas Hammond (wizhippo) - VJ - RJ Garcia - - Adam Wójs (awojs) + - Adrien Lucas (adrienlucas) - Delf Tonder (leberknecht) - - Paweł Niedzielski (steveb) - - Peter Jaap Blaakmeer - Ondrej Exner - Mark Sonnabaum - - Junaid Farooq (junaidfarooq) - Massimiliano Braglia (massimilianobraglia) - - Frankie Wittevrongel - Richard Quadling + - James Hudson (mrthehud) - Raphaëll Roussel - - Anton Kroshilin - Michael Lutz - - Javier Espinosa (javespi) - jochenvdv + - Michel Roca (mroca) - Reedy - Arturas Smorgun (asarturas) - - Andrea Sprega (asprega) - - Alexander Volochnev (exelenz) - - Viktor Bajraktar (njutn95) - - Mbechezi Nawo - - Michael Piecko + - Aleksandr Volochnev (exelenz) + - Robin van der Vleuten (robinvdvleuten) + - Grinbergs Reinis (shima5) + - Michael Piecko (michael.piecko) - Toni Peric (tperic) - yclian - Aleksey Prilipko - Jelle Raaijmakers (gmta) - - Damien Fa - Andrew Berry - - twifty - - Indra Gunawan (guind) + - Wybren Koelmans (wybren_koelmans) - Roberto Nygaard - - Peter Ward - Davide Borsatto (davide.borsatto) - - Guillaume Sainthillier (guillaume-sainthillier) - - Benjamin RICHARD (rebolon) - James Gilliland (neclimdul) - Gert de Pagter - - Ilya Ch. (ilya0) - Julien DIDIER (juliendidier) - - Ilia Sergunin (maranqz) - - marbul - - Dominik Ritter (dritter) + - Dalibor Karlović + - Randy Geraads + - Andreas Leathley (iquito) + - Vadim Borodavko (javer) - Sebastian Grodzicki (sgrodzicki) - - Florian Caron (shalalalala) + - Mohamed Gamal - Eric COURTIAL - - Jeroen van den Enden (stoefke) - - Aurélien Fontaine + - Xesxen + - Jeroen van den Enden (endroid) + - Arun Philip - Pascal Helfenstein - Baldur Rensch (brensch) - Carl Casbolt (carlcasbolt) - Vladyslav Petrovych - - Hugo Sales + - Loïc Chardonnet - Alex Xandra Albert Sim - - Carson Full - Sergey Yastrebov + - Carson Full (carsonfull) - kylekatarnls (kylekatarnls) - Trent Steel (trsteel88) + - Steve Grunwell - Yuen-Chi Lian - Tarjei Huse (tarjei) - Besnik Br - Axel Guckelsberger (guite) - Jose Gonzalez - - Jonathan (jls-esokia) - - Dariusz Ruminski + - Jonathan Sui Lioung Lee Slew (jlslew) - Claudio Zizza - - Zlatoslav Desyatnikov - - Wickex - - tuqqu - - Neagu Cristian-Doru (cristian-neagu) - - Dude (b1rdex) + - Anatoly Pashin (b1rdex) - Dave Marshall (davedevelopment) - Jakub Kulhan (jakubkulhan) - Shaharia Azam - avorobiev - Gerben Oolbekkink - - Kai - - Bartłomiej Zając + - Gladhon - stoccc - Grégoire Penverne (gpenverne) - Venu - - Lars Vierbergen - Jonatan Männchen - Dennis Hotson - Andrew Tchircoff (andrewtch) + - Lars Vierbergen (vierbergenlars) + - Xav` (xavismeh) - michaelwilliams - - Romain - - Matěj Humpál - - Pierre Grimaud (pgrimaud) - Alexandre Parent - 1emming - Nykopol (nykopol) + - Thibault Richard (t-richard) - Jordan Deitch - - Raphael Hardt - Casper Valdemar Poulsen - - SnakePin + - Guillaume Verstraete - vladimir.panivko - Josiah (josiah) - Dennis Væversted (srnzitcom) - - Guillaume Verstraete (versgui) - Joschi Kuphal - John Bohn (jbohn) - - Marc Morera (mmoreram) - - Jason Tan - - Julien Pauli - - Dominik Piekarski (dompie) - - Rares Sebastian Moldovan (raresmldvn) + - Jason Tan (jt2k) - Jérémy REYNAUD (babeuloula) + - Felds Liscia (felds) - Mathieu Rochette (mathroc) - - Victor Garcia - - Marek Víger (freezy) - Andrew Hilobok (hilobok) - Noah Heck (myesain) - Christian Soronellas (theunic) @@ -1230,78 +1071,76 @@ The Symfony Connect username in parenthesis allows to get more information - fedor.f - Yosmany Garcia (yosmanyga) - Jeremiasz Major - - Wouter de Wild - Trevor North - Degory Valentine - izzyp - - Benoit Lévêque (benoit_leveque) - Jeroen Fiege (fieg) - - Krzysiek Łabuś - - Juraj Surman - - Camille Dejoye - - 1ma (jautenim) - - Douglas Hammond (wizhippo) + - Martin (meckhardt) + - Marcel Hernandez + - Krzysztof Łabuś (crozin) - Xavier Lacot (xavier) + - Jon Dufresne - possum - Denis Zunke (donalberto) - - Ahmadou Waly Ndiaye (waly) + - _sir_kane (waly) - Antonin CLAUZIER (0x346e3730) - - moldman + - Olivier Maisonneuve - Jonathan Johnson (jrjohnson) - - Olivier Maisonneuve (olineuve) + - Andrei C. (moldman) + - Mike Meier (mykon) - Pedro Miguel Maymone de Resende (pedroresende) + - stlrnz - Masterklavi + - Adrien Wilmet (adrienfr) - Franco Traversaro (belinde) - Francis Turmel (fturmel) + - Yannick Ihmels (ihmels) - Nikita Nefedov (nikita2206) + - Alex Bacart - cgonzalez - hugovms - Ben - - roromix - - Dmitry Pigin (dotty) - Vincent Composieux (eko) + - Cyril Pascal (paxal) - Jayson Xu (superjavason) + - DemigodCode - fago - - popnikos - - Tito Costa - Jan Prieser - - GDIBass - Maximilian Bösing - - Thiago Melo + - Matt Johnson (gdibass) - Zhuravlev Alexander (scif) - Stefano Degenkamp (steef) - James Michael DuPont + - Carlos Buenosvinos (carlosbuenosvinos) - Christian Gripp (core23) - Jake (jakesoft) - - Flinsch - - Quentin Dreyer + - Vincent CHALAMON - Bahman Mehrdad (bahman) - - Jordan de Laune (jdelaune) - Christopher Hall (mythmakr) - - none (nelexa) - Patrick Dawkins (pjcdawkins) - Paul Kamer (pkamer) - Rafał Wrzeszcz (rafalwrzeszcz) - - Vincent CHALAMON (vincentchalamon) + - Nguyen Xuan Quynh - Reen Lokum + - Dennis Langen (nijusan) - Martin Parsiegla (spea) - - Bernhard Rusch + - Manuel Alejandro Paz Cetina + - Denis Charrier (brucewouaigne) + - Youssef Benhssaien (moghreb) - Mario Ramundo (rammar) - Ivan - - Quentin Schuler - Nico Haase + - Philipp Scheit (pscheit) - Pierre Vanliefland (pvanliefland) - Roy Klutman (royklutman) - Sofiane HADDAG (sofhad) + - Quentin Schuler (sukei) - frost-nzcr4 - - Taylor Otwell - Shahriar56 - - Sami Mussbach - Dhananjay Goratela - Kien Nguyen - - Foxprodev - - Eric Hertwig - - Niels Robin-Aubertin + - Bozhidar Hristov + - arai - Achilles Kaloeridis (achilles) - Laurent Bassin (lbassin) - Mouad ZIANI (mouadziani) @@ -1309,107 +1148,102 @@ The Symfony Connect username in parenthesis allows to get more information - andrey1s - Abhoryo - Fabian Vogler (fabian) + - Joachim Løvgaard (loevgaard) + - Simon Podlipsky (simpod) - Shakhobiddin - Korvin Szanto - Stéphan Kochen - - Steven Dubois - Arjan Keeman - - siganushka - Alaattin Kahramanlar (alaattin) - Sergey Zolotov (enleur) + - Nicole Cordes (ichhabrecht) - Maksim Kotlyar (makasim) + - siganushka (siganushka) - Neil Ferreira - Julie Hourcade (juliehde) - Dmitry Parnas (parnas) - - Paul LE CORRE - Loïc Beurlet - - Sébastien COURJEAN - Ana Raro - Ana Raro - Tony Malzhacker - - Pchol - - Mathieu MARCHOIS + - Andreas Lutro (anlutro) + - DUPUCH (bdupuch) - Cyril Quintin (cyqui) - - Cyrille Bourgois (cyrilleb) - Gerard van Helden (drm) - Florian Wolfsjaeger (flowolf) - Ivan Sarastov (isarastov) - Johnny Peck (johnnypeck) - Jordi Sala Morales (jsala) + - Loic Chardonnet - Ivan Menshykov - David Romaní - Patrick Allaert + - Alexander Li (aweelex) - Gustavo Falco (gfalco) - Matt Robinson (inanimatt) + - Kristof Van Cauwenbergh (kristofvc) + - Marco Lipparini (liarco) + - Peter Bowyer (pbowyer) - Aleksey Podskrebyshev - Calin Mihai Pristavu - Gabrielle Langer + - Jörn Lang - David Marín Carreño (davefx) - Fabien LUCAS (flucas2) + - Konstantin Grachev (grachevko) + - Hidde Boomsma (hboomsma) + - Johan Vlaar (johjohan) - Ondrej Machulda (ondram) - - Omar Yepez (oyepez003) - - Ashura - mwsaz - - carlos-ea - - Jérémy Benoist - - Ferran Vidal - bogdan - - Jelle Kapitein - - Benoît Bourgeois - - lerminou - - mantulo - - pdragun - - corphi - - JoppeDC - Daniel Tiringer + - Geert De Deckere - grizlik + - Henry Snoek - Derek ROTH + - Jeremy Benoist - Ben Johnson + - Jan Kramer - mweimerskirch - Andrew Codispoti - - Benjamin Franzke - - baron (bastien) + - Benjamin Laugueux + - Lctrs + - Benoît Bourgeois (bierdok) - Dmytro Boiko (eagle) - Shin Ohno (ganchiku) - - Geert De Deckere (geertdd) - - Jan Kramer (jankramer) - - Kubicki Kamil (kubik) - - Simon Leblanc (leblanc_simon) + - Joppe De Cuyper (joppedc) - Matthieu Mota (matthieumota) - - Mikhail Prosalov (mprosalov) - - Ronny López (ronnylt) + - Jean-Baptiste GOMOND (mjbgo) - abdul malik ikhsan (samsonasik) - - Henry Snoek (snoek09) - - Dmitry (staratel) - - Tito Miguel Costa (titomiguelcosta) - - Simone Di Maulo (toretto460) + - Morgan Auchede - Christian Morgan - - Alexander Miehe (engerim) - - Morgan Auchede (mauchede) + - Alexander Miehe + - Andrii Dembitskyi + - Daniël Brekelmans (dbrekelmans) - Sascha Dens (saschadens) + - Simon Heimberg (simon_heimberg) - Morten Wulff (wulff) - Don Pinkster - Maksim Muruev - Emil Einarsson + - Anderson Müller - 243083df - Thibault Duplessis - Rimas Kudelis - Marc Abramowitz - Martijn Evers - Tony Tran - - Evgeniy Koval - - Jacques Moati - - Balazs Csaba (balazscsaba2006) - - Benoit Galati (benoitgalati) + - Balazs Csaba - Bill Hance (billhance) - Douglas Reith (douglas_reith) - - Forfarle (forfarle) - Harry Walter (haswalt) + - Jacques MOATI (jmoati) - Johnson Page (jwpage) - Kuba Werłos (kuba) - Ruben Gonzalez (rubenruateltek) - Michael Roterman (wtfzdotnet) - Philipp Keck + - Pavol Tuka - Arno Geurts - Adán Lobato (adanlobato) - Ian Jenkins (jenkoian) @@ -1418,114 +1252,115 @@ The Symfony Connect username in parenthesis allows to get more information - Matthew Davis (mdavis1982) - Paulo Ribeiro (paulo) - Markus S. (staabm) - - Maks - - Knallcharge - - Antoine LA + - Marc Laporte + - Michał Jusięga - den - - pawel-lewtak - - omerida - Gábor Tóth - - tsilefy - - Markus Klein - - Matthias Dötsch - - Bogdan + - ouardisoft - Daniel Cestari - Matt Janssen - - Matteo Galli - - Loenix - - Simon Frost - - David Lima - - Sean Templeton + - Dmitriy Derepko - Stéphane Delprat - - Ronny (big-r) - - Brian Freytag (brianfreytag) - - Cătălin Dan (dancatalin) - - Erwan Nader (ernadoo) - Elan Ruusamäe (glen) - - Ian Littman (iansltx) - - Arkadiusz Kondas (itcraftsmanpl) - - Joao Paulo V Martins (jpjoao) - Brunet Laurent (lbrunet) - - Jérémy (libertjeremy) - Florent Viel (luxifer) + - Maks 3w (maks3w) + - Michiel Boeckaert (milio) - Mikhail Yurasov (mym) - - LOUARDI Abdeltif (ouardisoft) - Robert Gruendler (pulse00) - Sebastian Paczkowski (sebpacz) - Simon Terrien (sterrien) - - Success Go (successgo) - Benoît Merlet (trompette) - - Aaron Piotrowski (trowski) - - Vincent MOULENE (vints24) - - Koen Kuipers - datibbaw + - Dragos Protung (dragosprotung) + - Koen Kuipers (koku) - Nicolas de Marqué (nicola) - - Antoine Leblanc - - Andre Johnson - - Marco Pfeiffer + - Thiago Cordeiro (thiagocordeiro) + - Matthieu Bontemps - Rootie - - Gabriel Solomon (gabrielsolomon) + - Sébastien Santoro (dereckson) - Daniel Alejandro Castro Arellano (lexcast) - - Aleksandar Dimitrov (netbull) - - Gary Houbre (thegarious) - - sensio - Thomas Jarrand + - Baptiste Leduc (bleduc) - Antoine Bluchet (soyuka) - Patrick Kaufmann - Anton Dyshkant - Paul Oms + - Yann LUCAS (drixs6o9) - Reece Fowell (reecefowell) - - stefan.r - Htun Htun Htet (ryanhhh91) - Guillaume Gammelin - Valérian Galliat - Sorin Pop (sorinpop) - d-ph + - Stewart Malik - Renan Taranto (renan-taranto) + - Stefan Graupner (efrane) + - Gemorroj (gemorroj) + - Thomas Talbot - Adrien Chinour - Rikijs Murgs + - Mihail Krasilnikov (krasilnikovm) - Uladzimir Tsykun + - iamvar - Amaury Leroux de Lens (amo__) - Christian Jul Jensen - - Alexandre GESLIN (alexandregeslin) + - Alexandre GESLIN - The Whole Life to Learn - - joel lusavuvu (enigma97) + - Pierre Tondereau + - Joel Lusavuvu (enigma97) + - Alex Vo (votanlean) - Mikkel Paulson - ergiegonzaga - André Matthies + - Piergiuseppe Longo + - Kevin Auivinet - Liverbool (liverbool) - Valentin Nazarov + - Dalibor Karlović + - Aurélien MARTIN + - Malte Schlüter + - Jules Matsounga (hyoa) + - Quentin Dequippe (qdequippe) + - Yewhen Khoptynskyi (khoptynskyi) - Jérôme Nadaud (jnadaud) - Sam Malone - - Phan Thanh Ha (haphan) + - Ha Phan (haphan) - Chris Jones (leek) - neghmurken + - stefan.r - xaav + - Jean-Christophe Cuvelier [Artack] - Mahmoud Mostafa (mahmoud) + - Alexandre Tranchant (alexandre_t) + - Anthony Moutte - Ahmed Abdou - shreyadenny - Daniel Iwaniec + - Thomas Ferney (thomasf) - Pieter - Michael Tibben + - Hallison Boaventura (hallisonboaventura) - Mas Iting - Billie Thompson - Albion Bame (abame) - - Ganesh Chandrasekaran + - Ganesh Chandrasekaran (gxc4795) - Sander Marechal - Ivan Nemets - Grégoire Hébert (gregoirehebert) - Franz Wilding (killerpoke) - - ProgMiner - Oleg Golovakhin (doc_tr) - Icode4Food (icode4food) - Radosław Benkel - - EStyles (insidestyles) - - kevin.nadin + - Kevin Nadin (kevinjhappy) - jean pasqualini (darkilliant) + - Iliya Miroslavov Iliev (i.miroslavov) + - Safonov Nikita (ns3777k) - Ross Motley (rossmotley) - ttomor - Mei Gwilym (meigwilym) - - Michael H. Arieli (excelwebzone) + - Michael H. Arieli + - Nicolas Martin (cocorambo) - Tom Panier (neemzy) - Fred Cox - luffy1727 @@ -1535,25 +1370,35 @@ The Symfony Connect username in parenthesis allows to get more information - Sander Coolen (scoolen) - Emil Masiakowski - Amirreza Shafaat (amirrezashafaat) + - Laurent Clouet - Adoni Pavlakis (adoni) - Nicolas Le Goff (nlegoff) - Alex Hofbauer (alexhofbauer) - Maarten Nusteling (nusje2000) + - Anne-Sophie Bachelard - Ahmed EBEN HASSINE (famas23) + - Marvin Butkereit - Ben Oman - Chris de Kok - - Andreas Kleemann + - Eduard Bulava (nonanerz) + - Andreas Kleemann (andesk) + - Igor Timoshenko (igor.timoshenko) - Manuele Menozzi - “teerasak” - Anton Babenko (antonbabenko) - Irmantas Šiupšinskas (irmantas) + - Benoit Mallo + - Charles-Henri Bruyand - Danilo Silva - Giuseppe Campanelli + - Valentin + - pizzaminded - Matthieu Calie (matth--) - - Arnaud PETITPAS (apetitpa) + - Konstantin S. M. Möllers (ksmmoellers) - Ken Stanley - ivan - Zachary Tong (polyfractal) + - linh - Oleg Krasavin (okwinza) - Mario Blažek (marioblazek) - Jure (zamzung) @@ -1564,11 +1409,13 @@ The Symfony Connect username in parenthesis allows to get more information - johnstevenson - hamza - dantleech + - Kajetan Kołtuniak (kajtii) - Sander Goossens (sandergo90) - Rudy Onfroy - Tero Alén (tero) - - Stanislav Kocanda - DerManoMann + - Damien Fayet (rainst0rm) + - MatTheCat - Guillaume Royer - Erfan Bahramali - Artem (digi) @@ -1585,22 +1432,23 @@ The Symfony Connect username in parenthesis allows to get more information - chispita - Wojciech Sznapka - Luis Pabon (luispabon) - - Gavin Staniforth - boulei_n - Anna Filina (afilina) + - Gavin (gavin-markup) - Ksaveras Šakys (xawiers) + - Shaun Simmons - Ariel J. Birnbaum - Patrick Luca Fazzi (ap3ir0n) - Danijel Obradović - Pablo Borowicz - - Arjan Keeman - Bruno Rodrigues de Araujo (brunosinister) - Máximo Cuadros (mcuadros) - Lukas Mencl + - Jacek Wilczyński (jacekwilczynski) - tamirvs - gauss - julien.galenski - - Christian Neff + - Christian Neff (secondtruth) - Chris Tiearney - Oliver Hoff - Ole Rößner (basster) @@ -1610,92 +1458,106 @@ The Symfony Connect username in parenthesis allows to get more information - tamar peled - Per Sandström (per) - Goran Juric - - Laurent Ghirardotti (laurentg) + - Laurent G. (laurentg) - Nicolas Macherey - Guido Donnari - - AKeeman (akeeman) - Mert Simsek (mrtsmsk0) - Lin Clark - - Meneses (c77men) + - Christophe Meneses (c77men) - Jeremy David (jeremy.david) + - Andrei O - Jordi Rejas - Troy McCabe - Ville Mattila - - ilyes kooli - gr1ev0us - mlazovla - Alejandro Diaz Torres + - Karl Shea + - Valentin - Max Beutel - Łukasz Chruściel (lchrusciel) + - Jan Vernieuwe (vernija) - Antanas Arvasevicius - Pierre Dudoret + - Michal Trojanowski - Thomas + - j.schmitt - Georgi Georgiev - Maximilian Berghoff (electricmaxxx) - - nacho + - Evgeny Anisiforov - TristanPouliquen - Piotr Antosik (antek88) + - Nacho Martin (nacmartin) - mwos - Volker Killesreiter (ol0lll) - Vedran Mihočinec (v-m-i) - Sergey Novikov (s12v) - creiner + - ProgMiner - Marcos Quesada (marcos_quesada) - - Matthew Vickery (mattvick) + - Matthew (mattvick) - MARYNICH Mikhail (mmarynich-ext) - - Viktor Novikov (panzer_commander) + - Viktor Novikov (nowiko) - Paul Mitchum (paul-m) - Angel Koilov (po_taka) - RevZer0 (rav) - Dan Finnie - Marek Binkowski - Ken Marfilla (marfillaster) + - Max Grigorian (maxakawizard) - benatespina (benatespina) - Denis Kop - Andrey Lebedev (alebedev) + - Cristoforo Cervino (cristoforocervino) - Jean-Guilhem Rouel (jean-gui) - Yoann MOROCUTTI + - EdgarPE - jfcixmedia - Tomasz Kusy - Dominic Tubach - - Nikita Konstantinov - Martijn Evers - Alexander Onatskiy - Philipp Fritsche - tarlepp - Benjamin Paap (benjaminpaap) + - Claus Due (namelesscoder) - Guillaume Aveline - Christian + - Alexandru Patranescu - Denis Golubovskiy (bukashk0zzz) - Arkadiusz Rzadkowolski (flies) - - Sergii Smertin (nfx) + - Serge (nfx) - Oksana Kozlova (oksanakozlova) - Quentin Moreau (sheitak) - Mikkel Paulson - Michał Strzelecki - Bert Ramakers - Angelov Dejan (angelov) - - hugofonseca (fonsecas72) + - Aurimas Niekis (aurimasniekis) + - Hugo Fonseca (fonsecas72) - Marc Duboc (icemad) - Martynas Narbutas + - Timothée BARRAY + - Nilmar Sanchez Muguercia - Bailey Parker - - Eddie Jaoude - Antanas Arvasevicius + - Eddie Abou-Jaoude (eddiejaoude) - Haritz Iturbe (hizai) - Nerijus Arlauskas (nercury) - - SPolischook - Diego Sapriza - Joan Cruz - inspiran + - Alex Demchenko - Cristobal Dabed - Daniel Mecke (daniel_mecke) - Matteo Giachino (matteosister) - - Alex Demchenko (pilot) + - Serhii Polishchuk (spolischook) - Tadas Gliaubicas (tadcka) - Thanos Polymeneas (thanos) - Atthaphon Urairat - Benoit Garret - Maximilian Ruta (deltachaos) + - Jon Green (jontjs) - Mickaël Isaert (misaert) - Jakub Sacha - Julius Kiekbusch @@ -1704,44 +1566,43 @@ The Symfony Connect username in parenthesis allows to get more information - Claude Dioudonnat - Jonathan Hedstrom - Peter Smeets (darkspartan) - - Jhonny Lidfors (jhonny) - Julien Bianchi (jubianchi) - Robert Meijers - James Sansbury - Marcin Chwedziak - Benjamin - hjkl - - Tony Cosentino (tony-co) - Dan Wilga - Oleksii Svitiashchuk - Andrew Tch - Alexander Cheprasov - Tristan Bessoussa (sf_tristanb) - Rodrigo Díez Villamuera (rodrigodiez) - - Nicolas Jourdan - - James Hudson - Stephen Clouse - e-ivanov - Nathanaël Martel (nathanaelmartel) - - Einenlum + - Nicolas Jourdan (nicolasjc) + - Benjamin Dos Santos + - Yann Rabiller (einenlum) + - GagnarTest (gagnartest) - Jochen Bayer (jocl) + - Tomas Javaisis - Patrick Carlo-Hickman - Bruno MATEU - Jeremy Bush - Lucas Bäuerle - - wizhippo - Thomason, James - Dario Savella - Gordienko Vladislav + - Ener-Getick - Viacheslav Sychov - - Alexandre Quercia (alquerci) - Helmut Hummel (helhum) - Matt Brunt - Jack Thomas - Carlos Ortega Huetos - - rpg600 - Péter Buri (burci) - Evgeny Efimov (edefimov) + - John VanDeWeghe - kaiwa - Daniel Badura - Charles Sanquer (csanquer) @@ -1764,15 +1625,19 @@ The Symfony Connect username in parenthesis allows to get more information - Kai Dederichs - Vladimir Luchaninov (luchaninov) - spdionis + - maxime.perrimond - rchoquet - rvoisin - gitlost - Taras Girnyk + - cthulhu - Dmitry Derepko + - Rémi Leclerc - Jan Vernarsky + - Sergio + - Jonas Hünig - Amine Yakoubi - Eduardo García Sanz (coma) - - Sergio (deverad) - Arend Hummeling - Makdessi Alex - fduch (fduch) @@ -1782,22 +1647,28 @@ The Symfony Connect username in parenthesis allows to get more information - Jason Schilling (chapterjason) - David de Boer (ddeboer) - Eno Mullaraj (emullaraj) + - Stephan Vock (glaubinix) - Nathan PAGE (nathix) - Ryan Rogers + - Arnaud - Klaus Purer - - arnaud (arnooo999) + - Dmitrii Lozhkin - Gilles Doge (gido) + - Marion Hurteau (marionleherisson) - Oscar Esteve (oesteve) + - Sobhan Sharifi (50bhan) - Peter Potrowl - abulford - Philipp Kretzschmar - - antograssiot - Ilya Vertakov - Brooks Boyd - - johnillo + - Stephen - Roger Webb - Dmitriy Simushev - Pawel Smolinski + - John Espiritu (johnillo) + - Tomasz (timitao) + - Nguyen Tuan Minh (tuanminhgp) - Oxan van Leeuwen - pkowalczyk - dbrekelmans @@ -1809,19 +1680,18 @@ The Symfony Connect username in parenthesis allows to get more information - mousezheng - mshavliuk - Rémy LESCALLIER - - WybrenKoelmans - - Derek Lambert - MightyBranch - Kacper Gunia (cakper) + - Derek Lambert (dlambert) - Peter Thompson (petert82) - Victor Macko (victor_m) - error56 - Felicitus - - Krzysztof Przybyszewski - alexpozzi - - Vladimir - Quentin Devos - Jorge Vahldick (jvahldick) + - Krzysztof Przybyszewski (kprzybyszewski) + - Vladimir Mantulo (mantulo) - Frederic Godfrin - Paul Matthews - aim8604 @@ -1832,71 +1702,88 @@ The Symfony Connect username in parenthesis allows to get more information - Juan Traverso - David Legatt (dlegatt) - Alain Flaus (halundra) + - Arthur Woimbée - tsufeki + - Théo DELCEY - Philipp Strube - Thomas Nunninger + - Andrii Serdiuk (andreyserdjuk) - Clement Herreman (clemherreman) + - dangkhoagms (dangkhoagms) - Dan Ionut Dumitriu (danionut90) + - Evgeny (disparity) + - Floran Brutel (notFloran) (floran) - Vladislav Rastrusny (fractalizer) - Vlad Gapanovich (gapik) - Alexander Kurilo (kamazee) - - Nyro (nyro) + - nyro (nyro) - Konstantin Bogomolov - Marco - Marc Torres - Mark Spink - - cesar - Alberto Aldegheri + - Dalibor Karlović - Cesar Scur (cesarscur) + - Sagrario Meneses - Dmitri Petmanson - heccjj - Alexandre Melard + - Stefano A. (stefano93) - PierreRebeilleau - Jay Klehr - Sergey Yuferev - Tobias Stöckler - Mario Young - Ilia (aliance) - - Chris McCafferty (cilefen) + - cilefen (cilefen) + - Florian Hermann (fhermann) - Mo Di (modi) - Pablo Schläpfer - Christian Rishøj + - Roromix - Patrick Berenschot - SuRiKmAn - rtek + - Christian Wahler (christian) - Jelte Steijaert (jelte) + - Maxime AILLOUD (mailloud) - David Négrier (moufmouf) - Quique Porta (quiqueporta) - - Artem Oliynyk (artemoliynyk) + - mohammadreza honarkhah + - Artem Oliinyk (artemoliynyk) - Ben Roberts (benr77) - Andrea Quintino (dirk39) - Tomasz Szymczyk (karion) - Alex Vasilchenko - sez-open - - Xavier Coureau - fruty - ConneXNL - Aharon Perkel - matze + - Adam Wójs (awojs) - Justin Reherman (jreherman) - Rubén Calvo (rubencm) + - Paweł Niedzielski (steveb) - Abdul.Mohsen B. A. A - - Swen van Zanten + - Cédric Girard + - Peter Jaap Blaakmeer - Agustin Gomes - - Benoît Burnichon - pthompson - Malaney J. Hill - Alexandre Pavy - Adiel Cristo (arcristo) - Artem Stepin (astepin) - Christian Flach (cmfcmf) - - Cédric Girard (enk_) - Fabian Kropfhamer (fabiank) + - Junaid Farooq (junaidfarooq) - Lars Ambrosius Wallenborn (larsborn) - Oriol Mangas Abellan (oriolman) - Sebastian Göttschkes (sgoettschkes) + - Swen van Zanten (swenvanzanten) + - Frankie Wittevrongel - Tatsuya Tsuruoka - Ross Tuck + - Zander Baldwin - Oleksiy (alexndlm) - Kévin Gomez (kevin) - Mihai Nica (redecs) @@ -1904,6 +1791,8 @@ The Symfony Connect username in parenthesis allows to get more information - Adam Prickett - azine - Luke Towers + - Anton Kroshilin + - Pierre Tachoire - Dawid Sajdak - Norman Soetbeer - Ludek Stepan @@ -1911,21 +1800,22 @@ The Symfony Connect username in parenthesis allows to get more information - Craig Menning (cmenning) - Balázs Benyó (duplabe) - Erika Heidi Reinaldo (erikaheidi) - - Kyryll Maesh (gauss) - - Pierre Tachoire (krichprollsch) + - William Thomson (gauss) + - Javier Espinosa (javespi) - Marc J. Schmidt (marcjs) - František Maša - Sebastian Schwarz + - karolsojko - Marco Jantke - Saem Ghani - - Clément LEFEBVRE - - Conrad Kleinespel - Zacharias Luiten - Sebastian Utz - Adrien Gallou (agallou) + - Andrea Sprega (asprega) - Maks Rafalko (bornfree) - - Karol Sójko (karolsojko) - - sl_toto (sl_toto) + - Conrad Kleinespel (conradk) + - Clément LEFEBVRE (nemoneph) + - Viktor Bajraktar (njutn95) - Walter Dal Mut (wdalmut) - abluchet - Ruud Arentsen @@ -1935,18 +1825,21 @@ The Symfony Connect username in parenthesis allows to get more information - Arend-Jan Tetteroo - Albin Kerouaton - Sébastien HOUZÉ + - Mbechezi Nawo - Jingyu Wang - steveYeah - - Samy Dindane (dinduks) + - Samy D (dinduks) - Keri Henare (kerihenare) - Andre Eckardt (korve) - Cédric Lahouste (rapotor) - Samuel Vogel (samuelvogel) - Osayawe Ogbemudia Terry (terdia) - AndrolGenhald + - Damien Fa - Berat Doğan - Guillaume LECERF - Juanmi Rodriguez Cerón + - twifty - Andy Raines - Anthony Ferrara - Geoffrey Pécro (gpekz) @@ -1955,41 +1848,52 @@ The Symfony Connect username in parenthesis allows to get more information - Flavien Knuchel (knuch) - Mathieu TUDISCO (mathieutu) - Dmytro Dzubenko + - Peter Ward - markusu49 - Steve Frécinaux - Constantine Shtompel - Jules Lamur - Renato Mendes Figueiredo + - Benjamin RICHARD - pdommelen - Eric Stern - ShiraNai7 - Cedrick Oka - Antal Áron (antalaron) + - Guillaume Sainthillier (guillaume-sainthillier) - Vašek Purchart (vasek-purchart) - Janusz Jabłoński (yanoosh) - Fleuv - Tayfun Aydin - - Sandro Hopf - Łukasz Makuch - Arne Groskurth + - Ilya Chekalsky - Ostrzyciel - George Giannoulopoulos - - Alexander Pasichnick + - Alexander Pasichnik (alex_brizzz) - Luis Ramirez (luisdeimos) + - Ilia Sergunin (maranqz) - Daniel Richter (richtermeister) + - Sandro Hopf (senaria) - ChrisC - - JL - - Ilya Biryukov - Kim Laï Trinh - Johan de Ruijter - Jason Desrosiers - m.chwedziak + - marbul - Filippos Karailanidis - Andreas Frömer - Philip Frank - David Brooks - Lance McNearney + - Illia Antypenko (aivus) + - Jelizaveta Lemeševa (broken_core) + - Dominik Ritter (dritter) + - Frank Neff (fneff) - Volodymyr Kupriienko (greeflas) + - Ilya Biryukov (ibiryukov) + - Roma (memphys) + - Florian Caron (shalalalala) - Serhiy Lunak (slunak) - Wojciech Błoszyk (wbloszyk) - Jiri Barous @@ -1997,6 +1901,7 @@ The Symfony Connect username in parenthesis allows to get more information - abunch - tamcy - Mikko Pesari + - Aurélien Fontaine - ncou - Ian Carroll - caponica @@ -2016,10 +1921,11 @@ The Symfony Connect username in parenthesis allows to get more information - Foxprodev - developer-av - Max Summe - - WedgeSama + - Ema Panz + - Hugo Sales - Dale.Nash - - Felds Liscia - Chihiro Adachi (chihiro-adachi) + - Benjamin Georgeault (wedgesama) - Raphaëll Roussel - Tadcka - Beth Binkovitz @@ -2030,8 +1936,8 @@ The Symfony Connect username in parenthesis allows to get more information - Romain Geissler - Adrien Moiruad - Tomaz Ahlin - - Philip Ardery - Nasim + - AnotherSymfonyUser (arderyp) - Marcus Stöhr (dafish) - Daniel González Zaballos (dem3trio) - Emmanuel Vella (emmanuel.vella) @@ -2047,23 +1953,29 @@ The Symfony Connect username in parenthesis allows to get more information - Nathaniel Catchpole - Adrien Samson (adriensamson) - Samuel Gordalina (gordalina) - - Max Romanovsky (maxromanovsky) + - Maksym Romanowski (maxromanovsky) - Nicolas Eeckeloo (neeckeloo) - Andriy Prokopenko (sleepyboy) - - Mathieu Morlon + - Dariusz Ruminski - Ivo Valchev - Daniel Tschinder - Arnaud CHASSEUX + - Zlatoslav Desyatnikov + - Wickex + - tuqqu - Wojciech Gorczyca + - Neagu Cristian-Doru (cristian-neagu) + - Mathieu Morlon (glutamatt) - Rafał Muszyński (rafmus90) - Sébastien Decrême (sebdec) - Timothy Anido (xanido) - Mara Blaga - Rick Prent - skalpa - - Martin Eckhardt + - Kai + - Bartłomiej Zając - Pieter Jordaan - - Damien Tournoud + - Tournoud (damientournoud) - Michael Dowling (mtdowling) - Karlos Presumido (oneko) - Tony Vermeiren (tony) @@ -2072,23 +1984,27 @@ The Symfony Connect username in parenthesis allows to get more information - Kirill Lazarev - Thomas Counsell - BilgeXA - - r1pp3rj4ck - - phydevs - mmokhi - Serhii Smirnov - Robert Queck - Peter Bouwdewijn - Martins Eglitis - - mlively - Wouter Diesveld + - Romain + - Matěj Humpál - Amine Matmati + - Kristen Gilden - caalholm - Nouhail AL FIDI (alfidi) - Fabian Steiner (fabstei) - - Felipy Tavares Amorim (felipyamorim) + - Felipy Amorim (felipyamorim) - Guillaume Loulier (guikingone) - Klaus Silveira (klaussilveira) + - Michael Lively (mlivelyjr) - Pedro Casado (pdr33n) + - Pierre Grimaud (pgrimaud) + - Abderrahim (phydev) + - Attila Bukor (r1pp3rj4ck) - Alexander Janssen (tnajanssen) - Thomas Chmielowiec (chmielot) - Jānis Lukss @@ -2096,21 +2012,20 @@ The Symfony Connect username in parenthesis allows to get more information - Michael Zangerle - rkerner - Alex Silcock + - Raphael Hardt - Qingshan Luo - Ergie Gonzaga - Matthew J Mucklo - AnrDaemon + - SnakePin - Matthew Covey - Anthony Massard (decap94) - Emre Akinci (emre) - Chris Maiden (matason) - - fdgdfg (psampaz) + - psampaz (psampaz) - Andrea Ruggiero (pupax) - - Stéphane Seng - Maxwell Vandervelde - kaywalker - - Mike Meier - - Tim Jabs - Sebastian Ionescu - Robert Kopera - Pablo Ogando Ferreira @@ -2119,16 +2034,20 @@ The Symfony Connect username in parenthesis allows to get more information - Valentin VALCIU - Jeremiah VALERIE - Alexandre Beaujour - - Julien Menth + - Patrik Patie Gmitter - George Yiannoulopoulos - Yannick Snobbert - Kevin Dew - James Cowgill + - sensio + - Julien Menth (cfjulien) - Nicolas Schwartz (nicoschwartz) - - Patrik Gmitter (patie) + - Tim Jabs (rubinum) + - Stéphane Seng (stephaneseng) - Peter Schultz - Jonathan Gough - Benhssaein Youssef + - Benoit Leveque - bill moll - Benjamin Bender - PaoRuby @@ -2139,14 +2058,14 @@ The Symfony Connect username in parenthesis allows to get more information - Konrad Mohrfeldt - Lance Chen - Ciaran McNulty (ciaranmcnulty) + - Dominik Piekarski (dompie) - Andrew (drew) + - j4nr6n (j4nr6n) - kor3k kor3k (kor3k) + - Rares Sebastian Moldovan (raresmldvn) - Stelian Mocanita (stelian) - - Justin (wackymole) - - Flavian (2much) - Gautier Deuette - dsech - - mike - Gilbertsoft - tadas - Bastien Picharles @@ -2156,16 +2075,13 @@ The Symfony Connect username in parenthesis allows to get more information - Mephistofeles - Hoffmann András - LubenZA - - Olivier + - Victor Garcia - Juan Mrad - Denis Yuzhanin - - Youssef BENHSSAIEN + - Flavian Sierk - knezmilos13 - alireza - - Cyril PASCAL - Michael Bessolov - - pscheit - - Wybren Koelmans - Zdeněk Drahoš - Dan Harper - moldcraft @@ -2175,75 +2091,83 @@ The Symfony Connect username in parenthesis allows to get more information - Antonio Peric-Mazar (antonioperic) - César Suárez (csuarez) - Bjorn Twachtmann (dotbjorn) + - Marek Víger (freezy) - Wahyu Kristianto (kristories) - Tobias Genberg (lorceroth) + - Michael Simonson (mikes) - Nicolas Badey (nico-b) + - Olivier Scherler (oscherler) - Shane Preece (shane) - Stephan Wentz (temp) - Johannes Goslar - Geoff - georaldc - - Maarten de Boer - - Malte Wunsch - wusuopu - Markus Staab + - Wouter de Wild - povilas - Gavin Staniforth - bahram - Alessandro Tagliapietra (alex88) - - Biji (biji) + - Nikita Starshinov (biji) - Alex Teterin (errogaht) - Gunnar Lium (gunnarlium) + - Malte Wunsch (maltewunsch) - Marie Minasyan (marie.minassyan) + - Maarten de Boer (mdeboer) - Tiago Garcia (tiagojsag) - Artiom - Jakub Simon - Bouke Haarsma - mlievertz - Radosław Kowalewski - - Stefan Kleff - Enrico Schultz - JustDylan23 - - mschop + - Juraj Surman - Martin Eckhardt - natechicago - Victor - Andreas Allacher - Alexis + - Leonid Terentyev - Sergei Gorjunov - Jonathan Poston - Adrian Olek (adrianolek) + - Camille Dejoye (cdejoye) - cybernet (cybernet2u) - Jody Mickey (jwmickey) - Przemysław Piechota (kibao) - - Leonid Terentyev (li0n) + - Martin Schophaus (m_schophaus_adcada) - Martynas Sudintas (martiis) + - Stefan Kleff (stefanxl) - Thijs-jan Veldhuizen (tjveldhuizen) - ryunosuke - Bruno BOUTAREL - - victoria - John Stevenson - Francisco Facioni (fran6co) - Stanislav Gamayunov (happyproff) - Iwan van Staveren (istaveren) - Alexander McCullagh (mccullagh) - Paul L McNeely (mcneely) - - Andrei C. (moldman) - Povilas S. (povilas) - Laurent Negre (raulnet) - Sergey Fokin (tyraelqp) + - Victoria Quirante Ruiz (victoria) - Evrard Boulou - pborreli - Bernat Llibre - Boris Betzholz - Eric Caron + - Arnau González - 2manypeople - Wing - Thomas Bibb + - Stefan Koopmanschap - Joni Halme - Matt Farmer - catch - aetxebeste + - roromix - Vitali Tsyrkin - Juga Paazmaya - Alexandre Segura @@ -2258,24 +2182,25 @@ The Symfony Connect username in parenthesis allows to get more information - WaiSkats - Morimoto Ryosuke - Ikhsan Agustian - - Arnau González (arnaugm) + - Benoit Lévêque (benoit_leveque) - Simon Bouland (bouland) - Christoph König (chriskoenig) + - Dmytro Pigin (dotty) - Jibé Barth (jibbarth) - Jm Aribau (jmaribau) - Matthew Foster (mfoster) - Reyo Stallenberg (reyostallenberg) - Paul Seiffert (seiffert) - Vasily Khayrulin (sirian) - - Stefan Koopmanschap (skoop) - Stas Soroka (stasyan) - Stefan Hüsges (tronsha) - Jake Bishop (yakobeyak) - Dan Blows + - popnikos - Matt Wells - - Sander van der Vlugt - Nicolas Appriou - stloyd + - Tito Costa - Andreas - Chris Tickner - Andrew Coulton @@ -2283,12 +2208,14 @@ The Symfony Connect username in parenthesis allows to get more information - Jeremy Benoist - Michal Gebauer - Phil Davis + - Thiago Melo - Gleb Sidora - David Stone - Giorgio Premi - Gerhard Seidel (gseidel) - Jovan Perovic (jperovic) - Pablo Maria Martelletti (pmartelletti) + - Sander van der Vlugt (stranding) - Yassine Guedidi (yguedidi) - Waqas Ahmed - Bert Hekman @@ -2297,7 +2224,6 @@ The Symfony Connect username in parenthesis allows to get more information - Houziaux mike - Phobetor - Eric Schildkamp - - Andreas - Markus - agaktr - Mostafa @@ -2313,77 +2239,82 @@ The Symfony Connect username in parenthesis allows to get more information - Gunther Konig - Joe Springe - Mickael GOETZ + - DerStoffel + - Flinsch - Maciej Schmidt - botbotbot - Timon van der Vorm - nuncanada + - Thierry Marianne - František Bereň - - Kamil Madejski - G.R.Dalenoort + - Quentin Dreyer - Jeremiah VALERIE - Mike Francis + - Almog Baku (almogbaku) - Vladimir Khramtsov (chrome) - Gerd Christian Kunze (derdu) - - Christoph Nissle (derstoffel) - Denys Voronin (hurricane) - Ionel Scutelnicu (ionelscutelnicu) + - Jordan de Laune (jdelaune) - Juan Gonzalez Montes (juanwilde) + - Kamil Madejski (kmadejski) - Mathieu Dewet (mdewet) + - none (nelexa) - Nicolas Tallefourtané (nicolab) - Botond Dani (picur) - Rémi Faivre (rfv) - - Thierry Marianne (thierrymarianne) - Nick Stemerdink + - Bernhard Rusch - David Stone - - jjanvier - - Julius Beckmann + - Grayson Koonce - Ruben Jansen - Marc Biorklund - shreypuranik - - loru88 - Thibaut Salanon - Romain Dorgueil - Christopher Parotat - Dennis Haarbrink - Urban Suppiger - - me_shaon - 蝦米 - - Grayson Koonce (breerly) + - Julius Beckmann (h4cc) - Andrey Helldar (helldar) + - Julien JANVIER (jjanvier) - Karim Cassam Chenaï (ka) - - Maksym Slesarenko (maksym_slesarenko) + - Lorenzo Adinolfi (loru88) - Marcello Mönkemeyer (marcello-moenkemeyer) + - Ahmed Shamim Hassan (me_shaon) - Michal Kurzeja (mkurzeja) - Nicolas Bastien (nicolas_bastien) - Sander De la Marche (sanderdlm) - Nikola Svitlica (thecelavi) - - Denis (yethee) - Andrew Zhilin (zhil) - Sjors Ottjes - azjezz - Andy Stanberry - Felix Marezki - Normunds - - Luiz “Felds” Liscia - Yuri Karaban - Johan - Thomas Rothe - Edwin - - Martin - nietonfir - Andriy + - Taylor Otwell - alefranz - David Barratt - Andrea Giannantonio - Pavel.Batanov - avi123 - Pavel Prischepa + - Philip Dahlstrøm + - Sami Mussbach - qzylalala - alsar - downace - Aarón Nieves Fernández - - Mike Meier - Mikolaj Czajkowski + - Ph3nol - Kirill Saksin - Shiro - Reda DAOUDI @@ -2395,10 +2326,13 @@ The Symfony Connect username in parenthesis allows to get more information - Farid Jalilov - Christiaan Wiesenekker - Florent Olivaud + - Foxprodev + - Eric Hertwig - Sergey Panteleev - JakeFr - Dmitry Hordinky - Oliver Klee + - Niels Robin-Aubertin - Simon Sargeant - efeen - Mikko Ala-Fossi @@ -2421,36 +2355,30 @@ The Symfony Connect username in parenthesis allows to get more information - Jawira Portugal (jawira) - Johannes Müller (johmue) - Jordi Llonch (jordillonch) + - julien_tempo1 (julien_tempo1) - Roman Igoshin (masterro) - Nicholas Ruunu (nicholasruunu) - Jeroen van den Nieuwenhuisen (nieuwenhuisen) - - Cyril Pascal (paxal) - - Cédric Dugat (ph3nol) - - Philip Dahlstrøm (phidah) - Pierre Rebeilleau (pierrereb) - Milos Colakovic (project2481) - Raphael de Almeida (raphaeldealmeida) - Rénald Casagraude (rcasagraude) - Robin Duval (robin-duval) - - Grinbergs Reinis (shima5) - Artem Lopata (bumz) - alex - - Nicole Cordes - - Nicolas PHILIPPE - Roman Orlov - Simon Ackermann - VolCh - Alexey Popkov - Gijs Kunze - Artyom Protaskin + - Steven Dubois - Nathanael d. Noblet - helmer - ged15 - Daan van Renterghem - - Nicole Cordes - Bálint Szekeres - amcastror - - Alexander Li (aweelex) - Bram Van der Sype (brammm) - Guile (guile) - Mark Beech (jaybizzle) @@ -2459,19 +2387,22 @@ The Symfony Connect username in parenthesis allows to get more information - Mauro Foti (skler) - Thibaut Arnoud (thibautarnoud) - Yannick Warnier (ywarnier) + - Jörn Lang - Kevin Decherf + - Paul LE CORRE - Jason Woods - Christian Weiske - Maria Grazia Patteri - klemens - dened + - jpauli - Dmitry Korotovsky - - mcorteel - Michael van Tricht - ReScO - - JohJohan - Tim Strehle + - Sébastien COURJEAN - Sam Ward + - Hans N. Hjort - Walther Lalk - Adam - Ivo @@ -2481,24 +2412,23 @@ The Symfony Connect username in parenthesis allows to get more information - devel - taiiiraaa - Ali Tavafi - - Trevor Suarez - gedrox - Viet Pham - Alan Bondarchuk + - Pchol - dropfen - Andrey Chernykh - Edvinas Klovas - Drew Butler - Peter Breuls + - Kevin EMO - Chansig - Tischoi - divinity76 - Andreas Hasenack - J Bruni - Alexey Prilipko - - Dmitriy Fedorenko - vlakoff - - bertillon - thib92 - Yiorgos Kalligeros - Rudolf Ratusiński @@ -2509,36 +2439,42 @@ The Symfony Connect username in parenthesis allows to get more information - AmsTaFF (amstaff) - Simon Müller (boscho) - Yannick Bensacq (cibou) - - Damien (damien_vauchel) + - Cyrille Bourgois (cyrilleb) + - Damien Vauchel (damien_vauchel) + - Dmitrii Fedorenko (dmifedorenko) - Frédéric G. Marand (fgm) - Freek Van der Herten (freekmurze) - Luca Genuzio (genuzio) - - Hans Nilsson (hansnilsson) - Andrew Marcinkevičius (ifdattic) - Ioana Hazsda (ioana-hazsda) - Jan Marek (janmarek) - Mark de Haan (markdehaan) + - Maxime Corteel (mcorteel) - Dan Patrick (mdpatrick) + - Mathieu MARCHOIS (mmar) - naitsirch (naitsirch) - Geoffrey Monte (numerogeek) - Martijn Boers (plebian) - Plamen Mishev (pmishev) - Pedro Magalhães (pmmaga) - Rares Vlaseanu (raresvla) + - Trevor N. Suarez (rican7) - Sergii Dolgushev (serhey) + - Clément Bertillon (skigun) - Rein Baarsma (solidwebcode) - tante kinast (tante) - Stephen Lewis (tehanomalousone) - - Ahmed Hannachi (tiecoders) + - Adam RANDI (tiecoders) - Vincent LEFORT (vlefort) - Walid BOUGHDIRI (walidboughdiri) - wicliff wolda (wickedone) - Wim Molenberghs (wimm) - Darryl Hein (xmmedia) - - Sadicov Vladimir (xtech) - - Kevin EMO (zarcox) + - Vladimir Sadicov (xtech) - Marcel Berteler - sdkawata + - Peter van Dommelen + - Tim van Densen - Andrzej - Alexander Zogheb - Rémi Blaise @@ -2548,14 +2484,12 @@ The Symfony Connect username in parenthesis allows to get more information - root - pf - Vincent Chalnot - - James Hudson - Tom Maguire - Mateusz Lerczak - Richard Quadling - Rainrider - David Zuelke - Adrian - - Oleg Andreyev - Oliver Eglseder - neFAST - zcodes @@ -2572,31 +2506,34 @@ The Symfony Connect username in parenthesis allows to get more information - John Nickell (jrnickell) - Martin Mayer (martin) - Grzegorz Łukaszewicz (newicz) + - Omar Yepez (oyepez003) - Jonny Schmid (schmidjon) - Toby Griffiths (tog) + - Ashura - Götz Gottwald - Alessandra Lai - - Veres Lajos - Ernest Hymel - Andrea Civita - Nicolás Alonso - LoginovIlya - Nick Chiu - - grifx - Robert Campbell - Matt Lehner + - carlos-ea - Olexandr Kalaidzhy - Helmut Januschka + - Jérémy Benoist - Hein Zaw Htet™ - Ruben Kruiswijk - Cosmin-Romeo TANASE + - Ferran Vidal - Michael J - youssef saoubou - Joseph Maarek - Alexander Menk - Alex Pods - - hadriengem - timaschew + - Jelle Kapitein - Jochen Mandl - elattariyassine - Marin Nicolae @@ -2605,9 +2542,13 @@ The Symfony Connect username in parenthesis allows to get more information - Carlos Tasada - Haritz - Matthieu Prat - - Grummfy + - Brieuc Thomas - zors1 - Peter Simoncic + - lerminou + - Ahmad El-Bardan + - mantulo + - pdragun - Paul Le Corre - Noel Light-Hilary - Filipe Guerra @@ -2618,28 +2559,28 @@ The Symfony Connect username in parenthesis allows to get more information - Marcos Labad - Per Modin - David Windell + - Antoine M - Frank Jogeleit - Ondřej Frei - Volodymyr Panivko - Gabriel Birke - - skafandri - Derek Bonner - martijn - Jenne van der Meer + - annesosensio + - NothingWeAre - Storkeus + - goabonga - Alan Chen - Anton Zagorskii - ging-dev - zakaria-amm - - insidestyles - Maerlyn - Even André Fiskvik - Agata - dakur - Matthias Schmidt - florian-michael-mast - - Александр Ли - - Arjan Keeman - Vlad Dumitrache - Alex Kalineskou - Erik van Wingerden @@ -2649,8 +2590,9 @@ The Symfony Connect username in parenthesis allows to get more information - Alexis MARQUIS - Gerrit Drost - Linnaea Von Lavia + - Simon Mönch - Bastien Clément - - Julius Šakalys + - Thomas Talbot - Javan Eskander - Lenar Lõhmus - Cristian Gonzalez @@ -2659,23 +2601,21 @@ The Symfony Connect username in parenthesis allows to get more information - hainey - Juan M Martínez - Gilles Gauthier + - Benjamin Franzke - Pavinthan - Sylvain METAYER - ddebree - Gyula Szucs - Tomas Liubinas - Ivo Valchev - - Alex - Jan Hort - Klaas Naaijkens - - Daniel González Cerviño - Rafał - - Ahmad El-Bardan (absahmad) - Adria Lopez (adlpz) - Aaron Scherer (aequasi) + - baron (bastien) - Rosio (ben-rosio) - Simon Paarlberg (blamh) - - Brieuc THOMAS (brieucthomas) - Masao Maeda (brtriver) - Damien Harper (damien.harper) - Darius Leskauskas (darles) @@ -2688,20 +2628,22 @@ The Symfony Connect username in parenthesis allows to get more information - Dennis Smink (dsmink) - Franz Liedke (franzliedke) - Gaylord Poillon (gaylord_p) - - Christophe BECKER (goabonga) - gondo (gondo) + - Joris Garonian (grifx) + - Grummfy (grummfy) + - Hadrien Cren (hcren) - Gusakov Nikita (hell0w0rd) - - Osman Üngür (import) + - Oz (import) - Jaap van Otterdijk (jaapio) - Javier Núñez Berrocoso (javiernuber) - Jelle Bekker (jbekker) - - Jonathan Sui Lioung Lee Slew (jlslew) - - Johan Vlaar (johjohan) - Giovanni Albero (johntree) - Jorge Martin (jorgemartind) - Joeri Verdeyen (jverdeyen) - Kevin Verschaeve (keversc) - Kevin Herrera (kherge) + - Kubicki Kamil (kubik) + - Simon Leblanc (leblanc_simon) - Luis Ramón López López (lrlopez) - Vladislav Nikolayev (luxemate) - Martin Mandl (m2mtech) @@ -2711,6 +2653,7 @@ The Symfony Connect username in parenthesis allows to get more information - Michael Pohlers (mick_the_big) - Misha Klomp (mishaklomp) - mlpo (mlpo) + - Mikhail Prosalov (mprosalov) - Ulrik Nielsen (mrbase) - Marek Šimeček (mssimi) - Dmitriy Tkachenko (neka) @@ -2722,19 +2665,23 @@ The Symfony Connect username in parenthesis allows to get more information - Pablo Monterde Perez (plebs) - Pierre-Olivier Vares (povares) - Jimmy Leger (redpanda) + - Ronny López (ronnylt) + - Julius (sakalys) - Samaël Villette (samadu61) + - Dmitry (staratel) - Marcin Szepczynski (szepczynski) + - Tito Miguel Costa (titomiguelcosta) + - Simone Di Maulo (toretto460) - Cyrille Jouineau (tuxosaurus) + - Lajos Veres (vlajos) - Vladimir Chernyshev (volch) - Wim Godden (wimg) - - Xav` (xavismeh) - Yorkie Chadwick (yorkie76) - Maxime Aknin (3m1x4m) - Geordie - Exploit.cz - GuillaumeVerdon - - Angel Fernando Quiroz Campos - - Ondrej Mirtes + - ureimers - akimsko - Youpie - Jason Stephens @@ -2747,8 +2694,8 @@ The Symfony Connect username in parenthesis allows to get more information - Matthias Derer - vladyslavstartsev - Saem Ghani + - Kévin - Stefan Oderbolz - - Curtis - Gabriel Moreira - Alexey Popkov - ChS @@ -2760,44 +2707,49 @@ The Symfony Connect username in parenthesis allows to get more information - Evgeniy Tetenchuk - Sjoerd Adema - Shrey Puranik + - Evgeniy Koval - Lars Moelleken - dasmfm - Claas Augner - Mathias Geat + - Angel Fernando Quiroz Campos (angelfqc) - Arnaud Buathier (arnapou) + - Benoit Galati (benoitgalati) + - Curtis (ccorliss) - chesteroni (chesteroni) - Mauricio Lopez (diaspar) - HADJEDJ Vincent (hadjedjvincent) - Daniele Cesarini (ijanki) - Ismail Asci (ismailasci) - Jeffrey Moelands (jeffreymoelands) - - Simon CONSTANS (kosssi) + - Simon (kosssi) + - Ondřej Mirtes (mirtes) - Paulius Jarmalavičius (pjarmalavicius) - - Ramon Henrique Ornelas (ramonornela) - - Ricardo de Vries (ricknox) + - Ramon Ornelas (ramonornela) + - Ricardo de Vries (ricardodevries) - Ruslan Zavacky (ruslanzavacky) - Stefano Cappellini (stefano_cappellini) - Thomas Dutrion (theocrite) - Till Klampaeckel (till) - Tobias Weinert (tweini) - - Ulf Reimers (ureimers) - Wotre - goohib - Tom Counsell + - Sepehr Lajevardi - George Bateman - Xavier HAUSHERR - - Ron Gähler - Edwin Hageman - Mantas Urnieža - temperatur + - Paul Andrieux - misterx - Cas - arend - Vincent Godé - - Dusan Kasan - helmi - Michael Steininger - Nardberjean + - ghazy ben ahmed - Karolis - Myke79 - jersoe @@ -2806,7 +2758,6 @@ The Symfony Connect username in parenthesis allows to get more information - Piers Warmers - Sylvain Lorinet - klyk50 - - Andreas Lutro - jc - BenjaminBeck - Aurelijus Rožėnas @@ -2820,6 +2771,7 @@ The Symfony Connect username in parenthesis allows to get more information - Matt Fields - Olatunbosun Egberinde - Andras Debreczeni + - Knallcharge - Vladimir Sazhin - Michel Bardelmeijer - Tomas Kmieliauskas @@ -2830,14 +2782,15 @@ The Symfony Connect username in parenthesis allows to get more information - Billie Thompson - lol768 - jamogon + - Antoine LA - Vyacheslav Slinko + - Benjamin Laugueux - Jakub Chábek - Johannes - Jörg Rühl - George Dietrich - jannick-holm - wesleyh - - sergey - Menno Holtkamp - Ser5 - Michael Hudson-Doyle @@ -2845,6 +2798,7 @@ The Symfony Connect username in parenthesis allows to get more information - Karim Miladi - Michael Genereux - patrick-mcdougle + - Tyler Stroud - Dariusz Czech - Clemens Krack - Bruno Baguette @@ -2859,18 +2813,18 @@ The Symfony Connect username in parenthesis allows to get more information - Michal Forbak - Drew Butler - Alexey Berezuev + - pawel-lewtak - Pierrick Charron - Steve Müller + - omerida - Andras Ratz - andreabreu98 - gechetspr - brian978 - Michael Schneider - - Cédric Bertolini - n-aleha - Talha Zekeriya Durmuş - Anatol Belski - - Şəhriyar İmanov - Alexis BOYER - bch36 - Kaipi Yann @@ -2881,22 +2835,27 @@ The Symfony Connect username in parenthesis allows to get more information - Guillaume Aveline - Adrian Philipp - James Michael DuPont + - Markus Tacker - Kasperki - dima-gr - Tammy D - Rodolfo Ruiz + - tsilefy - Enrico - Ryan Rud - - Christopher Georg - Ondrej Slinták + - Jérémie Broutier - vlechemin - Brian Corrigan - Ladislav Tánczos + - Brian Freytag - Skorney - Lucas Matte + - Success Go - fmarchalemisys - mieszko4 - Steve Preston + - ibasaw - Wojciech Skorodecki - Kevin Frantz - Neophy7e @@ -2904,6 +2863,7 @@ The Symfony Connect username in parenthesis allows to get more information - Arrilot - ampaze - Chris McGehee + - Shaun Simmons - Markus Staab - Pierre-Louis LAUNAY - djama @@ -2915,21 +2875,24 @@ The Symfony Connect username in parenthesis allows to get more information - Jon Cave - Sébastien HOUZE - Abdulkadir N. A. + - Markus Klein - Adam Klvač - Bruno Nogueira Nascimento Wowk - Tomanhez - satalaondrej + - Matthias Dötsch - jonmldr - Yevgen Kovalienia - Lebnik - - nsbx - Shude - RTUnreal - Richard Hodgson - Sven Fabricius - Ondřej Führer + - Bogdan - Sema - Thorsten Hallwas + - Brian Freytag - Marco Pfeiffer - Alex Nostadt - Michael Squires @@ -2940,17 +2903,20 @@ The Symfony Connect username in parenthesis allows to get more information - Yuriy Potemkin - Emilie Lorenzo - enomotodev - - Babichev Maxim - Edvin Hultberg + - Vincent - Benjamin Long - Kévin Gonella - Ben Miller - Peter Gribanov + - Matteo Galli + - Bart Ruysseveldt - Ash014 + - Loenix - kwiateusz - - jspee - Ilya Bulakh - David Soria Parra + - Simon Frost - Sergiy Sokolenko - Cantepie - detinkin @@ -2964,47 +2930,46 @@ The Symfony Connect username in parenthesis allows to get more information - oscartv - DanSync - Peter Zwosta + - Michal Čihař - parhs - Harry Wiseman - Diego Campoy - - TeLiXj - Oncle Tom - Sam Anthony - Christian Stocker - Oussama Elgoumri + - David Lima - Steve Marvell - Dawid Nowak - Lesnykh Ilia - Shyim - sabruss - darnel - - Karolis Daužickas - Nicolas - Sergio Santoro - tirnanog06 - Andrejs Leonovs + - Alfonso Fernández García - phc - Дмитрий Пацура - Signor Pedro - Matthias Larisch - Maxime P - - ilyes kooli - - Ilia Lazarev + - Sean Templeton - Michaël VEROUX - Julia - Lin Lu - arduanov - sualko - - Molkobain - Yendric - ADmad - Nicolas Roudaire - Matthias Meyer - Temuri Takalandze (abgeo) - Bernard van der Esch (adeptofvoltron) - - Alfonso (afgar) - Andreas Forsblom (aforsblo) - Alex Olmos (alexolmos) + - Cedric BERTOLINI (alsciende) - Antonio Mansilla (amansilla) - Robin Kanters (anddarerobin) - Juan Ases García (ases) @@ -3012,6 +2977,7 @@ The Symfony Connect username in parenthesis allows to get more information - Daniel Basten (axhm3a) - Benedict Massolle (bemas) - Gerard Berengue Llobera (bere) + - Ronny (big-r) - Bernd Matzner (bmatzner) - Anton (bonio) - Bram Tweedegolf (bram_tweedegolf) @@ -3019,67 +2985,71 @@ The Symfony Connect username in parenthesis allows to get more information - Choong Wei Tjeng (choonge) - Kousuke Ebihara (co3k) - Loïc Vernet (coil) - - Christoph Schaefer (cvschaefer) + - Christoph Vincent Schaefer (cvschaefer) - Damon Jones (damon__jones) - Alexandre Fiocre (demos77) - Łukasz Giza (destroyer) - Daniel Londero (dlondero) + - Dušan Kasan (dudo1904) - Sebastian Landwehr (dword123) - Adel ELHAIBA (eadel) - Damián Nohales (eagleoneraptor) - Jordane VASPARD (elementaire) - Elliot Anderson (elliot) + - Erwan Nader (ernadoo) - Fabien D. (fabd) - Faizan Akram Dar (faizanakram) - Carsten Eilers (fnc) - Sorin Gitlan (forapathy) - Yohan Giarelli (frequence-web) - - Gasan Gouseynov (gassan) + - Gasan Guseynov (gassan) - Gerry Vandermaesen (gerryvdm) - - Ghazy Ben Ahmed (ghazy) - - Arash Tabriziyan (ghost098) + - Arash Tabrizian (ghost098) - Greg Szczotka (greg606) - - ibasaw (ibasaw) + - Ian Littman (iansltx) - Nathan DIdier (icz) - Vladislav Krupenkin (ideea) - Ilija Tovilo (ilijatovilo) - Peter Orosz (ill_logical) + - Ilia Lazarev (ilzrv) - Imangazaliev Muhammad (imangazaliev) + - Arkadiusz Kondas (itcraftsmanpl) - j0k (j0k) - - Jeremie Broutier (jbroutier) - joris de wit (jdewit) - Jérémy CROMBEZ (jeremy) - Jose Manuel Gonzalez (jgonzalez) - Joachim Krempel (jkrempel) - Jorge Maiden (jorgemaiden) + - Joao Paulo V Martins (jpjoao) - Justin Rainbow (jrainbow) - Juan Luis (juanlugb) - JuntaTom (juntatom) - Julien Manganne (juuuuuu) - Ismail Faizi (kanafghan) + - Karolis Daužickas (kdauzickas) - Sébastien Armand (khepin) - Pierre-Chanel Gauthier (kmecnin) - Krzysztof Menżyk (krymen) - samuel laulhau (lalop) - Laurent Bachelier (laurentb) - Luís Cobucci (lcobucci) + - Jérémy (libertjeremy) - Mehdi Achour (machour) - Mamikon Arakelyan (mamikon) - - Matthieu Moquet (mattketmo) + - Matt Ketmo (mattketmo) - Moritz Borgmann (mborgmann) - Mathias Brodala (mbrodala) - - Michal Čihař (mcihar) - Matt Drollette (mdrollette) - Adam Monsen (meonkeys) - Mike Milano (mmilano) - - Youssef Benhssaien (moghreb) - - diego aguiar (mollokhan) + - Guillaume Lajarige (molkobain) + - Diego Aguiar (mollokhan) - Ala Eddine Khefifi (nayzo) - emilienbouard (neime) - Nicholas Byfleet (nickbyfleet) + - Nicolas Bondoux (nsbx) - ollie harridge (ollietb) - - Paul Andrieux (paulandrieux) - - Paweł Szczepanek (pauluz) + - Pawel Szczepanek (pauluz) - Philippe Degeeter (pdegeeter) - PLAZANET Pierre (pedrotroller) - Christian López Espínola (penyaskito) @@ -3088,35 +3058,36 @@ The Symfony Connect username in parenthesis allows to get more information - Alex Carol (picard89) - Daniel Perez Pinazo (pitiflautico) - Igor Tarasov (polosatus) - - Maxim Pustynnikov (pustynnikov) - - Ralf Kuehnel (ralfkuehnel) + - Maksym Pustynnikov (pustynnikov) + - Ralf Kühnel (ralfkuehnel) - Ramazan APAYDIN (rapaydin) - - Brayden Williams (redstar504) + - Babichev Maxim (rez1dent3) - Rich Sage (richsage) - - Bart Ruysseveldt (ruyss) - scourgen hung (scourgen) - Sebastian Busch (sebu) - - Sepehr Lajevardi (sepehr) + - Sergey Stavichenko (sergey_stavichenko) - André Filipe Gonçalves Neves (seven) - Bruno Ziegler (sfcoder) - Andrea Giuliano (shark) + - Şəhriyar İmanov (shehriyari) - Thomas Baumgartner (shoplifter) - Schuyler Jager (sjager) + - Christopher Georg (sky-chris) - Volker (skydiablo) - Francisco Alvarez (sormes) - Julien Sanchez (sumbobyboys) - Stephan Vierkant (svierkant) + - Ron Gähler (t-ronx) - Guillermo Gisinger (t3chn0r) - - Markus Tacker (tacker) - Tom Newby (tomnewbyau) - Andrew Clark (tqt_andrew_clark) + - Aaron Piotrowski (trowski) - David Lumaye (tux1124) - Roman Tymoshyk (tymoshyk) - - Tyler Stroud (tystr) - Moritz Kraft (userfriendly) - Víctor Mateo (victormateo) - - Vincent (vincent1870) - - David Herrmann (vworldat) + - Vincent MOULENE (vints24) + - David Grüner (vworldat) - Eugene Babushkin (warl) - Wouter Sioen (wouter_sioen) - Xavier Amado (xamado) @@ -3128,11 +3099,13 @@ The Symfony Connect username in parenthesis allows to get more information - Kovacs Nicolas - craigmarvelley - Stano Turza - - simpson + - Antoine Leblanc - drublic + - Andre Johnson - MaPePeR - Andreas Streichardt - Alexandre Segura + - Marco Pfeiffer - Vivien - Pascal Hofmann - david-binda @@ -3140,7 +3113,6 @@ The Symfony Connect username in parenthesis allows to get more information - Gustavo Adrian - damaya - Kevin Weber - - Ben Scott - Alexandru Năstase - Dionysis Arvanitis - Sergey Fedotov @@ -3153,9 +3125,8 @@ The Symfony Connect username in parenthesis allows to get more information - Jan Emrich - Anne-Julia Seitz - Mark Topper + - Romain - Xavier REN - - Zander Baldwin - - Philipp Scheit - max - Alexander Bauer (abauer) - Ahmad Mayahi (ahmadmayahi) @@ -3166,14 +3137,19 @@ The Symfony Connect username in parenthesis allows to get more information - Bogdan Rancichi (devck) - Daniel Kolvik (dkvk) - Marc Lemay (flug) + - Gabriel Solomon (gabrielsolomon) - Henne Van Och (hennevo) - Jeroen De Dauw (jeroendedauw) - Maxime COLIN (maximecolin) - Muharrem Demirci (mdemirci) - Evgeny Z (meze) + - Aleksandar Dimitrov (netbull) - Pierre Geyer (ptheg) - Thomas BERTRAND (sevrahk) + - Vladislav (simpson) - Matej Žilák (teo_sk) + - Gary Houbre (thegarious) - Vladislav Vlastovskiy (vlastv) - RENAUDIN Xavier (xorrox) - Yannick Vanhaeren (yvh) + - Zan Baldwin (zanderbaldwin) diff --git a/src/Symfony/Bridge/Doctrine/Form/ChoiceList/DoctrineChoiceLoader.php b/src/Symfony/Bridge/Doctrine/Form/ChoiceList/DoctrineChoiceLoader.php index c5ba42d471c35..0a5ea326eff0a 100644 --- a/src/Symfony/Bridge/Doctrine/Form/ChoiceList/DoctrineChoiceLoader.php +++ b/src/Symfony/Bridge/Doctrine/Form/ChoiceList/DoctrineChoiceLoader.php @@ -13,7 +13,6 @@ use Doctrine\Persistence\ObjectManager; use Symfony\Component\Form\ChoiceList\ArrayChoiceList; -use Symfony\Component\Form\ChoiceList\ChoiceListInterface; use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface; /** @@ -29,9 +28,9 @@ class DoctrineChoiceLoader implements ChoiceLoaderInterface private $objectLoader; /** - * @var ChoiceListInterface + * @var array|null */ - private $choiceList; + private $choices; /** * Creates a new choice loader. @@ -74,15 +73,13 @@ public function __construct(ObjectManager $manager, string $class, IdReader $idR */ public function loadChoiceList($value = null) { - if ($this->choiceList) { - return $this->choiceList; + if (null === $this->choices) { + $this->choices = $this->objectLoader + ? $this->objectLoader->getEntities() + : $this->manager->getRepository($this->class)->findAll(); } - $objects = $this->objectLoader - ? $this->objectLoader->getEntities() - : $this->manager->getRepository($this->class)->findAll(); - - return $this->choiceList = new ArrayChoiceList($objects, $value); + return new ArrayChoiceList($this->choices, $value); } /** @@ -100,7 +97,7 @@ public function loadValuesForChoices(array $choices, $value = null) $optimize = $this->idReader && (null === $value || \is_array($value) && $value[0] === $this->idReader); // Attention: This optimization does not check choices for existence - if ($optimize && !$this->choiceList && $this->idReader->isSingleId()) { + if ($optimize && !$this->choices && $this->idReader->isSingleId()) { $values = []; // Maintain order and indices of the given objects @@ -136,7 +133,7 @@ public function loadChoicesForValues(array $values, $value = null) // a single-field identifier $optimize = $this->idReader && (null === $value || \is_array($value) && $this->idReader === $value[0]); - if ($optimize && !$this->choiceList && $this->objectLoader && $this->idReader->isSingleId()) { + if ($optimize && !$this->choices && $this->objectLoader && $this->idReader->isSingleId()) { $unorderedObjects = $this->objectLoader->getEntitiesByIds($this->idReader->getIdField(), $values); $objectsById = []; $objects = []; diff --git a/src/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php b/src/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php index a96a543a60a12..e53fa3366e953 100644 --- a/src/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php +++ b/src/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php @@ -50,7 +50,7 @@ public function getEntities() */ public function getEntitiesByIds($identifier, array $values) { - if (null !== $this->queryBuilder->getMaxResults() || null !== $this->queryBuilder->getFirstResult()) { + if (null !== $this->queryBuilder->getMaxResults() || 0 < (int) $this->queryBuilder->getFirstResult()) { // an offset or a limit would apply on results including the where clause with submitted id values // that could make invalid choices valid $choices = []; diff --git a/src/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php b/src/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php index 3202dae97f5c2..d8235a681479f 100644 --- a/src/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php +++ b/src/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php @@ -24,8 +24,6 @@ class CollectionToArrayTransformer implements DataTransformerInterface /** * Transforms a collection into an array. * - * @return mixed An array of entities - * * @throws TransformationFailedException */ public function transform($collection) @@ -48,11 +46,9 @@ public function transform($collection) } /** - * Transforms choice keys into entities. - * - * @param mixed $array An array of entities + * Transforms an array into a collection. * - * @return Collection A collection of entities + * @return Collection */ public function reverseTransform($array) { diff --git a/src/Symfony/Bridge/Doctrine/ManagerRegistry.php b/src/Symfony/Bridge/Doctrine/ManagerRegistry.php index 0ed055fec64b7..b001cfd933210 100644 --- a/src/Symfony/Bridge/Doctrine/ManagerRegistry.php +++ b/src/Symfony/Bridge/Doctrine/ManagerRegistry.php @@ -12,6 +12,7 @@ namespace Symfony\Bridge\Doctrine; use Doctrine\Persistence\AbstractManagerRegistry; +use ProxyManager\Proxy\GhostObjectInterface; use ProxyManager\Proxy\LazyLoadingInterface; use Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator; use Symfony\Component\DependencyInjection\Container; @@ -19,7 +20,7 @@ /** * References Doctrine connections and entity/document managers. * - * @author Lukas Kahwe Smith + * @author Lukas Kahwe Smith */ abstract class ManagerRegistry extends AbstractManagerRegistry { @@ -53,6 +54,9 @@ protected function resetService($name) if (!$manager instanceof LazyLoadingInterface) { throw new \LogicException('Resetting a non-lazy manager service is not supported. '.(interface_exists(LazyLoadingInterface::class) && class_exists(RuntimeInstantiator::class) ? sprintf('Declare the "%s" service as lazy.', $name) : 'Try running "composer require symfony/proxy-manager-bridge".')); } + if ($manager instanceof GhostObjectInterface) { + throw new \LogicException('Resetting a lazy-ghost-object manager service is not supported.'); + } $manager->setProxyInitializer(\Closure::bind( function (&$wrappedInstance, LazyLoadingInterface $manager) use ($name) { if (isset($this->normalizedIds[$normalizedId = strtolower($name)])) { // BC with DI v3.4 diff --git a/src/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/DoctrineChoiceLoaderTest.php b/src/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/DoctrineChoiceLoaderTest.php index 004eec8201336..29da316d20feb 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/DoctrineChoiceLoaderTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/DoctrineChoiceLoaderTest.php @@ -146,8 +146,7 @@ public function testLoadChoiceListUsesObjectLoaderIfAvailable() $this->assertEquals($choiceList, $loaded = $loader->loadChoiceList()); // no further loads on subsequent calls - - $this->assertSame($loaded, $loader->loadChoiceList()); + $this->assertEquals($loaded, $loader->loadChoiceList()); } public function testLoadValuesForChoices() diff --git a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php index cb7eeed32bbf2..f593618f9c8ff 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php @@ -1779,4 +1779,32 @@ public function testSubmitNullMultipleUsesDefaultEmptyData() $this->assertEquals($collection, $form->getNormData()); $this->assertEquals($collection, $form->getData()); } + + public function testWithSameLoaderAndDifferentChoiceValueCallbacks() + { + $entity1 = new SingleIntIdEntity(1, 'Foo'); + $entity2 = new SingleIntIdEntity(2, 'Bar'); + $this->persist([$entity1, $entity2]); + + $view = $this->factory->create(FormTypeTest::TESTED_TYPE) + ->add('entity_one', self::TESTED_TYPE, [ + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->add('entity_two', self::TESTED_TYPE, [ + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + 'choice_value' => function ($choice) { + return $choice ? $choice->name : ''; + }, + ]) + ->createView() + ; + + $this->assertSame('1', $view['entity_one']->vars['choices'][1]->value); + $this->assertSame('2', $view['entity_one']->vars['choices'][2]->value); + + $this->assertSame('Foo', $view['entity_two']->vars['choices']['Foo']->value); + $this->assertSame('Bar', $view['entity_two']->vars['choices']['Bar']->value); + } } diff --git a/src/Symfony/Bridge/Doctrine/composer.json b/src/Symfony/Bridge/Doctrine/composer.json index f14aa99bc8ad4..b4ebc03d319fb 100644 --- a/src/Symfony/Bridge/Doctrine/composer.json +++ b/src/Symfony/Bridge/Doctrine/composer.json @@ -29,7 +29,7 @@ "symfony/stopwatch": "^3.4|^4.0|^5.0", "symfony/config": "^4.2|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/form": "^4.4.11|^5.0.11", + "symfony/form": "^4.4.41|^5.0.11", "symfony/http-kernel": "^4.3.7", "symfony/messenger": "^4.4|^5.0", "symfony/property-access": "^3.4|^4.0|^5.0", diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig index a75e364187743..990b324cb0d17 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig @@ -49,6 +49,7 @@ col-sm-2
{{- form_widget(form, widget_attr) -}} {{- form_help(form) -}} + {{- form_errors(form) -}}
{##} diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php index 530cf95d2e488..0ff799ba9bbc3 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php @@ -79,20 +79,20 @@ protected function findExtension($name) $guess = $bundle->getName(); $minScore = $distance; } + } - $extension = $bundle->getContainerExtension(); + $container = $this->getContainerBuilder(); - if ($extension) { - if ($name === $extension->getAlias()) { - return $extension; - } + if ($container->hasExtension($name)) { + return $container->getExtension($name); + } - $distance = levenshtein($name, $extension->getAlias()); + foreach ($container->getExtensions() as $extension) { + $distance = levenshtein($name, $extension->getAlias()); - if ($distance < $minScore) { - $guess = $extension->getAlias(); - $minScore = $distance; - } + if ($distance < $minScore) { + $guess = $extension->getAlias(); + $minScore = $distance; } } diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php index a0581ff21fb6f..d7db6ebf050a4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php @@ -29,7 +29,6 @@ public function process(ContainerBuilder $container) // "annotation_reader" at build time don't get any cache foreach ($container->findTaggedServiceIds('annotations.cached_reader') as $id => $tags) { $reader = $container->getDefinition($id); - $reader->setPublic(false); $properties = $reader->getProperties(); if (isset($properties['cacheProviderBackup'])) { diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/UnusedTagsPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/UnusedTagsPass.php index 888a5ea8d64c1..669d331c062f3 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/UnusedTagsPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/UnusedTagsPass.php @@ -28,6 +28,7 @@ class UnusedTagsPass implements CompilerPassInterface 'cache.pool.clearer', 'config_cache.resource_checker', 'console.command', + 'container.do_not_inline', 'container.env_var_loader', 'container.env_var_processor', 'container.hot_path', diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 6f55ad6c38f39..ca338fc2054db 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -469,6 +469,8 @@ public function load(array $configs, ContainerBuilder $container) ->addTag('routing.route_loader'); $container->setParameter('container.behavior_describing_tags', [ + 'annotations.cached_reader', + 'container.do_not_inline', 'container.service_locator', 'container.service_subscriber', 'kernel.event_subscriber', @@ -1463,11 +1465,9 @@ private function registerAnnotationsConfiguration(array $config, ContainerBuilde $container ->getDefinition('annotations.cached_reader') - ->setPublic(true) // set to false in AddAnnotationsCachedReaderPass ->replaceArgument(2, $config['debug']) // reference the cache provider without using it until AddAnnotationsCachedReaderPass runs ->addArgument(new ServiceClosureArgument(new Reference($cacheService))) - ->addTag('annotations.cached_reader') ; $container->setAlias('annotation_reader', 'annotations.cached_reader')->setPrivate(true); diff --git a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php index 1e76d527cd6b3..f5c52cf19749d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php +++ b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php @@ -157,12 +157,12 @@ public function build(ContainerBuilder $container) $container->addCompilerPass(new RegisterReverseContainerPass(true)); $container->addCompilerPass(new RegisterReverseContainerPass(false), PassConfig::TYPE_AFTER_REMOVING); $container->addCompilerPass(new SessionPass()); - $container->addCompilerPass(new CacheCollectorPass(), PassConfig::TYPE_BEFORE_REMOVING); if ($container->getParameter('kernel.debug')) { $container->addCompilerPass(new AddDebugLogProcessorPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 2); $container->addCompilerPass(new UnusedTagsPass(), PassConfig::TYPE_AFTER_REMOVING); $container->addCompilerPass(new ContainerBuilderDebugDumpPass(), PassConfig::TYPE_BEFORE_REMOVING, -255); + $container->addCompilerPass(new CacheCollectorPass(), PassConfig::TYPE_BEFORE_REMOVING); } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml index 4420dfbf00db1..1fb375ea3c472 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml @@ -31,6 +31,8 @@ + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index b66d0837c3a37..c2c7bc6b851cc 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -1699,6 +1699,8 @@ public function testRegisterParameterCollectingBehaviorDescribingTags() $this->assertTrue($container->hasParameter('container.behavior_describing_tags')); $this->assertEquals([ + 'annotations.cached_reader', + 'container.do_not_inline', 'container.service_locator', 'container.service_subscriber', 'kernel.event_subscriber', diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/alias_with_definition_2.txt b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/alias_with_definition_2.txt index 12e90d48ae40b..4fd20cf7e5fab 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/alias_with_definition_2.txt +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/alias_with_definition_2.txt @@ -8,9 +8,9 @@ ----------------- --------------------------------- Service ID .service_2 Class Full\Qualified\Class2 - Tags tag1 (attr1: val1, attr2: val2)  - tag1 (attr3: val3)  - tag2 + Tags tag1 (attr1: val1, attr2: val2) + tag1 (attr3: val3) + tag2 Calls setMailer Public no Synthetic yes diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.txt b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.txt index 2d5b03794ea80..0ceb807a45c2f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.txt +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.txt @@ -3,9 +3,9 @@ ----------------- --------------------------------- Service ID - Class Full\Qualified\Class2 - Tags tag1 (attr1: val1, attr2: val2)  - tag1 (attr3: val3)  - tag2 + Tags tag1 (attr1: val1, attr2: val2) + tag1 (attr3: val3) + tag2 Calls setMailer Public no Synthetic yes diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_1.txt b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_1.txt index 2e9dc9771c09d..a3caa93c9dcf9 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_1.txt +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_1.txt @@ -13,12 +13,12 @@ Autoconfigured no Factory Class Full\Qualified\FactoryClass Factory Method get - Arguments Service(.definition_2)  - %parameter%  - Inlined Service  - Array (3 element(s))  - Iterator (2 element(s))  - - Service(definition_1)  - - Service(.definition_2) + Arguments Service(.definition_2) + %parameter% + Inlined Service + Array (3 element(s)) + Iterator (2 element(s)) + - Service(definition_1) + - Service(.definition_2) ---------------- ----------------------------- diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_2.txt b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_2.txt index 2d5b03794ea80..0ceb807a45c2f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_2.txt +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_2.txt @@ -3,9 +3,9 @@ ----------------- --------------------------------- Service ID - Class Full\Qualified\Class2 - Tags tag1 (attr1: val1, attr2: val2)  - tag1 (attr3: val3)  - tag2 + Tags tag1 (attr1: val1, attr2: val2) + tag1 (attr3: val3) + tag2 Calls setMailer Public no Synthetic yes diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_1.txt b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_1.txt index 25074dfd18b2c..9814273b7a221 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_1.txt +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_1.txt @@ -11,7 +11,7 @@ | Requirements | name: [a-z]+ | | Class | Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\RouteStub | | Defaults | name: Joseph | -| Options | compiler_class: Symfony\Component\Routing\RouteCompiler | -| | opt1: val1 | -| | opt2: val2 | +| Options | compiler_class: Symfony\Component\Routing\RouteCompiler | +| | opt1: val1 | +| | opt2: val2 | +--------------+-------------------------------------------------------------------+ diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_2.txt b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_2.txt index 5853dd013d3a3..533409d402add 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_2.txt +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_2.txt @@ -11,8 +11,8 @@ | Requirements | NO CUSTOM | | Class | Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\RouteStub | | Defaults | NONE | -| Options | compiler_class: Symfony\Component\Routing\RouteCompiler | -| | opt1: val1 | -| | opt2: val2 | +| Options | compiler_class: Symfony\Component\Routing\RouteCompiler | +| | opt1: val1 | +| | opt2: val2 | | Condition | context.getMethod() in ['GET', 'HEAD', 'POST'] | +--------------+-------------------------------------------------------------------+ diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDebugCommandTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDebugCommandTest.php index 0df853997c59a..fbfa0be6e6c08 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDebugCommandTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDebugCommandTest.php @@ -68,6 +68,15 @@ public function testDefaultParameterValueIsResolvedIfConfigIsExisting() $this->assertStringContainsString(sprintf("dsn: 'file:%s/profiler'", $kernelCacheDir), $tester->getDisplay()); } + public function testDumpExtensionConfigWithoutBundle() + { + $tester = $this->createCommandTester(); + $ret = $tester->execute(['name' => 'test_dump']); + + $this->assertSame(0, $ret, 'Returns 0 in case of success'); + $this->assertStringContainsString('enabled: true', $tester->getDisplay()); + } + public function testDumpUndefinedBundleOption() { $tester = $this->createCommandTester(); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDumpReferenceCommandTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDumpReferenceCommandTest.php index f4298ac9a851c..74c1889e2b99a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDumpReferenceCommandTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDumpReferenceCommandTest.php @@ -40,6 +40,15 @@ public function testDumpBundleName() $this->assertStringContainsString(' custom:', $tester->getDisplay()); } + public function testDumpExtensionConfigWithoutBundle() + { + $tester = $this->createCommandTester(); + $ret = $tester->execute(['name' => 'test_dump']); + + $this->assertSame(0, $ret, 'Returns 0 in case of success'); + $this->assertStringContainsString('enabled: true', $tester->getDisplay()); + } + public function testDumpAtPath() { $tester = $this->createCommandTester(); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Extension/TestDumpExtension.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Extension/TestDumpExtension.php new file mode 100644 index 0000000000000..d8cef92850992 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Extension/TestDumpExtension.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\FrameworkBundle\Tests\Functional\Extension; + +use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Symfony\Component\Config\Definition\ConfigurationInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Extension\Extension; + +class TestDumpExtension extends Extension implements ConfigurationInterface +{ + public function getConfigTreeBuilder(): TreeBuilder + { + $treeBuilder = new TreeBuilder('test_dump'); + $treeBuilder->getRootNode() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ; + + return $treeBuilder; + } + + public function load(array $configs, ContainerBuilder $container): void + { + } + + public function getConfiguration(array $config, ContainerBuilder $container): ConfigurationInterface + { + return $this; + } +} diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/AppKernel.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/AppKernel.php index 94b9bfa012b3c..817c9360f4da3 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/AppKernel.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/AppKernel.php @@ -12,6 +12,7 @@ namespace Symfony\Bundle\FrameworkBundle\Tests\Functional\app; use Psr\Log\NullLogger; +use Symfony\Bundle\FrameworkBundle\Tests\Functional\Extension\TestDumpExtension; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -78,6 +79,7 @@ public function registerContainerConfiguration(LoaderInterface $loader) protected function build(ContainerBuilder $container) { $container->register('logger', NullLogger::class); + $container->registerExtension(new TestDumpExtension()); } public function __sleep(): array diff --git a/src/Symfony/Bundle/FrameworkBundle/composer.json b/src/Symfony/Bundle/FrameworkBundle/composer.json index a9735e6c47ec3..bf3ffcac6fe0f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/composer.json +++ b/src/Symfony/Bundle/FrameworkBundle/composer.json @@ -37,7 +37,7 @@ "paragonie/sodium_compat": "^1.8", "symfony/asset": "^3.4|^4.0|^5.0", "symfony/browser-kit": "^4.3|^5.0", - "symfony/console": "^4.4.21|^5.0", + "symfony/console": "^4.4.42|^5.4.9", "symfony/css-selector": "^3.4|^4.0|^5.0", "symfony/dom-crawler": "^4.4.30|^5.3.7", "symfony/dotenv": "^4.3.6|^5.0", diff --git a/src/Symfony/Bundle/SecurityBundle/Resources/config/security_listeners.xml b/src/Symfony/Bundle/SecurityBundle/Resources/config/security_listeners.xml index 503bd10bed4ed..3cd2bfabdfbf6 100644 --- a/src/Symfony/Bundle/SecurityBundle/Resources/config/security_listeners.xml +++ b/src/Symfony/Bundle/SecurityBundle/Resources/config/security_listeners.xml @@ -88,6 +88,7 @@ + diff --git a/src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterSentinelTest.php b/src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterSentinelTest.php index c8b3ce9b9da62..b79a5069f362f 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterSentinelTest.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterSentinelTest.php @@ -14,6 +14,7 @@ use PHPUnit\Framework\SkippedTestSuiteError; use Symfony\Component\Cache\Adapter\AbstractAdapter; use Symfony\Component\Cache\Adapter\RedisAdapter; +use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Exception\InvalidArgumentException; /** @@ -43,4 +44,12 @@ public function testInvalidDSNHasBothClusterAndSentinel() $dsn = 'redis:?host[redis1]&host[redis2]&host[redis3]&redis_cluster=1&redis_sentinel=mymaster'; RedisAdapter::createConnection($dsn); } + + public function testSentinelRequiresPredis() + { + $this->expectException(CacheException::class); + $this->expectExceptionMessage('Cannot use Redis Sentinel: class "Redis" does not extend "Predis\Client":'); + $dsn = 'redis:?host[redis1]&host[redis2]&host[redis3]&redis_cluster=1&redis_sentinel=mymaster'; + RedisAdapter::createConnection($dsn, ['class' => \Redis::class]); + } } diff --git a/src/Symfony/Component/Cache/Traits/RedisTrait.php b/src/Symfony/Component/Cache/Traits/RedisTrait.php index efff27296628d..c27e0df689493 100644 --- a/src/Symfony/Component/Cache/Traits/RedisTrait.php +++ b/src/Symfony/Component/Cache/Traits/RedisTrait.php @@ -178,6 +178,10 @@ public static function createConnection($dsn, array $options = []) $class = $params['redis_cluster'] ? \RedisCluster::class : (1 < \count($hosts) ? \RedisArray::class : \Redis::class); } else { $class = $params['class'] ?? \Predis\Client::class; + + if (isset($params['redis_sentinel']) && !is_a($class, \Predis\Client::class, true)) { + throw new CacheException(sprintf('Cannot use Redis Sentinel: class "%s" does not extend "Predis\Client": "%s".', $class, $dsn)); + } } if (is_a($class, \Redis::class, true)) { diff --git a/src/Symfony/Component/Config/Resource/GlobResource.php b/src/Symfony/Component/Config/Resource/GlobResource.php index 3657f6dcb9500..57e528462cc90 100644 --- a/src/Symfony/Component/Config/Resource/GlobResource.php +++ b/src/Symfony/Component/Config/Resource/GlobResource.php @@ -111,7 +111,9 @@ public function getIterator() $prefix = str_replace('\\', '/', $this->prefix); $paths = null; - if (!str_starts_with($this->prefix, 'phar://') && !str_contains($this->pattern, '/**/')) { + if ('' === $this->pattern && is_file($prefix)) { + $paths = [$this->prefix]; + } elseif (!str_starts_with($this->prefix, 'phar://') && !str_contains($this->pattern, '/**/')) { if ($this->globBrace || !str_contains($this->pattern, '{')) { $paths = glob($this->prefix.$this->pattern, \GLOB_NOSORT | $this->globBrace); } elseif (!str_contains($this->pattern, '\\') || !preg_match('/\\\\[,{}]/', $this->pattern)) { @@ -172,14 +174,21 @@ function (\SplFileInfo $file, $path) { throw new \LogicException(sprintf('Extended glob pattern "%s" cannot be used as the Finder component is not installed.', $this->pattern)); } + if (is_file($prefix = $this->prefix)) { + $prefix = \dirname($prefix); + $pattern = basename($prefix).$this->pattern; + } else { + $pattern = $this->pattern; + } + $finder = new Finder(); - $regex = Glob::toRegex($this->pattern); + $regex = Glob::toRegex($pattern); if ($this->recursive) { $regex = substr_replace($regex, '(/|$)', -2, 1); } - $prefixLen = \strlen($this->prefix); - foreach ($finder->followLinks()->sortByName()->in($this->prefix) as $path => $info) { + $prefixLen = \strlen($prefix); + foreach ($finder->followLinks()->sortByName()->in($prefix) as $path => $info) { $normalizedPath = str_replace('\\', '/', $path); if (!preg_match($regex, substr($normalizedPath, $prefixLen)) || !$info->isFile()) { continue; diff --git a/src/Symfony/Component/Config/Tests/Fixtures/some.phar b/src/Symfony/Component/Config/Tests/Fixtures/some.phar new file mode 100644 index 0000000000000..93d4e87c0b89b Binary files /dev/null and b/src/Symfony/Component/Config/Tests/Fixtures/some.phar differ diff --git a/src/Symfony/Component/Config/Tests/Resource/GlobResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/GlobResourceTest.php index fd317eb55c067..96953f3e32b8c 100644 --- a/src/Symfony/Component/Config/Tests/Resource/GlobResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/GlobResourceTest.php @@ -208,4 +208,29 @@ public function testSerializeUnserialize() $this->assertEquals($p->getValue($resource), $p->getValue($newResource)); } + + public function testPhar() + { + $s = \DIRECTORY_SEPARATOR; + $cwd = getcwd(); + chdir(\dirname(__DIR__).'/Fixtures'); + try { + $resource = new GlobResource('phar://some.phar', '*', true); + $files = array_keys(iterator_to_array($resource)); + $this->assertSame(["phar://some.phar{$s}ProjectWithXsdExtensionInPhar.php", "phar://some.phar{$s}schema{$s}project-1.0.xsd"], $files); + + $resource = new GlobResource("phar://some.phar{$s}ProjectWithXsdExtensionInPhar.php", '', true); + $files = array_keys(iterator_to_array($resource)); + $this->assertSame(["phar://some.phar{$s}ProjectWithXsdExtensionInPhar.php"], $files); + } finally { + chdir($cwd); + } + } + + public function testFilePrefix() + { + $resource = new GlobResource(__FILE__, '/**/', true); + $files = array_keys(iterator_to_array($resource)); + $this->assertSame([], $files); + } } diff --git a/src/Symfony/Component/Console/Helper/Table.php b/src/Symfony/Component/Console/Helper/Table.php index a5f34cb140d82..99496b1c72dea 100644 --- a/src/Symfony/Component/Console/Helper/Table.php +++ b/src/Symfony/Component/Console/Helper/Table.php @@ -586,7 +586,7 @@ private function buildTableRows(array $rows): TableRows } $escaped = implode("\n", array_map([OutputFormatter::class, 'escapeTrailingBackslash'], explode("\n", $cell))); $cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped; - $lines = explode("\n", str_replace("\n", "\n", $cell)); + $lines = explode("\n", str_replace("\n", "\n", $cell)); foreach ($lines as $lineKey => $line) { if ($colspan > 1) { $line = new TableCell($line, ['colspan' => $colspan]); @@ -763,18 +763,18 @@ private function calculateColumnsWidth(iterable $groups) continue; } - foreach ($row as $i => $cell) { - if ($cell instanceof TableCell) { - $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); - $textLength = Helper::strlen($textContent); - if ($textLength > 0) { - $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan())); - foreach ($contentColumns as $position => $content) { - $row[$i + $position] = $content; + foreach ($row as $i => $cell) { + if ($cell instanceof TableCell) { + $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); + $textLength = Helper::strlen($textContent); + if ($textLength > 0) { + $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan())); + foreach ($contentColumns as $position => $content) { + $row[$i + $position] = $content; + } } } } - } $lengths[] = $this->getCellWidth($row, $column); } diff --git a/src/Symfony/Component/Console/Input/InputArgument.php b/src/Symfony/Component/Console/Input/InputArgument.php index 085aca5a7443e..accd4d0c5b4d7 100644 --- a/src/Symfony/Component/Console/Input/InputArgument.php +++ b/src/Symfony/Component/Console/Input/InputArgument.php @@ -92,7 +92,7 @@ public function isArray() */ public function setDefault($default = null) { - if (self::REQUIRED === $this->mode && null !== $default) { + if ($this->isRequired() && null !== $default) { throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); } diff --git a/src/Symfony/Component/Console/Tests/Helper/TableTest.php b/src/Symfony/Component/Console/Tests/Helper/TableTest.php index 14ea5c6bb15ba..c0f3f96b2aa95 100644 --- a/src/Symfony/Component/Console/Tests/Helper/TableTest.php +++ b/src/Symfony/Component/Console/Tests/Helper/TableTest.php @@ -615,8 +615,8 @@ public function renderProvider() 'default', <<<'TABLE' +-------+------------+ -| Dont break | -| here | +| Dont break | +| here | +-------+------------+ | foo | Dont break | | bar | here | @@ -1078,6 +1078,26 @@ public function renderSetTitle() | 80-902734-1-6 | And Then There Were None | Agatha Christie | +---------------+--------- Page 1/2 -------+------------------+ +TABLE + , + true, + ], + 'header contains multiple lines' => [ + 'Multiline'."\n".'header'."\n".'here', + 'footer', + 'default', + <<<'TABLE' ++---------------+--- Multiline +header +here +------------------+ +| ISBN | Title | Author | ++---------------+--------------------------+------------------+ +| 99921-58-10-7 | Divine Comedy | Dante Alighieri | +| 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | +| 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | +| 80-902734-1-6 | And Then There Were None | Agatha Christie | ++---------------+---------- footer --------+------------------+ + TABLE ], [ diff --git a/src/Symfony/Component/Console/Tests/Input/InputArgumentTest.php b/src/Symfony/Component/Console/Tests/Input/InputArgumentTest.php index 4e583888a6b86..9dae4e2cace7e 100644 --- a/src/Symfony/Component/Console/Tests/Input/InputArgumentTest.php +++ b/src/Symfony/Component/Console/Tests/Input/InputArgumentTest.php @@ -88,6 +88,14 @@ public function testSetDefaultWithRequiredArgument() $argument->setDefault('default'); } + public function testSetDefaultWithRequiredArrayArgument() + { + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Cannot set a default value except for InputArgument::OPTIONAL mode.'); + $argument = new InputArgument('foo', InputArgument::REQUIRED | InputArgument::IS_ARRAY); + $argument->setDefault([]); + } + public function testSetDefaultWithArrayArgument() { $this->expectException(\LogicException::class); diff --git a/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php b/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php index af7c957a308a2..3b8086d0931e6 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php @@ -40,6 +40,10 @@ public function process(ContainerBuilder $container) } $decoratingDefinitions = []; + $tagsToKeep = $container->hasParameter('container.behavior_describing_tags') + ? $container->getParameter('container.behavior_describing_tags') + : ['container.do_not_inline', 'container.service_locator', 'container.service_subscriber']; + foreach ($definitions as [$id, $definition]) { $decoratedService = $definition->getDecoratedService(); [$inner, $renamedId] = $decoratedService; @@ -89,8 +93,8 @@ public function process(ContainerBuilder $container) $decoratingTags = $decoratingDefinition->getTags(); $resetTags = []; - // container.service_locator and container.service_subscriber have special logic and they must not be transferred out to decorators - foreach (['container.service_locator', 'container.service_subscriber'] as $containerTag) { + // Behavior-describing tags must not be transferred out to decorators + foreach ($tagsToKeep as $containerTag) { if (isset($decoratingTags[$containerTag])) { $resetTags[$containerTag] = $decoratingTags[$containerTag]; unset($decoratingTags[$containerTag]); diff --git a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php index 358b750f2a376..7935983ff5c2e 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php @@ -177,7 +177,7 @@ protected function processValue($value, $isRoot = false) */ private function isInlineableDefinition(string $id, Definition $definition): bool { - if ($definition->hasErrors() || $definition->isDeprecated() || $definition->isLazy() || $definition->isSynthetic()) { + if ($definition->hasErrors() || $definition->isDeprecated() || $definition->isLazy() || $definition->isSynthetic() || $definition->hasTag('container.do_not_inline')) { return false; } diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveChildDefinitionsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveChildDefinitionsPass.php index 333480d66683c..de59dafd2151b 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveChildDefinitionsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveChildDefinitionsPass.php @@ -187,6 +187,12 @@ private function doResolveDefinition(ChildDefinition $definition): Definition // and it's not legal on an instanceof $def->setAutoconfigured($definition->isAutoconfigured()); + if (!$def->hasTag('proxy')) { + foreach ($parentDef->getTag('proxy') as $v) { + $def->addTag('proxy', $v); + } + } + return $def; } } diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php index 32eb6a3a76f3e..d31c54661c0b4 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php @@ -85,6 +85,11 @@ protected function processValue($value, $isRoot = false) if (isset($changes['file'])) { $value->setFile($this->bag->resolveValue($value->getFile())); } + $tags = $value->getTags(); + if (isset($tags['proxy'])) { + $tags['proxy'] = $this->bag->resolveValue($tags['proxy']); + $value->setTags($tags); + } } $value = parent::processValue($value, $isRoot); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php index 4f01d33c4923d..ac4269753525c 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php @@ -325,6 +325,34 @@ public function testProcessDoesNotSetLazyArgumentValuesAfterInlining() $this->assertSame('inline', (string) $values[0]); } + public function testDoNotInline() + { + $container = new ContainerBuilder(); + $container->register('decorated1', 'decorated1')->addTag('container.do_not_inline'); + $container->register('decorated2', 'decorated2')->addTag('container.do_not_inline'); + $container->setAlias('alias2', 'decorated2'); + + $container + ->register('s1', 's1') + ->setDecoratedService('decorated1') + ->setPublic(true) + ->setProperties(['inner' => new Reference('s1.inner')]); + + $container + ->register('s2', 's2') + ->setDecoratedService('alias2') + ->setPublic(true) + ->setProperties(['inner' => new Reference('s2.inner')]); + + $container->compile(); + + $this->assertFalse($container->hasAlias('alias2')); + $this->assertEquals(new Reference('decorated2'), $container->getDefinition('s2')->getProperties()['inner']); + $this->assertEquals(new Reference('s1.inner'), $container->getDefinition('s1')->getProperties()['inner']); + $this->assertSame('decorated2', $container->getDefinition('decorated2')->getClass()); + $this->assertSame('decorated1', $container->getDefinition('s1.inner')->getClass()); + } + protected function process(ContainerBuilder $container) { (new InlineServiceDefinitionsPass(new AnalyzeServiceReferencesPass()))->process($container); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveChildDefinitionsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveChildDefinitionsPassTest.php index 7a89feb9b7659..7293dd94b2936 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveChildDefinitionsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveChildDefinitionsPassTest.php @@ -118,6 +118,31 @@ public function testProcessDoesNotCopyTags() $this->assertEquals([], $def->getTags()); } + public function testProcessCopiesTagsProxy() + { + $container = new ContainerBuilder(); + + $container + ->register('parent') + ->addTag('proxy', ['a' => 'b']) + ; + + $container + ->setDefinition('child1', new ChildDefinition('parent')) + ; + $container + ->setDefinition('child2', (new ChildDefinition('parent'))->addTag('proxy', ['c' => 'd'])) + ; + + $this->process($container); + + $def = $container->getDefinition('child1'); + $this->assertSame(['proxy' => [['a' => 'b']]], $def->getTags()); + + $def = $container->getDefinition('child2'); + $this->assertSame(['proxy' => [['c' => 'd']]], $def->getTags()); + } + public function testProcessDoesNotCopyDecoratedService() { $container = new ContainerBuilder(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveParameterPlaceHoldersPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveParameterPlaceHoldersPassTest.php index c586e72c2acbc..96c45205459df 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveParameterPlaceHoldersPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveParameterPlaceHoldersPassTest.php @@ -97,6 +97,20 @@ public function testParameterNotFoundExceptionsIsNotThrown() $this->assertCount(1, $definition->getErrors()); } + public function testOnlyProxyTagIsResolved() + { + $containerBuilder = new ContainerBuilder(); + $containerBuilder->setParameter('a_param', 'here_you_go'); + $definition = $containerBuilder->register('def'); + $definition->addTag('foo', ['bar' => '%a_param%']); + $definition->addTag('proxy', ['interface' => '%a_param%']); + + $pass = new ResolveParameterPlaceHoldersPass(true, false); + $pass->process($containerBuilder); + + $this->assertSame(['foo' => [['bar' => '%a_param%']], 'proxy' => [['interface' => 'here_you_go']]], $definition->getTags()); + } + private function createContainerBuilder(): ContainerBuilder { $containerBuilder = new ContainerBuilder(); diff --git a/src/Symfony/Component/DomCrawler/Crawler.php b/src/Symfony/Component/DomCrawler/Crawler.php index 462b6b1129d9e..4f89eec75a74b 100644 --- a/src/Symfony/Component/DomCrawler/Crawler.php +++ b/src/Symfony/Component/DomCrawler/Crawler.php @@ -1214,11 +1214,11 @@ private function convertToHtmlEntities(string $htmlContent, string $charset = 'U set_error_handler(function () { throw new \Exception(); }); try { - return mb_encode_numericentity($htmlContent, [0x80, 0xFFFF, 0, 0xFFFF], $charset); + return mb_encode_numericentity($htmlContent, [0x80, 0x10FFFF, 0, 0x1FFFFF], $charset); } catch (\Exception|\ValueError $e) { try { $htmlContent = iconv($charset, 'UTF-8', $htmlContent); - $htmlContent = mb_encode_numericentity($htmlContent, [0x80, 0xFFFF, 0, 0xFFFF], 'UTF-8'); + $htmlContent = mb_encode_numericentity($htmlContent, [0x80, 0x10FFFF, 0, 0x1FFFFF], 'UTF-8'); } catch (\Exception|\ValueError $e) { } diff --git a/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTest.php b/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTest.php index 96d9177673c25..6bfd9256165c4 100644 --- a/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTest.php +++ b/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTest.php @@ -379,6 +379,13 @@ public function testHtml() $this->assertSame('my value', $this->createTestCrawler(null)->filterXPath('//ol')->html('my value')); } + public function testEmojis() + { + $crawler = $this->createCrawler('

Hey 👋

'); + + $this->assertSame('

Hey 👋

', $crawler->html()); + } + public function testExtract() { $crawler = $this->createTestCrawler()->filterXPath('//ul[1]/li'); diff --git a/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php b/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php index e79d1a8e304cc..56116cf44f5cc 100644 --- a/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php +++ b/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php @@ -75,7 +75,7 @@ public function removeListener($eventName, $listener) { if (isset($this->wrappedListeners[$eventName])) { foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener) { + if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) { $listener = $wrappedListener; unset($this->wrappedListeners[$eventName][$index]); break; @@ -110,8 +110,8 @@ public function getListenerPriority($eventName, $listener) // we might have wrapped listeners for the event (if called while dispatching) // in that case get the priority by wrapper if (isset($this->wrappedListeners[$eventName])) { - foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener) { + foreach ($this->wrappedListeners[$eventName] as $wrappedListener) { + if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) { return $this->dispatcher->getListenerPriority($eventName, $wrappedListener); } } diff --git a/src/Symfony/Component/EventDispatcher/EventDispatcher.php b/src/Symfony/Component/EventDispatcher/EventDispatcher.php index 8b62227189624..4a8f6c6f121de 100644 --- a/src/Symfony/Component/EventDispatcher/EventDispatcher.php +++ b/src/Symfony/Component/EventDispatcher/EventDispatcher.php @@ -122,7 +122,7 @@ public function getListenerPriority($eventName, $listener) $v[0] = $v[0](); $v[1] = $v[1] ?? '__invoke'; } - if ($v === $listener) { + if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) { return $priority; } } @@ -178,7 +178,7 @@ public function removeListener($eventName, $listener) $v[0] = $v[0](); $v[1] = $v[1] ?? '__invoke'; } - if ($v === $listener) { + if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) { unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]); } } diff --git a/src/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php b/src/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php index 67e78ac25ffa1..9f4a43a33d278 100644 --- a/src/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php +++ b/src/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php @@ -421,6 +421,35 @@ public function testMutatingWhilePropagationIsStopped() $this->assertTrue($testLoaded); } + /** + * @requires PHP 8.1 + */ + public function testNamedClosures() + { + $listener = new TestEventListener(); + + $callback1 = \Closure::fromCallable($listener); + $callback2 = \Closure::fromCallable($listener); + $callback3 = \Closure::fromCallable(new TestEventListener()); + + $this->assertNotSame($callback1, $callback2); + $this->assertNotSame($callback1, $callback3); + $this->assertNotSame($callback2, $callback3); + $this->assertTrue($callback1 == $callback2); + $this->assertFalse($callback1 == $callback3); + + $this->dispatcher->addListener('foo', $callback1, 3); + $this->dispatcher->addListener('foo', $callback2, 2); + $this->dispatcher->addListener('foo', $callback3, 1); + + $this->assertSame(3, $this->dispatcher->getListenerPriority('foo', $callback1)); + $this->assertSame(3, $this->dispatcher->getListenerPriority('foo', $callback2)); + + $this->dispatcher->removeListener('foo', $callback1); + + $this->assertSame(['foo' => [$callback3]], $this->dispatcher->getListeners()); + } + /** * @group legacy * @expectedDeprecation Calling the "Symfony\Component\EventDispatcher\EventDispatcherInterface::dispatch()" method with the event name as the first argument is deprecated since Symfony 4.3, pass it as the second argument and provide the event object as the first argument instead. diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php index 5c9bbd12b7107..fd1dbf39b2e06 100644 --- a/src/Symfony/Component/Filesystem/Filesystem.php +++ b/src/Symfony/Component/Filesystem/Filesystem.php @@ -318,6 +318,8 @@ private function isReadable(string $filename): bool */ public function symlink($originDir, $targetDir, $copyOnWindows = false) { + self::assertFunctionExists('symlink'); + if ('\\' === \DIRECTORY_SEPARATOR) { $originDir = strtr($originDir, '/', '\\'); $targetDir = strtr($targetDir, '/', '\\'); @@ -354,6 +356,8 @@ public function symlink($originDir, $targetDir, $copyOnWindows = false) */ public function hardlink($originFile, $targetFiles) { + self::assertFunctionExists('link'); + if (!$this->exists($originFile)) { throw new FileNotFoundException(null, 0, null, $originFile); } @@ -737,13 +741,22 @@ private function getSchemeAndHierarchy(string $filename): array return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]]; } + private static function assertFunctionExists(string $func): void + { + if (!\function_exists($func)) { + throw new IOException(sprintf('Unable to perform filesystem operation because the "%s()" function has been disabled.', $func)); + } + } + /** * @param mixed ...$args * * @return mixed */ - private static function box(callable $func, ...$args) + private static function box(string $func, ...$args) { + self::assertFunctionExists($func); + self::$lastError = null; set_error_handler(__CLASS__.'::handleError'); try { diff --git a/src/Symfony/Component/Form/ChoiceList/Loader/CallbackChoiceLoader.php b/src/Symfony/Component/Form/ChoiceList/Loader/CallbackChoiceLoader.php index 2d6782f558aea..944d6a48826af 100644 --- a/src/Symfony/Component/Form/ChoiceList/Loader/CallbackChoiceLoader.php +++ b/src/Symfony/Component/Form/ChoiceList/Loader/CallbackChoiceLoader.php @@ -23,11 +23,11 @@ class CallbackChoiceLoader implements ChoiceLoaderInterface private $callback; /** - * The loaded choice list. + * The loaded choices. * - * @var ArrayChoiceList + * @var array|null */ - private $choiceList; + private $choices; /** * @param callable $callback The callable returning an array of choices @@ -42,11 +42,11 @@ public function __construct(callable $callback) */ public function loadChoiceList($value = null) { - if (null !== $this->choiceList) { - return $this->choiceList; + if (null === $this->choices) { + $this->choices = ($this->callback)(); } - return $this->choiceList = new ArrayChoiceList(($this->callback)(), $value); + return new ArrayChoiceList($this->choices, $value); } /** diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php index 52565f3879455..51d42494d1def 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php @@ -47,12 +47,14 @@ class DateTimeToStringTransformer extends BaseDateTimeTransformer * @param string|null $inputTimezone The name of the input timezone * @param string|null $outputTimezone The name of the output timezone * @param string $format The date format + * @param string|null $parseFormat The parse format when different from $format */ - public function __construct(string $inputTimezone = null, string $outputTimezone = null, string $format = 'Y-m-d H:i:s') + public function __construct(string $inputTimezone = null, string $outputTimezone = null, string $format = 'Y-m-d H:i:s', string $parseFormat = null) { parent::__construct($inputTimezone, $outputTimezone); - $this->generateFormat = $this->parseFormat = $format; + $this->generateFormat = $format; + $this->parseFormat = $parseFormat ?? $format; // See https://php.net/datetime.createfromformat // The character "|" in the format makes sure that the parts of a date diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php index 85b00db57c091..e5953bf9edc85 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php @@ -73,8 +73,10 @@ public function buildForm(FormBuilderInterface $builder, array $options) } }); + $parseFormat = null; + if (null !== $options['reference_date']) { - $format = 'Y-m-d '.$format; + $parseFormat = 'Y-m-d '.$format; $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($options) { $data = $event->getData(); @@ -85,7 +87,7 @@ public function buildForm(FormBuilderInterface $builder, array $options) }); } - $builder->addViewTransformer(new DateTimeToStringTransformer($options['model_timezone'], $options['view_timezone'], $format)); + $builder->addViewTransformer(new DateTimeToStringTransformer($options['model_timezone'], $options['view_timezone'], $format, $parseFormat)); } else { $hourOptions = $minuteOptions = $secondOptions = [ 'error_bubbling' => true, diff --git a/src/Symfony/Component/Form/Form.php b/src/Symfony/Component/Form/Form.php index 32cc437574d4b..5f00c7aa2eed0 100644 --- a/src/Symfony/Component/Form/Form.php +++ b/src/Symfony/Component/Form/Form.php @@ -547,7 +547,7 @@ public function submit($submittedData, $clearMissing = true) $submittedData = null; $this->transformationFailure = new TransformationFailedException('Submitted data was expected to be text or number, file upload given.'); } - } elseif (\is_array($submittedData) && !$this->config->getCompound() && !$this->config->hasOption('multiple')) { + } elseif (\is_array($submittedData) && !$this->config->getCompound() && !$this->config->getOption('multiple', false)) { $submittedData = null; $this->transformationFailure = new TransformationFailedException('Submitted data was expected to be text or number, array given.'); } diff --git a/src/Symfony/Component/Form/Resources/translations/validators.it.xlf b/src/Symfony/Component/Form/Resources/translations/validators.it.xlf index 8e4665ce1daf5..1a8eee3ac8e26 100644 --- a/src/Symfony/Component/Form/Resources/translations/validators.it.xlf +++ b/src/Symfony/Component/Form/Resources/translations/validators.it.xlf @@ -44,15 +44,15 @@ Please choose a valid date interval. - Per favore, scegli a valid date interval. + Per favore, scegli un intervallo di date valido. Please enter a valid date and time. - Per favore, inserisci a valid date and time. + Per favore, inserisci una data e ora valida. Please enter a valid date. - Per favore, inserisci a valid date. + Per favore, inserisci una data valida. Please select a valid file. diff --git a/src/Symfony/Component/Form/Tests/ChoiceList/LazyChoiceListTest.php b/src/Symfony/Component/Form/Tests/ChoiceList/LazyChoiceListTest.php index 6f30d0896e1ba..94d41cf9e740f 100644 --- a/src/Symfony/Component/Form/Tests/ChoiceList/LazyChoiceListTest.php +++ b/src/Symfony/Component/Form/Tests/ChoiceList/LazyChoiceListTest.php @@ -32,7 +32,7 @@ public function testGetChoiceLoadersLoadsLoadedListOnFirstCall() $this->assertSame(['RESULT'], $list->getChoices()); $this->assertSame(['RESULT'], $list->getChoices()); - $this->assertSame(1, $calls); + $this->assertSame(2, $calls); } public function testGetValuesLoadsLoadedListOnFirstCall() @@ -46,7 +46,7 @@ public function testGetValuesLoadsLoadedListOnFirstCall() $this->assertSame(['RESULT'], $list->getValues()); $this->assertSame(['RESULT'], $list->getValues()); - $this->assertSame(1, $calls); + $this->assertSame(2, $calls); } public function testGetStructuredValuesLoadsLoadedListOnFirstCall() @@ -60,7 +60,7 @@ public function testGetStructuredValuesLoadsLoadedListOnFirstCall() $this->assertSame(['RESULT'], $list->getStructuredValues()); $this->assertSame(['RESULT'], $list->getStructuredValues()); - $this->assertSame(1, $calls); + $this->assertSame(2, $calls); } public function testGetOriginalKeysLoadsLoadedListOnFirstCall() @@ -79,7 +79,7 @@ public function testGetOriginalKeysLoadsLoadedListOnFirstCall() $this->assertSame(['foo' => 'a', 'bar' => 'b', 'baz' => 'c'], $list->getOriginalKeys()); $this->assertSame(['foo' => 'a', 'bar' => 'b', 'baz' => 'c'], $list->getOriginalKeys()); - $this->assertSame(3, $calls); + $this->assertSame(6, $calls); } public function testGetChoicesForValuesForwardsCallIfListNotLoaded() @@ -98,7 +98,7 @@ public function testGetChoicesForValuesForwardsCallIfListNotLoaded() $this->assertSame(['foo', 'bar'], $list->getChoicesForValues(['a', 'b'])); $this->assertSame(['foo', 'bar'], $list->getChoicesForValues(['a', 'b'])); - $this->assertSame(3, $calls); + $this->assertSame(6, $calls); } public function testGetChoicesForValuesUsesLoadedList() diff --git a/src/Symfony/Component/Form/Tests/ChoiceList/Loader/CallbackChoiceLoaderTest.php b/src/Symfony/Component/Form/Tests/ChoiceList/Loader/CallbackChoiceLoaderTest.php index 52dd5f8af580f..69eb787a23dfa 100644 --- a/src/Symfony/Component/Form/Tests/ChoiceList/Loader/CallbackChoiceLoaderTest.php +++ b/src/Symfony/Component/Form/Tests/ChoiceList/Loader/CallbackChoiceLoaderTest.php @@ -67,11 +67,18 @@ public function testLoadChoiceList() $this->assertInstanceOf(ChoiceListInterface::class, self::$loader->loadChoiceList(self::$value)); } - public function testLoadChoiceListOnlyOnce() + public function testLoadChoicesOnlyOnce() { - $loadedChoiceList = self::$loader->loadChoiceList(self::$value); + $calls = 0; + $loader = new CallbackChoiceLoader(function () use (&$calls) { + ++$calls; - $this->assertSame($loadedChoiceList, self::$loader->loadChoiceList(self::$value)); + return [1]; + }); + $loadedChoiceList = $loader->loadChoiceList(); + + $this->assertNotSame($loadedChoiceList, $loader->loadChoiceList()); + $this->assertSame(1, $calls); } public function testLoadChoicesForValuesLoadsChoiceListOnFirstCall() diff --git a/src/Symfony/Component/Form/Tests/ChoiceList/Loader/IntlCallbackChoiceLoaderTest.php b/src/Symfony/Component/Form/Tests/ChoiceList/Loader/IntlCallbackChoiceLoaderTest.php index a5fc262dcd3a1..e2827b0d913be 100644 --- a/src/Symfony/Component/Form/Tests/ChoiceList/Loader/IntlCallbackChoiceLoaderTest.php +++ b/src/Symfony/Component/Form/Tests/ChoiceList/Loader/IntlCallbackChoiceLoaderTest.php @@ -68,11 +68,19 @@ public function testLoadChoiceList() $this->assertInstanceOf(ChoiceListInterface::class, self::$loader->loadChoiceList(self::$value)); } - public function testLoadChoiceListOnlyOnce() + public function testLoadChoicesOnlyOnce() { - $loadedChoiceList = self::$loader->loadChoiceList(self::$value); + $calls = 0; + $loader = new IntlCallbackChoiceLoader(function () use (&$calls) { + ++$calls; - $this->assertSame($loadedChoiceList, self::$loader->loadChoiceList(self::$value)); + return self::$choices; + }); + + $loadedChoiceList = $loader->loadChoiceList(self::$value); + + $this->assertNotSame($loadedChoiceList, $loader->loadChoiceList(self::$value)); + $this->assertSame(1, $calls); } public function testLoadChoicesForValuesLoadsChoiceListOnFirstCall() diff --git a/src/Symfony/Component/Form/Tests/CompoundFormTest.php b/src/Symfony/Component/Form/Tests/CompoundFormTest.php index 7f8548e7a4158..ec05102496613 100644 --- a/src/Symfony/Component/Form/Tests/CompoundFormTest.php +++ b/src/Symfony/Component/Form/Tests/CompoundFormTest.php @@ -1057,7 +1057,8 @@ public function testArrayTransformationFailureOnSubmit() $this->assertNull($this->form->get('foo')->getData()); $this->assertSame('Submitted data was expected to be text or number, array given.', $this->form->get('foo')->getTransformationFailure()->getMessage()); - $this->assertSame(['bar'], $this->form->get('bar')->getData()); + $this->assertNull($this->form->get('bar')->getData()); + $this->assertSame('Submitted data was expected to be text or number, array given.', $this->form->get('bar')->getTransformationFailure()->getMessage()); } public function testFileUpload() diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php index 1bf30575275f9..ebd2dd61849bc 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php @@ -11,8 +11,10 @@ namespace Symfony\Component\Form\Tests\Extension\Core\Type; +use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader; use Symfony\Component\Form\ChoiceList\View\ChoiceGroupView; use Symfony\Component\Form\ChoiceList\View\ChoiceView; +use Symfony\Component\Form\Exception\TransformationFailedException; use Symfony\Component\Form\Extension\Validator\ValidatorExtension; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\Forms; @@ -1917,7 +1919,12 @@ public function testSubmitInvalidNestedValue($multiple, $expanded, $submissionDa $form->submit($submissionData); $this->assertFalse($form->isSynchronized()); - $this->assertEquals('All choices submitted must be NULL, strings or ints.', $form->getTransformationFailure()->getMessage()); + $this->assertInstanceOf(TransformationFailedException::class, $form->getTransformationFailure()); + if (!$multiple && !$expanded) { + $this->assertEquals('Submitted data was expected to be text or number, array given.', $form->getTransformationFailure()->getMessage()); + } else { + $this->assertEquals('All choices submitted must be NULL, strings or ints.', $form->getTransformationFailure()->getMessage()); + } } public function invalidNestedValueTestMatrix() @@ -2165,4 +2172,32 @@ public function expandedIsEmptyWhenNoRealChoiceIsSelectedProvider() 'Placeholder submitted / single / not required / with a placeholder -> should not be empty' => [false, '', false, false, 'ccc'], // The placeholder is a selected value ]; } + + public function testWithSameLoaderAndDifferentChoiceValueCallbacks() + { + $choiceLoader = new CallbackChoiceLoader(function () { + return [1, 2, 3]; + }); + + $view = $this->factory->create(FormTypeTest::TESTED_TYPE) + ->add('choice_one', self::TESTED_TYPE, [ + 'choice_loader' => $choiceLoader, + ]) + ->add('choice_two', self::TESTED_TYPE, [ + 'choice_loader' => $choiceLoader, + 'choice_value' => function ($choice) { + return $choice ? (string) $choice * 10 : ''; + }, + ]) + ->createView() + ; + + $this->assertSame('1', $view['choice_one']->vars['choices'][0]->value); + $this->assertSame('2', $view['choice_one']->vars['choices'][1]->value); + $this->assertSame('3', $view['choice_one']->vars['choices'][2]->value); + + $this->assertSame('10', $view['choice_two']->vars['choices'][0]->value); + $this->assertSame('20', $view['choice_two']->vars['choices'][1]->value); + $this->assertSame('30', $view['choice_two']->vars['choices'][2]->value); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php index 8da1e2dd5c35e..8fa764f6f76f6 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -279,6 +279,76 @@ public function testSubmitWithSecondsAndBrowserOmissionSeconds() $this->assertEquals('03:04:00', $form->getViewData()); } + public function testPreSetDataDifferentTimezones() + { + $form = $this->factory->create(static::TESTED_TYPE, null, [ + 'model_timezone' => 'UTC', + 'view_timezone' => 'Europe/Berlin', + 'input' => 'datetime', + 'with_seconds' => true, + 'reference_date' => new \DateTimeImmutable('2019-01-01', new \DateTimeZone('UTC')), + ]); + $form->setData(new \DateTime('2022-01-01 15:09:10', new \DateTimeZone('UTC'))); + + $this->assertSame('15:09:10', $form->getData()->format('H:i:s')); + $this->assertSame([ + 'hour' => '16', + 'minute' => '9', + 'second' => '10', + ], $form->getViewData()); + } + + public function testPreSetDataDifferentTimezonesDuringDaylightSavingTime() + { + $form = $this->factory->create(static::TESTED_TYPE, null, [ + 'model_timezone' => 'UTC', + 'view_timezone' => 'Europe/Berlin', + 'input' => 'datetime', + 'with_seconds' => true, + 'reference_date' => new \DateTimeImmutable('2019-07-12', new \DateTimeZone('UTC')), + ]); + $form->setData(new \DateTime('2022-04-29 15:09:10', new \DateTimeZone('UTC'))); + + $this->assertSame('15:09:10', $form->getData()->format('H:i:s')); + $this->assertSame([ + 'hour' => '17', + 'minute' => '9', + 'second' => '10', + ], $form->getViewData()); + } + + public function testPreSetDataDifferentTimezonesUsingSingleTextWidget() + { + $form = $this->factory->create(static::TESTED_TYPE, null, [ + 'model_timezone' => 'UTC', + 'view_timezone' => 'Europe/Berlin', + 'input' => 'datetime', + 'with_seconds' => true, + 'reference_date' => new \DateTimeImmutable('2019-01-01', new \DateTimeZone('UTC')), + 'widget' => 'single_text', + ]); + $form->setData(new \DateTime('2022-01-01 15:09:10', new \DateTimeZone('UTC'))); + + $this->assertSame('15:09:10', $form->getData()->format('H:i:s')); + $this->assertSame('16:09:10', $form->getViewData()); + } + + public function testPreSetDataDifferentTimezonesDuringDaylightSavingTimeUsingSingleTextWidget() + { + $form = $this->factory->create(static::TESTED_TYPE, null, [ + 'model_timezone' => 'UTC', + 'view_timezone' => 'Europe/Berlin', + 'input' => 'datetime', + 'with_seconds' => true, + 'reference_date' => new \DateTimeImmutable('2019-07-12', new \DateTimeZone('UTC')), + 'widget' => 'single_text', + ]); + $form->setData(new \DateTime('2022-04-29 15:09:10', new \DateTimeZone('UTC'))); + + $this->assertSame('15:09:10', $form->getData()->format('H:i:s')); + $this->assertSame('17:09:10', $form->getViewData()); + } + public function testSubmitDifferentTimezones() { $form = $this->factory->create(static::TESTED_TYPE, null, [ diff --git a/src/Symfony/Component/HttpClient/HttpOptions.php b/src/Symfony/Component/HttpClient/HttpOptions.php index 1638189f6439b..da55f9965f98c 100644 --- a/src/Symfony/Component/HttpClient/HttpOptions.php +++ b/src/Symfony/Component/HttpClient/HttpOptions.php @@ -197,6 +197,16 @@ public function setTimeout(float $timeout) return $this; } + /** + * @return $this + */ + public function setMaxDuration(float $maxDuration) + { + $this->options['max_duration'] = $maxDuration; + + return $this; + } + /** * @return $this */ diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php b/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php index 916961f5eed5c..76ebfa08a482d 100644 --- a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php @@ -152,6 +152,12 @@ public function start() throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line)); } + $sessionId = $_COOKIE[session_name()] ?? null; + if ($sessionId && !preg_match('/^[a-zA-Z0-9,-]{22,}$/', $sessionId)) { + // the session ID in the header is invalid, create a new one + session_id(session_create_id()); + } + // ok to try and start the session if (!session_start()) { throw new \RuntimeException('Failed to start the session.'); diff --git a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php index c9aa9a27b527f..776da2adc27f1 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php @@ -293,4 +293,13 @@ public function testGetBagsOnceSessionStartedIsIgnored() $this->assertEquals($storage->getBag('flashes'), $bag); } + + public function testRegenerateInvalidSessionId() + { + $_COOKIE[session_name()] = '&~['; + $started = (new NativeSessionStorage())->start(); + + $this->assertTrue($started); + $this->assertMatchesRegularExpression('/^[a-zA-Z0-9,-]{22,}$/', session_id()); + } } diff --git a/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php b/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php index 76c2064d18bf7..5f657bfbdf809 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php @@ -74,7 +74,7 @@ public function onKernelResponse(FilterResponseEvent $event) // Always remove the internal header if present $response->headers->remove(self::NO_AUTO_CACHE_CONTROL_HEADER); - if (!$session = $this->container && $this->container->has('initialized_session') ? $this->container->get('initialized_session') : $event->getRequest()->getSession()) { + if (!$session = $this->container && $this->container->has('initialized_session') ? $this->container->get('initialized_session') : ($event->getRequest()->hasSession() ? $event->getRequest()->getSession() : null)) { return; } diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index 8c5765cc05bc3..46838909f9b02 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -76,11 +76,11 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl private static $freshCache = []; - public const VERSION = '4.4.41'; - public const VERSION_ID = 40441; + public const VERSION = '4.4.42'; + public const VERSION_ID = 40442; public const MAJOR_VERSION = 4; public const MINOR_VERSION = 4; - public const RELEASE_VERSION = 41; + public const RELEASE_VERSION = 42; public const EXTRA_VERSION = ''; public const END_OF_MAINTENANCE = '11/2022'; diff --git a/src/Symfony/Component/HttpKernel/Tests/EventListener/SessionListenerTest.php b/src/Symfony/Component/HttpKernel/Tests/EventListener/SessionListenerTest.php index d6ff42f926247..9b49936f468b2 100644 --- a/src/Symfony/Component/HttpKernel/Tests/EventListener/SessionListenerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/EventListener/SessionListenerTest.php @@ -139,6 +139,24 @@ public function testUninitializedSession() $this->assertFalse($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); } + public function testUninitializedSessionWithoutInitializedSession() + { + $kernel = $this->createMock(HttpKernelInterface::class); + $response = new Response(); + $response->setSharedMaxAge(60); + $response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true'); + + $container = new ServiceLocator([]); + + $listener = new SessionListener($container); + $listener->onKernelResponse(new ResponseEvent($kernel, new Request(), HttpKernelInterface::MASTER_REQUEST, $response)); + $this->assertFalse($response->headers->has('Expires')); + $this->assertTrue($response->headers->hasCacheControlDirective('public')); + $this->assertFalse($response->headers->hasCacheControlDirective('private')); + $this->assertFalse($response->headers->hasCacheControlDirective('must-revalidate')); + $this->assertSame('60', $response->headers->getCacheControlDirective('s-maxage')); + } + public function testSurrogateMasterRequestIsPublic() { $session = $this->createMock(Session::class); diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php index c22a426d7d31e..69bd7445acfd6 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php @@ -155,7 +155,7 @@ public function testExceptionInSubRequestsDoesNotMangleOutputBuffers() $this->assertEquals('Foo', ob_get_clean()); } - public function testLocaleAndFormatAreIsKeptInSubrequest() + public function testLocaleAndFormatAreKeptInSubrequest() { $expectedSubRequest = Request::create('/'); $expectedSubRequest->attributes->set('_format', 'foo'); diff --git a/src/Symfony/Component/Ldap/Adapter/ExtLdap/Connection.php b/src/Symfony/Component/Ldap/Adapter/ExtLdap/Connection.php index 49e465d3f791c..77be43ba9b84e 100644 --- a/src/Symfony/Component/Ldap/Adapter/ExtLdap/Connection.php +++ b/src/Symfony/Component/Ldap/Adapter/ExtLdap/Connection.php @@ -29,6 +29,12 @@ class Connection extends AbstractConnection private const LDAP_INVALID_CREDENTIALS = 0x31; private const LDAP_TIMEOUT = 0x55; private const LDAP_ALREADY_EXISTS = 0x44; + private const PRECONNECT_OPTIONS = [ + ConnectionOptions::DEBUG_LEVEL, + ConnectionOptions::X_TLS_CACERTDIR, + ConnectionOptions::X_TLS_CACERTFILE, + ConnectionOptions::X_TLS_REQUIRE_CERT, + ]; /** @var bool */ private $bound = false; @@ -147,10 +153,18 @@ private function connect() return; } + foreach ($this->config['options'] as $name => $value) { + if (\in_array(ConnectionOptions::getOption($name), self::PRECONNECT_OPTIONS, true)) { + $this->setOption($name, $value); + } + } + $this->connection = ldap_connect($this->config['connection_string']); foreach ($this->config['options'] as $name => $value) { - $this->setOption($name, $value); + if (!\in_array(ConnectionOptions::getOption($name), self::PRECONNECT_OPTIONS, true)) { + $this->setOption($name, $value); + } } if (false === $this->connection) { diff --git a/src/Symfony/Component/Ldap/Adapter/ExtLdap/ConnectionOptions.php b/src/Symfony/Component/Ldap/Adapter/ExtLdap/ConnectionOptions.php index 50061bd80959e..58094fad5b8ea 100644 --- a/src/Symfony/Component/Ldap/Adapter/ExtLdap/ConnectionOptions.php +++ b/src/Symfony/Component/Ldap/Adapter/ExtLdap/ConnectionOptions.php @@ -40,6 +40,7 @@ final class ConnectionOptions public const DEBUG_LEVEL = 0x5001; public const TIMEOUT = 0x5002; public const NETWORK_TIMEOUT = 0x5005; + public const X_TLS_CACERTFILE = 0x6002; public const X_TLS_CACERTDIR = 0x6003; public const X_TLS_CERTFILE = 0x6004; public const X_TLS_CRL_ALL = 0x02; diff --git a/src/Symfony/Component/Mime/Email.php b/src/Symfony/Component/Mime/Email.php index 7a7a0db32e167..5e31cb92a85f2 100644 --- a/src/Symfony/Component/Mime/Email.php +++ b/src/Symfony/Component/Mime/Email.php @@ -272,12 +272,16 @@ public function getPriority(): int } /** - * @param resource|string $body + * @param resource|string|null $body * * @return $this */ public function text($body, string $charset = 'utf-8') { + if (null !== $body && !\is_string($body) && !\is_resource($body)) { + throw new \TypeError(sprintf('The body must be a string, a resource or null (got "%s").', get_debug_type($body))); + } + $this->text = $body; $this->textCharset = $charset; @@ -304,6 +308,10 @@ public function getTextCharset(): ?string */ public function html($body, string $charset = 'utf-8') { + if (null !== $body && !\is_string($body) && !\is_resource($body)) { + throw new \TypeError(sprintf('The body must be a string, a resource or null (got "%s").', get_debug_type($body))); + } + $this->html = $body; $this->htmlCharset = $charset; @@ -330,6 +338,10 @@ public function getHtmlCharset(): ?string */ public function attach($body, string $name = null, string $contentType = null) { + if (!\is_string($body) && !\is_resource($body)) { + throw new \TypeError(sprintf('The body must be a string or a resource (got "%s").', get_debug_type($body))); + } + $this->attachments[] = ['body' => $body, 'name' => $name, 'content-type' => $contentType, 'inline' => false]; return $this; @@ -352,6 +364,10 @@ public function attachFromPath(string $path, string $name = null, string $conten */ public function embed($body, string $name = null, string $contentType = null) { + if (!\is_string($body) && !\is_resource($body)) { + throw new \TypeError(sprintf('The body must be a string or a resource (got "%s").', get_debug_type($body))); + } + $this->attachments[] = ['body' => $body, 'name' => $name, 'content-type' => $contentType, 'inline' => true]; return $this; @@ -463,7 +479,7 @@ private function prepareParts(): ?array $names = []; $htmlPart = null; $html = $this->html; - if (null !== $this->html) { + if (null !== $html) { if (\is_resource($html)) { if (stream_get_meta_data($html)['seekable'] ?? false) { rewind($html); diff --git a/src/Symfony/Component/Mime/Test/Constraint/EmailHeaderSame.php b/src/Symfony/Component/Mime/Test/Constraint/EmailHeaderSame.php index 74bdc63c79f71..74b412183a779 100644 --- a/src/Symfony/Component/Mime/Test/Constraint/EmailHeaderSame.php +++ b/src/Symfony/Component/Mime/Test/Constraint/EmailHeaderSame.php @@ -55,12 +55,14 @@ protected function matches($message): bool */ protected function failureDescription($message): string { - return sprintf('the Email %s (value is %s)', $this->toString(), $this->getHeaderValue($message)); + return sprintf('the Email %s (value is %s)', $this->toString(), $this->getHeaderValue($message) ?? 'null'); } - private function getHeaderValue($message): string + private function getHeaderValue($message): ?string { - $header = $message->getHeaders()->get($this->headerName); + if (null === $header = $message->getHeaders()->get($this->headerName)) { + return null; + } return $header instanceof UnstructuredHeader ? $header->getValue() : $header->getBodyAsString(); } diff --git a/src/Symfony/Component/Mime/Tests/EmailTest.php b/src/Symfony/Component/Mime/Tests/EmailTest.php index 230df0791e15b..a12ca180e611c 100644 --- a/src/Symfony/Component/Mime/Tests/EmailTest.php +++ b/src/Symfony/Component/Mime/Tests/EmailTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Mime\Tests; +use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\TestCase; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; @@ -19,6 +20,7 @@ use Symfony\Component\Mime\Part\Multipart\MixedPart; use Symfony\Component\Mime\Part\Multipart\RelatedPart; use Symfony\Component\Mime\Part\TextPart; +use Symfony\Component\Mime\Test\Constraint\EmailHeaderSame; class EmailTest extends TestCase { @@ -384,4 +386,76 @@ public function testSerialize() $this->assertEquals($expected->getHeaders(), $n->getHeaders()); $this->assertEquals($e->getBody(), $n->getBody()); } + + public function testMissingHeaderDoesNotThrowError() + { + $this->expectException(ExpectationFailedException::class); + $this->expectExceptionMessage('Failed asserting that the Email has header "foo" with value "bar" (value is null).'); + + $e = new Email(); + $emailHeaderSame = new EmailHeaderSame('foo', 'bar'); + $emailHeaderSame->evaluate($e); + } + + public function testAttachBodyExpectStringOrResource() + { + $this->expectException(\TypeError::class); + $this->expectExceptionMessage('The body must be a string or a resource (got "bool").'); + + (new Email())->attach(false); + } + + public function testEmbedBodyExpectStringOrResource() + { + $this->expectException(\TypeError::class); + $this->expectExceptionMessage('The body must be a string or a resource (got "bool").'); + + (new Email())->embed(false); + } + + public function testHtmlBodyExpectStringOrResourceOrNull() + { + $this->expectException(\TypeError::class); + $this->expectExceptionMessage('The body must be a string, a resource or null (got "bool").'); + + (new Email())->html(false); + } + + public function testHtmlBodyAcceptedTypes() + { + $email = new Email(); + + $email->html('foo'); + $this->assertSame('foo', $email->getHtmlBody()); + + $email->html(null); + $this->assertNull($email->getHtmlBody()); + + $contents = file_get_contents(__DIR__.'/Fixtures/mimetypes/test', 'r'); + $email->html($contents); + $this->assertSame($contents, $email->getHtmlBody()); + } + + public function testTextBodyExpectStringOrResourceOrNull() + { + $this->expectException(\TypeError::class); + $this->expectExceptionMessage('The body must be a string, a resource or null (got "bool").'); + + (new Email())->text(false); + } + + public function testTextBodyAcceptedTypes() + { + $email = new Email(); + + $email->text('foo'); + $this->assertSame('foo', $email->getTextBody()); + + $email->text(null); + $this->assertNull($email->getTextBody()); + + $contents = file_get_contents(__DIR__.'/Fixtures/mimetypes/test', 'r'); + $email->text($contents); + $this->assertSame($contents, $email->getTextBody()); + } } diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php index 2f2449cd1112d..3f97527b720da 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php @@ -272,6 +272,21 @@ public function php81TypesProvider() ]; } + /** + * @dataProvider php82TypesProvider + * @requires PHP 8.2 + */ + public function testExtractPhp82Type($property, array $type = null) + { + $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\Php82Dummy', $property, [])); + } + + public function php82TypesProvider() + { + yield ['nil', null]; + yield ['false', [new Type(Type::BUILTIN_TYPE_FALSE)]]; + } + /** * @dataProvider defaultValueProvider */ diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/DockBlockFallback.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/DockBlockFallback.php index 3f9c303b59137..6379e6cea8eb9 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/DockBlockFallback.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/DockBlockFallback.php @@ -1,7 +1,5 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Symfony\Component\PropertyInfo\Tests\Fixtures; class Php80Dummy diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php81Dummy.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php81Dummy.php index 1300c3e695f1f..842f59fbfd47b 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php81Dummy.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php81Dummy.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Symfony\Component\PropertyInfo\Tests\Fixtures; class Php81Dummy diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php82Dummy.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php82Dummy.php new file mode 100644 index 0000000000000..b830fabf8842a --- /dev/null +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php82Dummy.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\PropertyInfo\Tests\Fixtures; + +class Php82Dummy +{ + public null $nil = null; + + public false $false = false; +} diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/PseudoTypeDummy.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/PseudoTypeDummy.php index 71756044fafc9..d2efecef9dcf4 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/PseudoTypeDummy.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/PseudoTypeDummy.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Symfony\Component\PropertyInfo\Tests\Fixtures; class PseudoTypeDummy diff --git a/src/Symfony/Component/PropertyInfo/Type.php b/src/Symfony/Component/PropertyInfo/Type.php index 582b98d6411f5..06f8fe6c64a55 100644 --- a/src/Symfony/Component/PropertyInfo/Type.php +++ b/src/Symfony/Component/PropertyInfo/Type.php @@ -28,6 +28,7 @@ class Type public const BUILTIN_TYPE_OBJECT = 'object'; public const BUILTIN_TYPE_ARRAY = 'array'; public const BUILTIN_TYPE_NULL = 'null'; + public const BUILTIN_TYPE_FALSE = 'false'; public const BUILTIN_TYPE_CALLABLE = 'callable'; public const BUILTIN_TYPE_ITERABLE = 'iterable'; @@ -45,6 +46,7 @@ class Type self::BUILTIN_TYPE_OBJECT, self::BUILTIN_TYPE_ARRAY, self::BUILTIN_TYPE_CALLABLE, + self::BUILTIN_TYPE_FALSE, self::BUILTIN_TYPE_NULL, self::BUILTIN_TYPE_ITERABLE, ]; diff --git a/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php b/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php index f57a9ba8db441..46489f6394bd9 100644 --- a/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php +++ b/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php @@ -70,31 +70,34 @@ public function setOptions(array $options) */ public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { - if ($failureUrl = ParameterBagUtils::getRequestParameterValue($request, $this->options['failure_path_parameter'])) { - $this->options['failure_path'] = $failureUrl; - } + $options = $this->options; + $failureUrl = ParameterBagUtils::getRequestParameterValue($request, $options['failure_path_parameter']); - if (null === $this->options['failure_path']) { - $this->options['failure_path'] = $this->options['login_path']; + if (\is_string($failureUrl) && str_starts_with($failureUrl, '/')) { + $options['failure_path'] = $failureUrl; + } elseif ($this->logger && $failureUrl) { + $this->logger->debug(sprintf('Ignoring query parameter "%s": not a valid URL.', $options['failure_path_parameter'])); } - if ($this->options['failure_forward']) { + $options['failure_path'] ?? $options['failure_path'] = $options['login_path']; + + if ($options['failure_forward']) { if (null !== $this->logger) { - $this->logger->debug('Authentication failure, forward triggered.', ['failure_path' => $this->options['failure_path']]); + $this->logger->debug('Authentication failure, forward triggered.', ['failure_path' => $options['failure_path']]); } - $subRequest = $this->httpUtils->createRequest($request, $this->options['failure_path']); + $subRequest = $this->httpUtils->createRequest($request, $options['failure_path']); $subRequest->attributes->set(Security::AUTHENTICATION_ERROR, $exception); return $this->httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST); } if (null !== $this->logger) { - $this->logger->debug('Authentication failure, redirect triggered.', ['failure_path' => $this->options['failure_path']]); + $this->logger->debug('Authentication failure, redirect triggered.', ['failure_path' => $options['failure_path']]); } $request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception); - return $this->httpUtils->createRedirectResponse($request, $this->options['failure_path']); + return $this->httpUtils->createRedirectResponse($request, $options['failure_path']); } } diff --git a/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php b/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php index f0580320f4df6..391fe5369c73b 100644 --- a/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php +++ b/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Security\Http\Authentication; +use Psr\Log\LoggerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Http\HttpUtils; @@ -29,6 +30,7 @@ class DefaultAuthenticationSuccessHandler implements AuthenticationSuccessHandle use TargetPathTrait; protected $httpUtils; + protected $logger; protected $options; protected $providerKey; protected $defaultOptions = [ @@ -42,9 +44,10 @@ class DefaultAuthenticationSuccessHandler implements AuthenticationSuccessHandle /** * @param array $options Options for processing a successful authentication attempt */ - public function __construct(HttpUtils $httpUtils, array $options = []) + public function __construct(HttpUtils $httpUtils, array $options = [], LoggerInterface $logger = null) { $this->httpUtils = $httpUtils; + $this->logger = $logger; $this->setOptions($options); } @@ -102,10 +105,16 @@ protected function determineTargetUrl(Request $request) return $this->options['default_target_path']; } - if ($targetUrl = ParameterBagUtils::getRequestParameterValue($request, $this->options['target_path_parameter'])) { + $targetUrl = ParameterBagUtils::getRequestParameterValue($request, $this->options['target_path_parameter']); + + if (\is_string($targetUrl) && str_starts_with($targetUrl, '/')) { return $targetUrl; } + if ($this->logger && $targetUrl) { + $this->logger->debug(sprintf('Ignoring query parameter "%s": not a valid URL.', $this->options['target_path_parameter'])); + } + if (null !== $this->providerKey && $targetUrl = $this->getTargetPath($request->getSession(), $this->providerKey)) { $this->removeTargetPath($request->getSession(), $this->providerKey); diff --git a/src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php b/src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php index d95027560b706..22a2b9277bbbd 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php @@ -187,6 +187,26 @@ public function testFailurePathParameterCanBeOverwritten() $handler->onAuthenticationFailure($this->request, $this->exception); } + public function testFailurePathFromRequestWithInvalidUrl() + { + $options = ['failure_path_parameter' => '_my_failure_path']; + + $this->request->expects($this->once()) + ->method('get')->with('_my_failure_path') + ->willReturn('some_route_name'); + + $this->logger->expects($this->exactly(2)) + ->method('debug') + ->withConsecutive( + ['Ignoring query parameter "_my_failure_path": not a valid URL.'], + ['Authentication failure, redirect triggered.', ['failure_path' => '/login']] + ); + + $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, $options, $this->logger); + + $handler->onAuthenticationFailure($this->request, $this->exception); + } + private function getRequest() { $request = $this->createMock(Request::class); diff --git a/src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php b/src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php index f168e415c0e69..5f05248911f91 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Security\Http\Tests\Authentication; use PHPUnit\Framework\TestCase; +use Psr\Log\LoggerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -113,4 +114,25 @@ public function getRequestRedirections() ], ]; } + + public function testTargetPathFromRequestWithInvalidUrl() + { + $httpUtils = $this->createMock(HttpUtils::class); + $options = ['target_path_parameter' => '_my_target_path']; + $token = $this->createMock(TokenInterface::class); + + $request = $this->createMock(Request::class); + $request->expects($this->once()) + ->method('get')->with('_my_target_path') + ->willReturn('some_route_name'); + + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->once()) + ->method('debug') + ->with('Ignoring query parameter "_my_target_path": not a valid URL.'); + + $handler = new DefaultAuthenticationSuccessHandler($httpUtils, $options, $logger); + + $handler->onAuthenticationSuccess($request, $token); + } } diff --git a/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php b/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php index 7c60132bc055d..f3d9793c72de6 100644 --- a/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php @@ -342,6 +342,30 @@ public function testWithPreviousNotStartedSession() $this->assertSame($usageIndex, $session->getUsageIndex()); } + public function testOnKernelResponseRemoveListener() + { + $tokenStorage = new TokenStorage(); + $tokenStorage->setToken(new UsernamePasswordToken('test1', 'pass1', 'phpunit', ['ROLE_USER'])); + + $request = new Request(); + $request->attributes->set('_security_firewall_run', '_security_session'); + + $session = new Session(new MockArraySessionStorage()); + $request->setSession($session); + + $dispatcher = new EventDispatcher(); + $httpKernel = $this->createMock(HttpKernelInterface::class); + + $listener = new ContextListener($tokenStorage, [], 'session', null, $dispatcher, null, \Closure::fromCallable([$tokenStorage, 'getToken'])); + $this->assertEmpty($dispatcher->getListeners()); + + $listener(new RequestEvent($httpKernel, $request, HttpKernelInterface::MASTER_REQUEST)); + $this->assertNotEmpty($dispatcher->getListeners()); + + $listener->onKernelResponse(new ResponseEvent($httpKernel, $request, HttpKernelInterface::MASTER_REQUEST, new Response())); + $this->assertEmpty($dispatcher->getListeners()); + } + protected function runSessionOnKernelResponse($newToken, $original = null) { $session = new Session(new MockArraySessionStorage()); diff --git a/src/Symfony/Component/Security/Http/Tests/Firewall/ExceptionListenerTest.php b/src/Symfony/Component/Security/Http/Tests/Firewall/ExceptionListenerTest.php index 27ad9897ea485..4f1f729ac944d 100644 --- a/src/Symfony/Component/Security/Http/Tests/Firewall/ExceptionListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Firewall/ExceptionListenerTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Security\Http\Tests\Firewall; use PHPUnit\Framework\TestCase; +use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; @@ -170,6 +171,18 @@ public function testLogoutException() $this->assertEquals(403, $event->getThrowable()->getStatusCode()); } + public function testUnregister() + { + $listener = $this->createExceptionListener(); + $dispatcher = new EventDispatcher(); + + $listener->register($dispatcher); + $this->assertNotEmpty($dispatcher->getListeners()); + + $listener->unregister($dispatcher); + $this->assertEmpty($dispatcher->getListeners()); + } + public function getAccessDeniedExceptionProvider() { return [ diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index e29a7cd18e6b6..5977d994987c4 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -483,6 +483,10 @@ private function validateAndDenormalize(string $currentClass, string $attribute, return (float) $data; } + if ('false' === $builtinType && false === $data) { + return $data; + } + if (('is_'.$builtinType)($data)) { return $data; } diff --git a/src/Symfony/Component/Serializer/Normalizer/JsonSerializableNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/JsonSerializableNormalizer.php index c4a8c7a7b5a6d..509e44c0a2f14 100644 --- a/src/Symfony/Component/Serializer/Normalizer/JsonSerializableNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/JsonSerializableNormalizer.php @@ -27,7 +27,7 @@ class JsonSerializableNormalizer extends AbstractNormalizer public function normalize($object, $format = null, array $context = []) { if ($this->isCircularReference($object, $context)) { - return $this->handleCircularReference($object); + return $this->handleCircularReference($object, $format, $context); } if (!$object instanceof \JsonSerializable) { diff --git a/src/Symfony/Component/Serializer/Tests/Fixtures/FalseBuiltInDummy.php b/src/Symfony/Component/Serializer/Tests/Fixtures/FalseBuiltInDummy.php new file mode 100644 index 0000000000000..0c9d03a0e7298 --- /dev/null +++ b/src/Symfony/Component/Serializer/Tests/Fixtures/FalseBuiltInDummy.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Tests\Fixtures; + +class FalseBuiltInDummy +{ + public false $false = false; +} diff --git a/src/Symfony/Component/Serializer/Tests/Fixtures/JsonSerializableCircularReferenceDummy.php b/src/Symfony/Component/Serializer/Tests/Fixtures/JsonSerializableCircularReferenceDummy.php new file mode 100644 index 0000000000000..6dbed8f98d943 --- /dev/null +++ b/src/Symfony/Component/Serializer/Tests/Fixtures/JsonSerializableCircularReferenceDummy.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Tests\Fixtures; + +/** + * @author Marvin Feldmann + */ +class JsonSerializableCircularReferenceDummy implements \JsonSerializable +{ + public function jsonSerialize(): array + { + return [ + 'me' => $this, + ]; + } +} diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/JsonSerializableNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/JsonSerializableNormalizerTest.php index e0222a5fa0b9c..cf6310a980ade 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/JsonSerializableNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/JsonSerializableNormalizerTest.php @@ -17,14 +17,19 @@ use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; +use Symfony\Component\Serializer\Serializer; use Symfony\Component\Serializer\SerializerInterface; +use Symfony\Component\Serializer\Tests\Fixtures\JsonSerializableCircularReferenceDummy; use Symfony\Component\Serializer\Tests\Fixtures\JsonSerializableDummy; +use Symfony\Component\Serializer\Tests\Normalizer\Features\CircularReferenceTestTrait; /** * @author Fred Cox */ class JsonSerializableNormalizerTest extends TestCase { + use CircularReferenceTestTrait; + /** * @var JsonSerializableNormalizer */ @@ -96,6 +101,19 @@ private function doTestCircularNormalize(bool $legacy = false) $this->assertEquals('string_object', $this->normalizer->normalize(new JsonSerializableDummy())); } + protected function getNormalizerForCircularReference(array $defaultContext): JsonSerializableNormalizer + { + $normalizer = new JsonSerializableNormalizer(null, null, $defaultContext); + new Serializer([$normalizer]); + + return $normalizer; + } + + protected function getSelfReferencingModel() + { + return new JsonSerializableCircularReferenceDummy(); + } + public function testInvalidDataThrowException() { $this->expectException(InvalidArgumentException::class); diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php index c6c02bfb8568e..0e4b2cb00c246 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php @@ -52,6 +52,7 @@ use Symfony\Component\Serializer\Tests\Normalizer\Features\ObjectToPopulateTestTrait; use Symfony\Component\Serializer\Tests\Normalizer\Features\SkipNullValuesTestTrait; use Symfony\Component\Serializer\Tests\Normalizer\Features\TypeEnforcementTestTrait; +use Symfony\Component\Serializer\Tests\Php80Dummy; /** * @author Kévin Dunglas @@ -873,6 +874,25 @@ public function testExtractAttributesRespectsContext() $this->assertSame(['foo' => 'bar', 'bar' => 'foo'], $normalizer->normalize($data, null, ['include_foo_and_bar' => true])); } + /** + * @requires PHP 8 + */ + public function testDenormalizeFalsePseudoType() + { + // given a serializer that extracts the attribute types of an object via ReflectionExtractor + $propertyTypeExtractor = new PropertyInfoExtractor([], [new ReflectionExtractor()], [], [], []); + $objectNormalizer = new ObjectNormalizer(null, null, null, $propertyTypeExtractor); + + $serializer = new Serializer([$objectNormalizer]); + + // when denormalizing some data into an object where an attribute uses the false pseudo type + /** @var Php80Dummy $object */ + $object = $serializer->denormalize(['canBeFalseOrString' => false], Php80Dummy::class); + + // then the attribute that declared false was filled correctly + $this->assertFalse($object->canBeFalseOrString); + } + public function testAdvancedNameConverter() { $nameConverter = new class() implements AdvancedNameConverterInterface { diff --git a/src/Symfony/Component/Serializer/Tests/Php80Dummy.php b/src/Symfony/Component/Serializer/Tests/Php80Dummy.php new file mode 100644 index 0000000000000..baa75b1246659 --- /dev/null +++ b/src/Symfony/Component/Serializer/Tests/Php80Dummy.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Tests; + +final class Php80Dummy +{ + public false|string $canBeFalseOrString; +} diff --git a/src/Symfony/Component/Serializer/Tests/SerializerTest.php b/src/Symfony/Component/Serializer/Tests/SerializerTest.php index a95811a46f8d9..06eda94f53609 100644 --- a/src/Symfony/Component/Serializer/Tests/SerializerTest.php +++ b/src/Symfony/Component/Serializer/Tests/SerializerTest.php @@ -51,6 +51,7 @@ use Symfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface; use Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberOne; use Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberTwo; +use Symfony\Component\Serializer\Tests\Fixtures\FalseBuiltInDummy; use Symfony\Component\Serializer\Tests\Fixtures\NormalizableTraversableDummy; use Symfony\Component\Serializer\Tests\Fixtures\TraversableDummy; use Symfony\Component\Serializer\Tests\Normalizer\TestDenormalizer; @@ -572,6 +573,19 @@ public function testUnionTypeDeserializable() $this->assertEquals(new DummyUnionType(), $actual, 'Union type denormalization third case failed.'); } + /** + * @requires PHP 8.2 + */ + public function testFalseBuiltInTypes() + { + $extractor = new PropertyInfoExtractor([], [new ReflectionExtractor()]); + $serializer = new Serializer([new ObjectNormalizer(null, null, null, $extractor)], ['json' => new JsonEncoder()]); + + $actual = $serializer->deserialize('{"false":false}', FalseBuiltInDummy::class, 'json'); + + $this->assertEquals(new FalseBuiltInDummy(), $actual); + } + private function serializerWithClassDiscriminator() { $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); diff --git a/src/Symfony/Component/VarDumper/Caster/DateCaster.php b/src/Symfony/Component/VarDumper/Caster/DateCaster.php index 1b195f49e5386..e0309bc62d963 100644 --- a/src/Symfony/Component/VarDumper/Caster/DateCaster.php +++ b/src/Symfony/Component/VarDumper/Caster/DateCaster.php @@ -105,11 +105,11 @@ public static function castPeriod(\DatePeriod $p, array $a, Stub $stub, $isNeste } $period = sprintf( - 'every %s, from %s (%s) %s', + 'every %s, from %s%s %s', self::formatInterval($p->getDateInterval()), + $p->include_start_date ? '[' : ']', self::formatDateTime($p->getStartDate()), - $p->include_start_date ? 'included' : 'excluded', - ($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end) : 'recurring '.$p->recurrences.' time/s' + ($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end).(\PHP_VERSION_ID >= 80200 && $p->include_end_date ? ']' : '[') : 'recurring '.$p->recurrences.' time/s' ); $p = [Caster::PREFIX_VIRTUAL.'period' => new ConstStub($period, implode("\n", $dates))]; diff --git a/src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php b/src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php index 4db0f08efbc17..7fe31ef4918ab 100644 --- a/src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php +++ b/src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php @@ -978,7 +978,7 @@ protected function dumpLine($depth, $endOfValue = false) } $this->lastDepth = $depth; - $this->line = mb_encode_numericentity($this->line, [0x80, 0xFFFF, 0, 0xFFFF], 'UTF-8'); + $this->line = mb_encode_numericentity($this->line, [0x80, 0x10FFFF, 0, 0x1FFFFF], 'UTF-8'); if (-1 === $depth) { AbstractDumper::dumpLine(0); diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/DateCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/DateCasterTest.php index 63be1681d0649..ba3b5dea77f49 100644 --- a/src/Symfony/Component/VarDumper/Tests/Caster/DateCasterTest.php +++ b/src/Symfony/Component/VarDumper/Tests/Caster/DateCasterTest.php @@ -385,26 +385,26 @@ public function testCastPeriod($start, $interval, $end, $options, $xPeriod, $xDa public function providePeriods() { $periods = [ - ['2017-01-01', 'P1D', '2017-01-03', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-03 00:00:00.0', '1) 2017-01-01%a2) 2017-01-02'], - ['2017-01-01', 'P1D', 1, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 2 time/s', '1) 2017-01-01%a2) 2017-01-02'], + ['2017-01-01', 'P1D', '2017-01-03', 0, 'every + 1d, from [2017-01-01 00:00:00.0 to 2017-01-03 00:00:00.0[', '1) 2017-01-01%a2) 2017-01-02'], + ['2017-01-01', 'P1D', 1, 0, 'every + 1d, from [2017-01-01 00:00:00.0 recurring 2 time/s', '1) 2017-01-01%a2) 2017-01-02'], - ['2017-01-01', 'P1D', '2017-01-04', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-04 00:00:00.0', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03'], - ['2017-01-01', 'P1D', 2, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 3 time/s', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03'], + ['2017-01-01', 'P1D', '2017-01-04', 0, 'every + 1d, from [2017-01-01 00:00:00.0 to 2017-01-04 00:00:00.0[', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03'], + ['2017-01-01', 'P1D', 2, 0, 'every + 1d, from [2017-01-01 00:00:00.0 recurring 3 time/s', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03'], - ['2017-01-01', 'P1D', '2017-01-05', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-05 00:00:00.0', '1) 2017-01-01%a2) 2017-01-02%a1 more'], - ['2017-01-01', 'P1D', 3, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 4 time/s', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03%a1 more'], + ['2017-01-01', 'P1D', '2017-01-05', 0, 'every + 1d, from [2017-01-01 00:00:00.0 to 2017-01-05 00:00:00.0[', '1) 2017-01-01%a2) 2017-01-02%a1 more'], + ['2017-01-01', 'P1D', 3, 0, 'every + 1d, from [2017-01-01 00:00:00.0 recurring 4 time/s', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03%a1 more'], - ['2017-01-01', 'P1D', '2017-01-21', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-21 00:00:00.0', '1) 2017-01-01%a17 more'], - ['2017-01-01', 'P1D', 19, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 20 time/s', '1) 2017-01-01%a17 more'], + ['2017-01-01', 'P1D', '2017-01-21', 0, 'every + 1d, from [2017-01-01 00:00:00.0 to 2017-01-21 00:00:00.0[', '1) 2017-01-01%a17 more'], + ['2017-01-01', 'P1D', 19, 0, 'every + 1d, from [2017-01-01 00:00:00.0 recurring 20 time/s', '1) 2017-01-01%a17 more'], - ['2017-01-01 01:00:00', 'P1D', '2017-01-03 01:00:00', 0, 'every + 1d, from 2017-01-01 01:00:00.0 (included) to 2017-01-03 01:00:00.0', '1) 2017-01-01 01:00:00.0%a2) 2017-01-02 01:00:00.0'], - ['2017-01-01 01:00:00', 'P1D', 1, 0, 'every + 1d, from 2017-01-01 01:00:00.0 (included) recurring 2 time/s', '1) 2017-01-01 01:00:00.0%a2) 2017-01-02 01:00:00.0'], + ['2017-01-01 01:00:00', 'P1D', '2017-01-03 01:00:00', 0, 'every + 1d, from [2017-01-01 01:00:00.0 to 2017-01-03 01:00:00.0[', '1) 2017-01-01 01:00:00.0%a2) 2017-01-02 01:00:00.0'], + ['2017-01-01 01:00:00', 'P1D', 1, 0, 'every + 1d, from [2017-01-01 01:00:00.0 recurring 2 time/s', '1) 2017-01-01 01:00:00.0%a2) 2017-01-02 01:00:00.0'], - ['2017-01-01', 'P1DT1H', '2017-01-03', 0, 'every + 1d 01:00:00.0, from 2017-01-01 00:00:00.0 (included) to 2017-01-03 00:00:00.0', '1) 2017-01-01 00:00:00.0%a2) 2017-01-02 01:00:00.0'], - ['2017-01-01', 'P1DT1H', 1, 0, 'every + 1d 01:00:00.0, from 2017-01-01 00:00:00.0 (included) recurring 2 time/s', '1) 2017-01-01 00:00:00.0%a2) 2017-01-02 01:00:00.0'], + ['2017-01-01', 'P1DT1H', '2017-01-03', 0, 'every + 1d 01:00:00.0, from [2017-01-01 00:00:00.0 to 2017-01-03 00:00:00.0[', '1) 2017-01-01 00:00:00.0%a2) 2017-01-02 01:00:00.0'], + ['2017-01-01', 'P1DT1H', 1, 0, 'every + 1d 01:00:00.0, from [2017-01-01 00:00:00.0 recurring 2 time/s', '1) 2017-01-01 00:00:00.0%a2) 2017-01-02 01:00:00.0'], - ['2017-01-01', 'P1D', '2017-01-04', \DatePeriod::EXCLUDE_START_DATE, 'every + 1d, from 2017-01-01 00:00:00.0 (excluded) to 2017-01-04 00:00:00.0', '1) 2017-01-02%a2) 2017-01-03'], - ['2017-01-01', 'P1D', 2, \DatePeriod::EXCLUDE_START_DATE, 'every + 1d, from 2017-01-01 00:00:00.0 (excluded) recurring 2 time/s', '1) 2017-01-02%a2) 2017-01-03'], + ['2017-01-01', 'P1D', '2017-01-04', \DatePeriod::EXCLUDE_START_DATE, 'every + 1d, from ]2017-01-01 00:00:00.0 to 2017-01-04 00:00:00.0[', '1) 2017-01-02%a2) 2017-01-03'], + ['2017-01-01', 'P1D', 2, \DatePeriod::EXCLUDE_START_DATE, 'every + 1d, from ]2017-01-01 00:00:00.0 recurring 2 time/s', '1) 2017-01-02%a2) 2017-01-03'], ]; if (\PHP_VERSION_ID < 70107) { diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/ReflectionCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/ReflectionCasterTest.php index 3dae54ce46b33..b7bccc0bdcda6 100644 --- a/src/Symfony/Component/VarDumper/Tests/Caster/ReflectionCasterTest.php +++ b/src/Symfony/Component/VarDumper/Tests/Caster/ReflectionCasterTest.php @@ -38,11 +38,11 @@ public function testReflectionCaster() +name: "ReflectionClass" %Aimplements: array:%d [ %A] - constants: array:3 [ + constants: array:%d [ "IS_IMPLICIT_ABSTRACT" => 16 "IS_EXPLICIT_ABSTRACT" => %d "IS_FINAL" => %d - ] +%A] properties: array:%d [ "name" => ReflectionProperty { %A +name: "name" diff --git a/src/Symfony/Component/VarExporter/Internal/Exporter.php b/src/Symfony/Component/VarExporter/Internal/Exporter.php index 078359af55309..8e03755d87078 100644 --- a/src/Symfony/Component/VarExporter/Internal/Exporter.php +++ b/src/Symfony/Component/VarExporter/Internal/Exporter.php @@ -110,12 +110,7 @@ public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount $arrayValue = (array) $value; } elseif ($value instanceof \Serializable || $value instanceof \__PHP_Incomplete_Class - || $value instanceof \DatePeriod - || (\PHP_VERSION_ID >= 80200 && ( - $value instanceof \DateTimeInterface - || $value instanceof \DateTimeZone - || $value instanceof \DateInterval - )) + || PHP_VERSION_ID < 80200 && $value instanceof \DatePeriod ) { ++$objectsCount; $objectsPool[$value] = [$id = \count($objectsPool), serialize($value), [], 0]; diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/datetime.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/datetime.php index e9f41f9ade34c..7078ef2525674 100644 --- a/src/Symfony/Component/VarExporter/Tests/Fixtures/datetime.php +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/datetime.php @@ -1,13 +1,15 @@ '1970-01-01 00:00:00.000000', + 'timezone_type' => 1, + 'timezone' => '+00:00', + ], + -1 => [ + 'date' => '1970-01-01 00:00:00.000000', + 'timezone_type' => 1, + 'timezone' => '+00:00', + ], + -2 => [ + 'timezone_type' => 3, + 'timezone' => 'Europe/Paris', + ], + -3 => [ + 'y' => 0, + 'm' => 0, + 'd' => 7, + 'h' => 0, + 'i' => 0, + 's' => 0, + 'f' => 0.0, + 'invert' => 0, + 'days' => 7, + 'from_string' => false, + ], + -5 => [ + 'date' => '2009-10-11 00:00:00.000000', + 'timezone_type' => 3, + 'timezone' => 'Europe/Paris', + ], + -6 => [ + 'y' => 0, + 'm' => 0, + 'd' => 7, + 'h' => 0, + 'i' => 0, + 's' => 0, + 'f' => 0.0, + 'invert' => 0, + 'days' => 7, + 'from_string' => false, + ], + -4 => [ + 'start' => $o[5], + 'current' => null, + 'end' => null, + 'interval' => $o[6], + 'recurrences' => 5, + 'include_start_date' => true, + 'include_end_date' => false, + ], + ] ); diff --git a/src/Symfony/Component/Workflow/Dumper/PlantUmlDumper.php b/src/Symfony/Component/Workflow/Dumper/PlantUmlDumper.php index 76273c01d1ff7..6e75c3c820048 100644 --- a/src/Symfony/Component/Workflow/Dumper/PlantUmlDumper.php +++ b/src/Symfony/Component/Workflow/Dumper/PlantUmlDumper.php @@ -103,8 +103,8 @@ public function dump(Definition $definition, Marking $marking = null, array $opt } $lines = [ - "$fromEscaped -${transitionColor}-> ${transitionEscaped}${transitionLabel}", - "$transitionEscaped -${transitionColor}-> ${toEscaped}${transitionLabel}", + "{$fromEscaped} -{$transitionColor}-> {$transitionEscaped}{$transitionLabel}", + "{$transitionEscaped} -{$transitionColor}-> {$toEscaped}{$transitionLabel}", ]; foreach ($lines as $line) { if (!\in_array($line, $code)) { @@ -112,7 +112,7 @@ public function dump(Definition $definition, Marking $marking = null, array $opt } } } else { - $code[] = "$fromEscaped -${transitionColor}-> $toEscaped: $transitionEscapedWithStyle"; + $code[] = "{$fromEscaped} -{$transitionColor}-> {$toEscaped}: {$transitionEscapedWithStyle}"; } } }