Merge branch '3.4' into 4.0
* 3.4: (32 commits) [Form] fix tests and deps [Cache] Rely on mock for Doctrine ArrayCache [FrameworkBundle] Respect debug mode when warm up annotations [Console] Fix docblock of DescriptorInterface::describe [Config] Handle nullable node name + fix inheritdocs [Security] added userChecker to SimpleAuthenticationProvider [Debug] fix test Fix typo in test method name Fixes #26563 (open_basedir restriction in effect) [Debug] Reset previous exception handler ealier to prevent infinite loop add hint in Github pull request template [Validator] Fix docblock of ClassMetadata#members [BrowserKit] Fix cookie path handling when $domain is null [DoctrineBridge] Don't rely on ClassMetadataInfo->hasField in DoctrineOrmTypeGuesser anymore [BrowserKit] Improves CookieJar::get [BrowserKit] Fix Cookie's PHPDoc [DomCrawler] Change bad wording in ChoiceFormField::untick [DomCrawler] Fix the PHPDoc of ChoiceFormField::setValue [DomCrawler] Avoid a useless call to strtolower [FrameworkBundle] HttpCache is not longer abstract ...
This commit is contained in:
commit
1f119cc16c
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -4,7 +4,7 @@
|
|||||||
| Bug fix? | yes/no
|
| Bug fix? | yes/no
|
||||||
| New feature? | yes/no <!-- don't forget to update src/**/CHANGELOG.md files -->
|
| New feature? | yes/no <!-- don't forget to update src/**/CHANGELOG.md files -->
|
||||||
| BC breaks? | no <!-- see https://symfony.com/bc -->
|
| BC breaks? | no <!-- see https://symfony.com/bc -->
|
||||||
| Deprecations? | yes/no <!-- don't forget to update UPGRADE-*.md files -->
|
| Deprecations? | yes/no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files -->
|
||||||
| Tests pass? | yes <!-- please add some, will be required by reviewers -->
|
| Tests pass? | yes <!-- please add some, will be required by reviewers -->
|
||||||
| Fixed tickets | #... <!-- #-prefixed issue number(s), if any -->
|
| Fixed tickets | #... <!-- #-prefixed issue number(s), if any -->
|
||||||
| License | MIT
|
| License | MIT
|
||||||
|
@ -43,11 +43,11 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Diego Saint Esteben (dosten)
|
- Diego Saint Esteben (dosten)
|
||||||
- Alexandre Salomé (alexandresalome)
|
- Alexandre Salomé (alexandresalome)
|
||||||
- William Durand (couac)
|
- William Durand (couac)
|
||||||
|
- Hamza Amrouche (simperfit)
|
||||||
- ornicar
|
- ornicar
|
||||||
- Francis Besset (francisbesset)
|
- Francis Besset (francisbesset)
|
||||||
- Iltar van der Berg (kjarli)
|
- Iltar van der Berg (kjarli)
|
||||||
- stealth35 (stealth35)
|
- stealth35 (stealth35)
|
||||||
- Hamza Amrouche (simperfit)
|
|
||||||
- Alexander Mols (asm89)
|
- Alexander Mols (asm89)
|
||||||
- Yonel Ceruto (yonelceruto)
|
- Yonel Ceruto (yonelceruto)
|
||||||
- Bulat Shakirzyanov (avalanche123)
|
- Bulat Shakirzyanov (avalanche123)
|
||||||
@ -57,8 +57,8 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Henrik Bjørnskov (henrikbjorn)
|
- Henrik Bjørnskov (henrikbjorn)
|
||||||
- Miha Vrhovnik
|
- Miha Vrhovnik
|
||||||
- Diego Saint Esteben (dii3g0)
|
- Diego Saint Esteben (dii3g0)
|
||||||
- Dany Maillard (maidmaid)
|
|
||||||
- Pierre du Plessis (pierredup)
|
- Pierre du Plessis (pierredup)
|
||||||
|
- Dany Maillard (maidmaid)
|
||||||
- Konstantin Kudryashov (everzet)
|
- Konstantin Kudryashov (everzet)
|
||||||
- Kevin Bond (kbond)
|
- Kevin Bond (kbond)
|
||||||
- Bilal Amarni (bamarni)
|
- Bilal Amarni (bamarni)
|
||||||
@ -66,6 +66,7 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Jérémy DERUSSÉ (jderusse)
|
- Jérémy DERUSSÉ (jderusse)
|
||||||
- Florin Patan (florinpatan)
|
- Florin Patan (florinpatan)
|
||||||
- Samuel ROZE (sroze)
|
- Samuel ROZE (sroze)
|
||||||
|
- Tobias Nyholm (tobias)
|
||||||
- Gábor Egyed (1ed)
|
- Gábor Egyed (1ed)
|
||||||
- Michel Weimerskirch (mweimerskirch)
|
- Michel Weimerskirch (mweimerskirch)
|
||||||
- Andrej Hudec (pulzarraider)
|
- Andrej Hudec (pulzarraider)
|
||||||
@ -75,7 +76,6 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Titouan Galopin (tgalopin)
|
- Titouan Galopin (tgalopin)
|
||||||
- Konstantin Myakshin (koc)
|
- Konstantin Myakshin (koc)
|
||||||
- Christian Raue
|
- Christian Raue
|
||||||
- Tobias Nyholm (tobias)
|
|
||||||
- Arnout Boks (aboks)
|
- Arnout Boks (aboks)
|
||||||
- Deni
|
- Deni
|
||||||
- Henrik Westphal (snc)
|
- Henrik Westphal (snc)
|
||||||
@ -200,6 +200,7 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Matthieu Bontemps (mbontemps)
|
- Matthieu Bontemps (mbontemps)
|
||||||
- apetitpa
|
- apetitpa
|
||||||
- Pierre Minnieur (pminnieur)
|
- Pierre Minnieur (pminnieur)
|
||||||
|
- Jannik Zschiesche (apfelbox)
|
||||||
- fivestar
|
- fivestar
|
||||||
- Dominique Bongiraud
|
- Dominique Bongiraud
|
||||||
- Jeremy Livingston (jeremylivingston)
|
- Jeremy Livingston (jeremylivingston)
|
||||||
@ -224,7 +225,6 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Marcel Beerta (mazen)
|
- Marcel Beerta (mazen)
|
||||||
- gadelat (gadelat)
|
- gadelat (gadelat)
|
||||||
- Loïc Faugeron
|
- Loïc Faugeron
|
||||||
- Jannik Zschiesche (apfelbox)
|
|
||||||
- Hidde Wieringa (hiddewie)
|
- Hidde Wieringa (hiddewie)
|
||||||
- Marco Pivetta (ocramius)
|
- Marco Pivetta (ocramius)
|
||||||
- Rob Frawley 2nd (robfrawley)
|
- Rob Frawley 2nd (robfrawley)
|
||||||
@ -697,6 +697,7 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Nykopol (nykopol)
|
- Nykopol (nykopol)
|
||||||
- Jordan Deitch
|
- Jordan Deitch
|
||||||
- Casper Valdemar Poulsen
|
- Casper Valdemar Poulsen
|
||||||
|
- Remon van de Kamp
|
||||||
- Josiah (josiah)
|
- Josiah (josiah)
|
||||||
- Joschi Kuphal
|
- Joschi Kuphal
|
||||||
- John Bohn (jbohn)
|
- John Bohn (jbohn)
|
||||||
@ -736,6 +737,7 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Adrien Lucas (adrienlucas)
|
- Adrien Lucas (adrienlucas)
|
||||||
- Zhuravlev Alexander (scif)
|
- Zhuravlev Alexander (scif)
|
||||||
- James Michael DuPont
|
- James Michael DuPont
|
||||||
|
- Xavier HAUSHERR
|
||||||
- Tom Klingenberg
|
- Tom Klingenberg
|
||||||
- Christopher Hall (mythmakr)
|
- Christopher Hall (mythmakr)
|
||||||
- Patrick Dawkins (pjcdawkins)
|
- Patrick Dawkins (pjcdawkins)
|
||||||
@ -1102,7 +1104,6 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Pierre Tachoire (krichprollsch)
|
- Pierre Tachoire (krichprollsch)
|
||||||
- Marc J. Schmidt (marcjs)
|
- Marc J. Schmidt (marcjs)
|
||||||
- Marco Jantke
|
- Marco Jantke
|
||||||
- Remon van de Kamp
|
|
||||||
- Saem Ghani
|
- Saem Ghani
|
||||||
- Clément LEFEBVRE
|
- Clément LEFEBVRE
|
||||||
- Conrad Kleinespel
|
- Conrad Kleinespel
|
||||||
@ -1225,7 +1226,6 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Sebastian Ionescu
|
- Sebastian Ionescu
|
||||||
- Thomas Ploch
|
- Thomas Ploch
|
||||||
- Simon Neidhold
|
- Simon Neidhold
|
||||||
- Xavier HAUSHERR
|
|
||||||
- Valentin VALCIU
|
- Valentin VALCIU
|
||||||
- Jeremiah VALERIE
|
- Jeremiah VALERIE
|
||||||
- Kevin Dew
|
- Kevin Dew
|
||||||
@ -1573,6 +1573,7 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Vladimir Chernyshev (volch)
|
- Vladimir Chernyshev (volch)
|
||||||
- Yorkie Chadwick (yorkie76)
|
- Yorkie Chadwick (yorkie76)
|
||||||
- GuillaumeVerdon
|
- GuillaumeVerdon
|
||||||
|
- Philipp Keck
|
||||||
- Ondrej Mirtes
|
- Ondrej Mirtes
|
||||||
- akimsko
|
- akimsko
|
||||||
- Youpie
|
- Youpie
|
||||||
@ -1630,6 +1631,7 @@ Symfony is the result of the work of many people who made the code better
|
|||||||
- Jordan Hoff
|
- Jordan Hoff
|
||||||
- znerol
|
- znerol
|
||||||
- Christian Eikermann
|
- Christian Eikermann
|
||||||
|
- Kai Eichinger
|
||||||
- Antonio Angelino
|
- Antonio Angelino
|
||||||
- Matt Fields
|
- Matt Fields
|
||||||
- Niklas Keller
|
- Niklas Keller
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
<element><string>Cache\IntegrationTests</string></element>
|
<element><string>Cache\IntegrationTests</string></element>
|
||||||
<element><string>Doctrine\Common\Cache</string></element>
|
<element><string>Doctrine\Common\Cache</string></element>
|
||||||
<element><string>Symfony\Component\Cache</string></element>
|
<element><string>Symfony\Component\Cache</string></element>
|
||||||
|
<element><string>Symfony\Component\Cache\Tests\Fixtures</string></element>
|
||||||
<element><string>Symfony\Component\Cache\Traits</string></element>
|
<element><string>Symfony\Component\Cache\Traits</string></element>
|
||||||
<element><string>Symfony\Component\Console</string></element>
|
<element><string>Symfony\Component\Console</string></element>
|
||||||
<element><string>Symfony\Component\HttpFoundation</string></element>
|
<element><string>Symfony\Component\HttpFoundation</string></element>
|
||||||
|
@ -97,7 +97,7 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
|
|||||||
$classMetadata = $classMetadatas[0];
|
$classMetadata = $classMetadatas[0];
|
||||||
|
|
||||||
// Check whether the field exists and is nullable or not
|
// Check whether the field exists and is nullable or not
|
||||||
if ($classMetadata->hasField($property)) {
|
if (isset($classMetadata->fieldMappings[$property])) {
|
||||||
if (!$classMetadata->isNullable($property) && Type::BOOLEAN !== $classMetadata->getTypeOfField($property)) {
|
if (!$classMetadata->isNullable($property) && Type::BOOLEAN !== $classMetadata->getTypeOfField($property)) {
|
||||||
return new ValueGuess(true, Guess::HIGH_CONFIDENCE);
|
return new ValueGuess(true, Guess::HIGH_CONFIDENCE);
|
||||||
}
|
}
|
||||||
@ -126,7 +126,7 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
|
|||||||
public function guessMaxLength($class, $property)
|
public function guessMaxLength($class, $property)
|
||||||
{
|
{
|
||||||
$ret = $this->getMetadata($class);
|
$ret = $this->getMetadata($class);
|
||||||
if ($ret && $ret[0]->hasField($property) && !$ret[0]->hasAssociation($property)) {
|
if ($ret && isset($ret[0]->fieldMappings[$property]) && !$ret[0]->hasAssociation($property)) {
|
||||||
$mapping = $ret[0]->getFieldMapping($property);
|
$mapping = $ret[0]->getFieldMapping($property);
|
||||||
|
|
||||||
if (isset($mapping['length'])) {
|
if (isset($mapping['length'])) {
|
||||||
@ -145,7 +145,7 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
|
|||||||
public function guessPattern($class, $property)
|
public function guessPattern($class, $property)
|
||||||
{
|
{
|
||||||
$ret = $this->getMetadata($class);
|
$ret = $this->getMetadata($class);
|
||||||
if ($ret && $ret[0]->hasField($property) && !$ret[0]->hasAssociation($property)) {
|
if ($ret && isset($ret[0]->fieldMappings[$property]) && !$ret[0]->hasAssociation($property)) {
|
||||||
if (in_array($ret[0]->getTypeOfField($property), array(Type::DECIMAL, Type::FLOAT))) {
|
if (in_array($ret[0]->getTypeOfField($property), array(Type::DECIMAL, Type::FLOAT))) {
|
||||||
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
|
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
|
||||||
}
|
}
|
||||||
|
@ -33,21 +33,20 @@ class DoctrineOrmTypeGuesserTest extends TestCase
|
|||||||
|
|
||||||
// Simple field, not nullable
|
// Simple field, not nullable
|
||||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(true));
|
$classMetadata->fieldMappings['field'] = true;
|
||||||
$classMetadata->expects($this->once())->method('isNullable')->with('field')->will($this->returnValue(false));
|
$classMetadata->expects($this->once())->method('isNullable')->with('field')->will($this->returnValue(false));
|
||||||
|
|
||||||
$return[] = array($classMetadata, new ValueGuess(true, Guess::HIGH_CONFIDENCE));
|
$return[] = array($classMetadata, new ValueGuess(true, Guess::HIGH_CONFIDENCE));
|
||||||
|
|
||||||
// Simple field, nullable
|
// Simple field, nullable
|
||||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(true));
|
$classMetadata->fieldMappings['field'] = true;
|
||||||
$classMetadata->expects($this->once())->method('isNullable')->with('field')->will($this->returnValue(true));
|
$classMetadata->expects($this->once())->method('isNullable')->with('field')->will($this->returnValue(true));
|
||||||
|
|
||||||
$return[] = array($classMetadata, new ValueGuess(false, Guess::MEDIUM_CONFIDENCE));
|
$return[] = array($classMetadata, new ValueGuess(false, Guess::MEDIUM_CONFIDENCE));
|
||||||
|
|
||||||
// One-to-one, nullable (by default)
|
// One-to-one, nullable (by default)
|
||||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
|
|
||||||
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));
|
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));
|
||||||
|
|
||||||
$mapping = array('joinColumns' => array(array()));
|
$mapping = array('joinColumns' => array(array()));
|
||||||
@ -57,7 +56,6 @@ class DoctrineOrmTypeGuesserTest extends TestCase
|
|||||||
|
|
||||||
// One-to-one, nullable (explicit)
|
// One-to-one, nullable (explicit)
|
||||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
|
|
||||||
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));
|
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));
|
||||||
|
|
||||||
$mapping = array('joinColumns' => array(array('nullable' => true)));
|
$mapping = array('joinColumns' => array(array('nullable' => true)));
|
||||||
@ -67,7 +65,6 @@ class DoctrineOrmTypeGuesserTest extends TestCase
|
|||||||
|
|
||||||
// One-to-one, not nullable
|
// One-to-one, not nullable
|
||||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
|
|
||||||
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));
|
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));
|
||||||
|
|
||||||
$mapping = array('joinColumns' => array(array('nullable' => false)));
|
$mapping = array('joinColumns' => array(array('nullable' => false)));
|
||||||
@ -77,7 +74,6 @@ class DoctrineOrmTypeGuesserTest extends TestCase
|
|||||||
|
|
||||||
// One-to-many, no clue
|
// One-to-many, no clue
|
||||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
|
|
||||||
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(false));
|
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(false));
|
||||||
|
|
||||||
$return[] = array($classMetadata, null);
|
$return[] = array($classMetadata, null);
|
||||||
|
@ -54,8 +54,7 @@ class TwigExtractor extends AbstractFileExtractor implements ExtractorInterface
|
|||||||
*/
|
*/
|
||||||
public function extract($resource, MessageCatalogue $catalogue)
|
public function extract($resource, MessageCatalogue $catalogue)
|
||||||
{
|
{
|
||||||
$files = $this->extractFiles($resource);
|
foreach ($this->extractFiles($resource) as $file) {
|
||||||
foreach ($files as $file) {
|
|
||||||
try {
|
try {
|
||||||
$this->extractTemplate(file_get_contents($file->getPathname()), $catalogue);
|
$this->extractTemplate(file_get_contents($file->getPathname()), $catalogue);
|
||||||
} catch (Error $e) {
|
} catch (Error $e) {
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
"symfony/asset": "~3.4|~4.0",
|
"symfony/asset": "~3.4|~4.0",
|
||||||
"symfony/dependency-injection": "~3.4|~4.0",
|
"symfony/dependency-injection": "~3.4|~4.0",
|
||||||
"symfony/finder": "~3.4|~4.0",
|
"symfony/finder": "~3.4|~4.0",
|
||||||
"symfony/form": "^3.4.5|^4.0.5",
|
"symfony/form": "^3.4.7|^4.0.7",
|
||||||
"symfony/http-foundation": "~3.4|~4.0",
|
"symfony/http-foundation": "~3.4|~4.0",
|
||||||
"symfony/http-kernel": "~3.4|~4.0",
|
"symfony/http-kernel": "~3.4|~4.0",
|
||||||
"symfony/polyfill-intl-icu": "~1.0",
|
"symfony/polyfill-intl-icu": "~1.0",
|
||||||
@ -41,7 +41,7 @@
|
|||||||
"symfony/workflow": "~3.4|~4.0"
|
"symfony/workflow": "~3.4|~4.0"
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"symfony/form": "<3.4.5|<4.0.5,>=4.0",
|
"symfony/form": "<3.4.7|<4.0.7,>=4.0",
|
||||||
"symfony/console": "<3.4"
|
"symfony/console": "<3.4"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
|
@ -28,17 +28,19 @@ class AnnotationsCacheWarmer extends AbstractPhpFileCacheWarmer
|
|||||||
{
|
{
|
||||||
private $annotationReader;
|
private $annotationReader;
|
||||||
private $excludeRegexp;
|
private $excludeRegexp;
|
||||||
|
private $debug;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Reader $annotationReader
|
* @param Reader $annotationReader
|
||||||
* @param string $phpArrayFile The PHP file where annotations are cached
|
* @param string $phpArrayFile The PHP file where annotations are cached
|
||||||
* @param CacheItemPoolInterface $fallbackPool The pool where runtime-discovered annotations are cached
|
* @param CacheItemPoolInterface $fallbackPool The pool where runtime-discovered annotations are cached
|
||||||
*/
|
*/
|
||||||
public function __construct(Reader $annotationReader, string $phpArrayFile, CacheItemPoolInterface $fallbackPool, string $excludeRegexp = null)
|
public function __construct(Reader $annotationReader, string $phpArrayFile, CacheItemPoolInterface $fallbackPool, string $excludeRegexp = null, bool $debug = false)
|
||||||
{
|
{
|
||||||
parent::__construct($phpArrayFile, $fallbackPool);
|
parent::__construct($phpArrayFile, $fallbackPool);
|
||||||
$this->annotationReader = $annotationReader;
|
$this->annotationReader = $annotationReader;
|
||||||
$this->excludeRegexp = $excludeRegexp;
|
$this->excludeRegexp = $excludeRegexp;
|
||||||
|
$this->debug = $debug;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -53,7 +55,7 @@ class AnnotationsCacheWarmer extends AbstractPhpFileCacheWarmer
|
|||||||
}
|
}
|
||||||
|
|
||||||
$annotatedClasses = include $annotatedClassPatterns;
|
$annotatedClasses = include $annotatedClassPatterns;
|
||||||
$reader = new CachedReader($this->annotationReader, new DoctrineProvider($arrayAdapter));
|
$reader = new CachedReader($this->annotationReader, new DoctrineProvider($arrayAdapter), $this->debug);
|
||||||
|
|
||||||
foreach ($annotatedClasses as $class) {
|
foreach ($annotatedClasses as $class) {
|
||||||
if (null !== $this->excludeRegexp && preg_match($this->excludeRegexp, $class)) {
|
if (null !== $this->excludeRegexp && preg_match($this->excludeRegexp, $class)) {
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
namespace Symfony\Bundle\FrameworkBundle\HttpCache;
|
namespace Symfony\Bundle\FrameworkBundle\HttpCache;
|
||||||
|
|
||||||
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
use Symfony\Component\HttpKernel\KernelInterface;
|
||||||
use Symfony\Component\HttpKernel\HttpCache\HttpCache as BaseHttpCache;
|
use Symfony\Component\HttpKernel\HttpCache\HttpCache as BaseHttpCache;
|
||||||
use Symfony\Component\HttpKernel\HttpCache\Esi;
|
use Symfony\Component\HttpKernel\HttpCache\Esi;
|
||||||
use Symfony\Component\HttpKernel\HttpCache\Store;
|
use Symfony\Component\HttpKernel\HttpCache\Store;
|
||||||
@ -23,16 +23,16 @@ use Symfony\Component\HttpFoundation\Response;
|
|||||||
*
|
*
|
||||||
* @author Fabien Potencier <fabien@symfony.com>
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
*/
|
*/
|
||||||
abstract class HttpCache extends BaseHttpCache
|
class HttpCache extends BaseHttpCache
|
||||||
{
|
{
|
||||||
protected $cacheDir;
|
protected $cacheDir;
|
||||||
protected $kernel;
|
protected $kernel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param HttpKernelInterface $kernel An HttpKernelInterface instance
|
* @param KernelInterface $kernel A KernelInterface instance
|
||||||
* @param string $cacheDir The cache directory (default used if null)
|
* @param string $cacheDir The cache directory (default used if null)
|
||||||
*/
|
*/
|
||||||
public function __construct(HttpKernelInterface $kernel, string $cacheDir = null)
|
public function __construct(KernelInterface $kernel, string $cacheDir = null)
|
||||||
{
|
{
|
||||||
$this->kernel = $kernel;
|
$this->kernel = $kernel;
|
||||||
$this->cacheDir = $cacheDir;
|
$this->cacheDir = $cacheDir;
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
<argument>%kernel.cache_dir%/annotations.php</argument>
|
<argument>%kernel.cache_dir%/annotations.php</argument>
|
||||||
<argument type="service" id="cache.annotations" />
|
<argument type="service" id="cache.annotations" />
|
||||||
<argument>#^Symfony\\(?:Component\\HttpKernel\\|Bundle\\FrameworkBundle\\Controller\\(?!AbstractController$|Controller$))#</argument>
|
<argument>#^Symfony\\(?:Component\\HttpKernel\\|Bundle\\FrameworkBundle\\Controller\\(?!AbstractController$|Controller$))#</argument>
|
||||||
|
<argument>%kernel.debug%</argument>
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
<service id="annotations.cache" class="Symfony\Component\Cache\DoctrineProvider">
|
<service id="annotations.cache" class="Symfony\Component\Cache\DoctrineProvider">
|
||||||
|
@ -0,0 +1,103 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Bundle\FrameworkBundle\Tests\CacheWarmer;
|
||||||
|
|
||||||
|
use Doctrine\Common\Annotations\AnnotationReader;
|
||||||
|
use Doctrine\Common\Annotations\CachedReader;
|
||||||
|
use Doctrine\Common\Annotations\Reader;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\CacheWarmer\AnnotationsCacheWarmer;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
|
||||||
|
use Symfony\Component\Cache\Adapter\ArrayAdapter;
|
||||||
|
use Symfony\Component\Cache\Adapter\NullAdapter;
|
||||||
|
use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
|
||||||
|
use Symfony\Component\Cache\DoctrineProvider;
|
||||||
|
use Symfony\Component\Filesystem\Filesystem;
|
||||||
|
|
||||||
|
class AnnotationsCacheWarmerTest extends TestCase
|
||||||
|
{
|
||||||
|
private $cacheDir;
|
||||||
|
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
$this->cacheDir = sys_get_temp_dir().'/'.uniqid();
|
||||||
|
$fs = new Filesystem();
|
||||||
|
$fs->mkdir($this->cacheDir);
|
||||||
|
parent::setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function tearDown()
|
||||||
|
{
|
||||||
|
$fs = new Filesystem();
|
||||||
|
$fs->remove($this->cacheDir);
|
||||||
|
parent::tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAnnotationsCacheWarmerWithDebugDisabled()
|
||||||
|
{
|
||||||
|
file_put_contents($this->cacheDir.'/annotations.map', sprintf('<?php return %s;', var_export(array(__CLASS__), true)));
|
||||||
|
$cacheFile = tempnam($this->cacheDir, __FUNCTION__);
|
||||||
|
$reader = new AnnotationReader();
|
||||||
|
$fallbackPool = new ArrayAdapter();
|
||||||
|
$warmer = new AnnotationsCacheWarmer(
|
||||||
|
$reader,
|
||||||
|
$cacheFile,
|
||||||
|
$fallbackPool,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
$warmer->warmUp($this->cacheDir);
|
||||||
|
$this->assertFileExists($cacheFile);
|
||||||
|
|
||||||
|
// Assert cache is valid
|
||||||
|
$reader = new CachedReader(
|
||||||
|
$this->getReadOnlyReader(),
|
||||||
|
new DoctrineProvider(new PhpArrayAdapter($cacheFile, new NullAdapter()))
|
||||||
|
);
|
||||||
|
$refClass = new \ReflectionClass($this);
|
||||||
|
$reader->getClassAnnotations($refClass);
|
||||||
|
$reader->getMethodAnnotations($refClass->getMethod(__FUNCTION__));
|
||||||
|
$reader->getPropertyAnnotations($refClass->getProperty('cacheDir'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAnnotationsCacheWarmerWithDebugEnabled()
|
||||||
|
{
|
||||||
|
file_put_contents($this->cacheDir.'/annotations.map', sprintf('<?php return %s;', var_export(array(__CLASS__), true)));
|
||||||
|
$cacheFile = tempnam($this->cacheDir, __FUNCTION__);
|
||||||
|
$reader = new AnnotationReader();
|
||||||
|
$fallbackPool = new ArrayAdapter();
|
||||||
|
$warmer = new AnnotationsCacheWarmer(
|
||||||
|
$reader,
|
||||||
|
$cacheFile,
|
||||||
|
$fallbackPool,
|
||||||
|
null,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
$warmer->warmUp($this->cacheDir);
|
||||||
|
$this->assertFileExists($cacheFile);
|
||||||
|
// Assert cache is valid
|
||||||
|
$reader = new CachedReader(
|
||||||
|
$this->getReadOnlyReader(),
|
||||||
|
new DoctrineProvider(new PhpArrayAdapter($cacheFile, new NullAdapter())),
|
||||||
|
true
|
||||||
|
);
|
||||||
|
$refClass = new \ReflectionClass($this);
|
||||||
|
$reader->getClassAnnotations($refClass);
|
||||||
|
$reader->getMethodAnnotations($refClass->getMethod(__FUNCTION__));
|
||||||
|
$reader->getPropertyAnnotations($refClass->getProperty('cacheDir'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \PHPUnit_Framework_MockObject_MockObject|Reader
|
||||||
|
*/
|
||||||
|
private function getReadOnlyReader()
|
||||||
|
{
|
||||||
|
$readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader')->getMock();
|
||||||
|
$readerMock->expects($this->exactly(0))->method('getClassAnnotations');
|
||||||
|
$readerMock->expects($this->exactly(0))->method('getClassAnnotation');
|
||||||
|
$readerMock->expects($this->exactly(0))->method('getMethodAnnotations');
|
||||||
|
$readerMock->expects($this->exactly(0))->method('getMethodAnnotation');
|
||||||
|
$readerMock->expects($this->exactly(0))->method('getPropertyAnnotations');
|
||||||
|
$readerMock->expects($this->exactly(0))->method('getPropertyAnnotation');
|
||||||
|
|
||||||
|
return $readerMock;
|
||||||
|
}
|
||||||
|
}
|
@ -55,6 +55,7 @@ class SimpleFormFactory extends FormLoginFactory
|
|||||||
->replaceArgument(0, new Reference($config['authenticator']))
|
->replaceArgument(0, new Reference($config['authenticator']))
|
||||||
->replaceArgument(1, new Reference($userProviderId))
|
->replaceArgument(1, new Reference($userProviderId))
|
||||||
->replaceArgument(2, $id)
|
->replaceArgument(2, $id)
|
||||||
|
->replaceArgument(3, new Reference('security.user_checker.'.$id))
|
||||||
;
|
;
|
||||||
|
|
||||||
return $provider;
|
return $provider;
|
||||||
|
@ -44,14 +44,14 @@ class Cookie
|
|||||||
/**
|
/**
|
||||||
* Sets a cookie.
|
* Sets a cookie.
|
||||||
*
|
*
|
||||||
* @param string $name The cookie name
|
* @param string $name The cookie name
|
||||||
* @param string $value The value of the cookie
|
* @param string $value The value of the cookie
|
||||||
* @param string $expires The time the cookie expires
|
* @param string|null $expires The time the cookie expires
|
||||||
* @param string $path The path on the server in which the cookie will be available on
|
* @param string|null $path The path on the server in which the cookie will be available on
|
||||||
* @param string $domain The domain that the cookie is available
|
* @param string $domain The domain that the cookie is available
|
||||||
* @param bool $secure Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client
|
* @param bool $secure Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client
|
||||||
* @param bool $httponly The cookie httponly flag
|
* @param bool $httponly The cookie httponly flag
|
||||||
* @param bool $encodedValue Whether the value is encoded or not
|
* @param bool $encodedValue Whether the value is encoded or not
|
||||||
*/
|
*/
|
||||||
public function __construct(string $name, ?string $value, string $expires = null, string $path = null, string $domain = '', bool $secure = false, bool $httponly = true, bool $encodedValue = false)
|
public function __construct(string $name, ?string $value, string $expires = null, string $path = null, string $domain = '', bool $secure = false, bool $httponly = true, bool $encodedValue = false)
|
||||||
{
|
{
|
||||||
@ -112,8 +112,8 @@ class Cookie
|
|||||||
/**
|
/**
|
||||||
* Creates a Cookie instance from a Set-Cookie header value.
|
* Creates a Cookie instance from a Set-Cookie header value.
|
||||||
*
|
*
|
||||||
* @param string $cookie A Set-Cookie header value
|
* @param string $cookie A Set-Cookie header value
|
||||||
* @param string $url The base URL
|
* @param string|null $url The base URL
|
||||||
*
|
*
|
||||||
* @return static
|
* @return static
|
||||||
*
|
*
|
||||||
@ -242,7 +242,7 @@ class Cookie
|
|||||||
/**
|
/**
|
||||||
* Gets the expires time of the cookie.
|
* Gets the expires time of the cookie.
|
||||||
*
|
*
|
||||||
* @return string The cookie expires time
|
* @return string|null The cookie expires time
|
||||||
*/
|
*/
|
||||||
public function getExpiresTime()
|
public function getExpiresTime()
|
||||||
{
|
{
|
||||||
|
@ -43,32 +43,21 @@ class CookieJar
|
|||||||
{
|
{
|
||||||
$this->flushExpiredCookies();
|
$this->flushExpiredCookies();
|
||||||
|
|
||||||
if (!empty($domain)) {
|
foreach ($this->cookieJar as $cookieDomain => $pathCookies) {
|
||||||
foreach ($this->cookieJar as $cookieDomain => $pathCookies) {
|
if ($cookieDomain && $domain) {
|
||||||
if ($cookieDomain) {
|
$cookieDomain = '.'.ltrim($cookieDomain, '.');
|
||||||
$cookieDomain = '.'.ltrim($cookieDomain, '.');
|
if ($cookieDomain !== substr('.'.$domain, -\strlen($cookieDomain))) {
|
||||||
if ($cookieDomain != substr('.'.$domain, -strlen($cookieDomain))) {
|
continue;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($pathCookies as $cookiePath => $namedCookies) {
|
|
||||||
if ($cookiePath != substr($path, 0, strlen($cookiePath))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (isset($namedCookies[$name])) {
|
|
||||||
return $namedCookies[$name];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
foreach ($pathCookies as $cookiePath => $namedCookies) {
|
||||||
}
|
if (0 !== strpos($path, $cookiePath)) {
|
||||||
|
continue;
|
||||||
// avoid relying on this behavior that is mainly here for BC reasons
|
}
|
||||||
foreach ($this->cookieJar as $cookies) {
|
if (isset($namedCookies[$name])) {
|
||||||
if (isset($cookies[$path][$name])) {
|
return $namedCookies[$name];
|
||||||
return $cookies[$path][$name];
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -237,6 +237,8 @@ class CookieJarTest extends TestCase
|
|||||||
$this->assertEquals($cookie1, $cookieJar->get('foo', '/test', 'example.com'));
|
$this->assertEquals($cookie1, $cookieJar->get('foo', '/test', 'example.com'));
|
||||||
$this->assertEquals($cookie2, $cookieJar->get('foo1', '/', 'example.com'));
|
$this->assertEquals($cookie2, $cookieJar->get('foo1', '/', 'example.com'));
|
||||||
$this->assertEquals($cookie2, $cookieJar->get('foo1', '/bar', 'example.com'));
|
$this->assertEquals($cookie2, $cookieJar->get('foo1', '/bar', 'example.com'));
|
||||||
|
|
||||||
|
$this->assertEquals($cookie2, $cookieJar->get('foo1', '/bar'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCookieWithWildcardDomain()
|
public function testCookieWithWildcardDomain()
|
||||||
|
@ -11,8 +11,8 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Cache\Tests\Adapter;
|
namespace Symfony\Component\Cache\Tests\Adapter;
|
||||||
|
|
||||||
use Doctrine\Common\Cache\ArrayCache;
|
|
||||||
use Symfony\Component\Cache\Adapter\DoctrineAdapter;
|
use Symfony\Component\Cache\Adapter\DoctrineAdapter;
|
||||||
|
use Symfony\Component\Cache\Tests\Fixtures\ArrayCache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @group time-sensitive
|
* @group time-sensitive
|
||||||
|
52
src/Symfony/Component/Cache/Tests/Fixtures/ArrayCache.php
Normal file
52
src/Symfony/Component/Cache/Tests/Fixtures/ArrayCache.php
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Component\Cache\Tests\Fixtures;
|
||||||
|
|
||||||
|
use Doctrine\Common\Cache\CacheProvider;
|
||||||
|
|
||||||
|
class ArrayCache extends CacheProvider
|
||||||
|
{
|
||||||
|
private $data = array();
|
||||||
|
|
||||||
|
protected function doFetch($id)
|
||||||
|
{
|
||||||
|
return $this->doContains($id) ? $this->data[$id][0] : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function doContains($id)
|
||||||
|
{
|
||||||
|
if (!isset($this->data[$id])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$expiry = $this->data[$id][1];
|
||||||
|
|
||||||
|
return !$expiry || time() <= $expiry || !$this->doDelete($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function doSave($id, $data, $lifeTime = 0)
|
||||||
|
{
|
||||||
|
$this->data[$id] = array($data, $lifeTime ? time() + $lifeTime : false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function doDelete($id)
|
||||||
|
{
|
||||||
|
unset($this->data[$id]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function doFlush()
|
||||||
|
{
|
||||||
|
$this->data = array();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function doGetStats()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -11,8 +11,8 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Cache\Tests\Simple;
|
namespace Symfony\Component\Cache\Tests\Simple;
|
||||||
|
|
||||||
use Doctrine\Common\Cache\ArrayCache;
|
|
||||||
use Symfony\Component\Cache\Simple\DoctrineCache;
|
use Symfony\Component\Cache\Simple\DoctrineCache;
|
||||||
|
use Symfony\Component\Cache\Tests\Fixtures\ArrayCache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @group time-sensitive
|
* @group time-sensitive
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
<element><string>Cache\IntegrationTests</string></element>
|
<element><string>Cache\IntegrationTests</string></element>
|
||||||
<element><string>Doctrine\Common\Cache</string></element>
|
<element><string>Doctrine\Common\Cache</string></element>
|
||||||
<element><string>Symfony\Component\Cache</string></element>
|
<element><string>Symfony\Component\Cache</string></element>
|
||||||
|
<element><string>Symfony\Component\Cache\Tests\Fixtures</string></element>
|
||||||
<element><string>Symfony\Component\Cache\Traits</string></element>
|
<element><string>Symfony\Component\Cache\Traits</string></element>
|
||||||
</array>
|
</array>
|
||||||
</element>
|
</element>
|
||||||
|
@ -153,9 +153,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the node Name.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @param string $name The node's name
|
|
||||||
*/
|
*/
|
||||||
public function setName($name)
|
public function setName($name)
|
||||||
{
|
{
|
||||||
@ -163,9 +161,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the node has a default value.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
*/
|
||||||
public function hasDefaultValue()
|
public function hasDefaultValue()
|
||||||
{
|
{
|
||||||
@ -173,11 +169,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the default value.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @return array The default value
|
|
||||||
*
|
|
||||||
* @throws \RuntimeException if the node has no default value
|
|
||||||
*/
|
*/
|
||||||
public function getDefaultValue()
|
public function getDefaultValue()
|
||||||
{
|
{
|
||||||
|
@ -38,7 +38,7 @@ abstract class BaseNode implements NodeInterface
|
|||||||
*/
|
*/
|
||||||
public function __construct(?string $name, NodeInterface $parent = null)
|
public function __construct(?string $name, NodeInterface $parent = null)
|
||||||
{
|
{
|
||||||
if (false !== strpos($name, '.')) {
|
if (false !== strpos($name = (string) $name, '.')) {
|
||||||
throw new \InvalidArgumentException('The name must not contain ".".');
|
throw new \InvalidArgumentException('The name must not contain ".".');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,9 +181,7 @@ abstract class BaseNode implements NodeInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if this node is required.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
*/
|
||||||
public function isRequired()
|
public function isRequired()
|
||||||
{
|
{
|
||||||
@ -214,9 +212,7 @@ abstract class BaseNode implements NodeInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the name of this node.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @return string The Node's name
|
|
||||||
*/
|
*/
|
||||||
public function getName()
|
public function getName()
|
||||||
{
|
{
|
||||||
@ -224,9 +220,7 @@ abstract class BaseNode implements NodeInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the path of this node.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @return string The Node's path
|
|
||||||
*/
|
*/
|
||||||
public function getPath()
|
public function getPath()
|
||||||
{
|
{
|
||||||
@ -240,14 +234,7 @@ abstract class BaseNode implements NodeInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merges two values together.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @param mixed $leftSide
|
|
||||||
* @param mixed $rightSide
|
|
||||||
*
|
|
||||||
* @return mixed The merged value
|
|
||||||
*
|
|
||||||
* @throws ForbiddenOverwriteException
|
|
||||||
*/
|
*/
|
||||||
final public function merge($leftSide, $rightSide)
|
final public function merge($leftSide, $rightSide)
|
||||||
{
|
{
|
||||||
@ -267,11 +254,7 @@ abstract class BaseNode implements NodeInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Normalizes a value, applying all normalization closures.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @param mixed $value Value to normalize
|
|
||||||
*
|
|
||||||
* @return mixed The normalized value
|
|
||||||
*/
|
*/
|
||||||
final public function normalize($value)
|
final public function normalize($value)
|
||||||
{
|
{
|
||||||
@ -319,14 +302,7 @@ abstract class BaseNode implements NodeInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finalizes a value, applying all finalization closures.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @param mixed $value The value to finalize
|
|
||||||
*
|
|
||||||
* @return mixed The finalized value
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
* @throws InvalidConfigurationException
|
|
||||||
*/
|
*/
|
||||||
final public function finalize($value)
|
final public function finalize($value)
|
||||||
{
|
{
|
||||||
|
@ -48,7 +48,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a custom children builder.
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function setBuilder(NodeBuilder $builder)
|
public function setBuilder(NodeBuilder $builder)
|
||||||
{
|
{
|
||||||
@ -56,9 +56,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a builder to add children nodes.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @return NodeBuilder
|
|
||||||
*/
|
*/
|
||||||
public function children()
|
public function children()
|
||||||
{
|
{
|
||||||
@ -366,17 +364,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Appends a node definition.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* $node = new ArrayNodeDefinition()
|
|
||||||
* ->children()
|
|
||||||
* ->scalarNode('foo')->end()
|
|
||||||
* ->scalarNode('baz')->end()
|
|
||||||
* ->end()
|
|
||||||
* ->append($this->getBarNodeDefinition())
|
|
||||||
* ;
|
|
||||||
*
|
|
||||||
* @return $this
|
|
||||||
*/
|
*/
|
||||||
public function append(NodeDefinition $node)
|
public function append(NodeDefinition $node)
|
||||||
{
|
{
|
||||||
|
@ -143,8 +143,8 @@ class NodeBuilder implements NodeParentInterface
|
|||||||
/**
|
/**
|
||||||
* Creates a child node.
|
* Creates a child node.
|
||||||
*
|
*
|
||||||
* @param string $name The name of the node
|
* @param string|null $name The name of the node
|
||||||
* @param string $type The type of the node
|
* @param string $type The type of the node
|
||||||
*
|
*
|
||||||
* @return NodeDefinition The child node
|
* @return NodeDefinition The child node
|
||||||
*
|
*
|
||||||
|
@ -18,9 +18,32 @@ namespace Symfony\Component\Config\Definition\Builder;
|
|||||||
*/
|
*/
|
||||||
interface ParentNodeDefinitionInterface
|
interface ParentNodeDefinitionInterface
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Returns a builder to add children nodes.
|
||||||
|
*
|
||||||
|
* @return NodeBuilder
|
||||||
|
*/
|
||||||
public function children();
|
public function children();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends a node definition.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
*
|
||||||
|
* $node = $parentNode
|
||||||
|
* ->children()
|
||||||
|
* ->scalarNode('foo')->end()
|
||||||
|
* ->scalarNode('baz')->end()
|
||||||
|
* ->append($this->getBarNodeDefinition())
|
||||||
|
* ->end()
|
||||||
|
* ;
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
public function append(NodeDefinition $node);
|
public function append(NodeDefinition $node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a custom children builder.
|
||||||
|
*/
|
||||||
public function setBuilder(NodeBuilder $builder);
|
public function setBuilder(NodeBuilder $builder);
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,10 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Config\Definition;
|
namespace Symfony\Component\Config\Definition;
|
||||||
|
|
||||||
|
use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException;
|
||||||
|
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
|
||||||
|
use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Common Interface among all nodes.
|
* Common Interface among all nodes.
|
||||||
*
|
*
|
||||||
@ -59,11 +63,13 @@ interface NodeInterface
|
|||||||
public function getDefaultValue();
|
public function getDefaultValue();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Normalizes the supplied value.
|
* Normalizes a value.
|
||||||
*
|
*
|
||||||
* @param mixed $value The value to normalize
|
* @param mixed $value The value to normalize
|
||||||
*
|
*
|
||||||
* @return mixed The normalized value
|
* @return mixed The normalized value
|
||||||
|
*
|
||||||
|
* @throws InvalidTypeException if the value type is invalid
|
||||||
*/
|
*/
|
||||||
public function normalize($value);
|
public function normalize($value);
|
||||||
|
|
||||||
@ -73,7 +79,10 @@ interface NodeInterface
|
|||||||
* @param mixed $leftSide
|
* @param mixed $leftSide
|
||||||
* @param mixed $rightSide
|
* @param mixed $rightSide
|
||||||
*
|
*
|
||||||
* @return mixed The merged values
|
* @return mixed The merged value
|
||||||
|
*
|
||||||
|
* @throws ForbiddenOverwriteException if the configuration path cannot be overwritten
|
||||||
|
* @throws InvalidTypeException if the value type is invalid
|
||||||
*/
|
*/
|
||||||
public function merge($leftSide, $rightSide);
|
public function merge($leftSide, $rightSide);
|
||||||
|
|
||||||
@ -83,6 +92,9 @@ interface NodeInterface
|
|||||||
* @param mixed $value The value to finalize
|
* @param mixed $value The value to finalize
|
||||||
*
|
*
|
||||||
* @return mixed The finalized value
|
* @return mixed The finalized value
|
||||||
|
*
|
||||||
|
* @throws InvalidTypeException if the value type is invalid
|
||||||
|
* @throws InvalidConfigurationException if the value is invalid configuration
|
||||||
*/
|
*/
|
||||||
public function finalize($value);
|
public function finalize($value);
|
||||||
}
|
}
|
||||||
|
@ -102,9 +102,7 @@ class PrototypedArrayNode extends ArrayNode
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the node has a default value.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
*/
|
||||||
public function hasDefaultValue()
|
public function hasDefaultValue()
|
||||||
{
|
{
|
||||||
@ -126,12 +124,10 @@ class PrototypedArrayNode extends ArrayNode
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the default value.
|
* {@inheritdoc}
|
||||||
*
|
*
|
||||||
* The default value could be either explicited or derived from the prototype
|
* The default value could be either explicited or derived from the prototype
|
||||||
* default value.
|
* default value.
|
||||||
*
|
|
||||||
* @return array The default value
|
|
||||||
*/
|
*/
|
||||||
public function getDefaultValue()
|
public function getDefaultValue()
|
||||||
{
|
{
|
||||||
|
@ -27,9 +27,6 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface
|
|||||||
protected $defaultValue;
|
protected $defaultValue;
|
||||||
protected $allowEmptyValue = true;
|
protected $allowEmptyValue = true;
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setDefaultValue($value)
|
public function setDefaultValue($value)
|
||||||
{
|
{
|
||||||
$this->defaultValueSet = true;
|
$this->defaultValueSet = true;
|
||||||
|
@ -20,7 +20,7 @@ class ConfigCacheFactoryTest extends TestCase
|
|||||||
* @expectedException \InvalidArgumentException
|
* @expectedException \InvalidArgumentException
|
||||||
* @expectedExceptionMessage Invalid type for callback argument. Expected callable, but got "object".
|
* @expectedExceptionMessage Invalid type for callback argument. Expected callable, but got "object".
|
||||||
*/
|
*/
|
||||||
public function testCachWithInvalidCallback()
|
public function testCacheWithInvalidCallback()
|
||||||
{
|
{
|
||||||
$cacheFactory = new ConfigCacheFactory(true);
|
$cacheFactory = new ConfigCacheFactory(true);
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ use Symfony\Component\Console\Output\OutputInterface;
|
|||||||
interface DescriptorInterface
|
interface DescriptorInterface
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Describes an InputArgument instance.
|
* Describes an object if supported.
|
||||||
*
|
*
|
||||||
* @param OutputInterface $output
|
* @param OutputInterface $output
|
||||||
* @param object $object
|
* @param object $object
|
||||||
|
@ -46,7 +46,7 @@ class TokenizerPatterns
|
|||||||
$this->nonAsciiPattern = '[^\x00-\x7F]';
|
$this->nonAsciiPattern = '[^\x00-\x7F]';
|
||||||
$this->nmCharPattern = '[_a-z0-9-]|'.$this->escapePattern.'|'.$this->nonAsciiPattern;
|
$this->nmCharPattern = '[_a-z0-9-]|'.$this->escapePattern.'|'.$this->nonAsciiPattern;
|
||||||
$this->nmStartPattern = '[_a-z]|'.$this->escapePattern.'|'.$this->nonAsciiPattern;
|
$this->nmStartPattern = '[_a-z]|'.$this->escapePattern.'|'.$this->nonAsciiPattern;
|
||||||
$this->identifierPattern = '(?:'.$this->nmStartPattern.')(?:'.$this->nmCharPattern.')*';
|
$this->identifierPattern = '-?(?:'.$this->nmStartPattern.')(?:'.$this->nmCharPattern.')*';
|
||||||
$this->hashPattern = '#((?:'.$this->nmCharPattern.')+)';
|
$this->hashPattern = '#((?:'.$this->nmCharPattern.')+)';
|
||||||
$this->numberPattern = '[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)';
|
$this->numberPattern = '[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)';
|
||||||
$this->quotedStringPattern = '([^\n\r\f%s]|'.$this->stringEscapePattern.')*';
|
$this->quotedStringPattern = '([^\n\r\f%s]|'.$this->stringEscapePattern.')*';
|
||||||
|
@ -186,6 +186,7 @@ class ParserTest extends TestCase
|
|||||||
array('foo:after', 'Element[foo]', 'after'),
|
array('foo:after', 'Element[foo]', 'after'),
|
||||||
array('foo::selection', 'Element[foo]', 'selection'),
|
array('foo::selection', 'Element[foo]', 'selection'),
|
||||||
array('lorem#ipsum ~ a#b.c[href]:empty::selection', 'CombinedSelector[Hash[Element[lorem]#ipsum] ~ Pseudo[Attribute[Class[Hash[Element[a]#b].c][href]]:empty]]', 'selection'),
|
array('lorem#ipsum ~ a#b.c[href]:empty::selection', 'CombinedSelector[Hash[Element[lorem]#ipsum] ~ Pseudo[Attribute[Class[Hash[Element[a]#b].c][href]]:empty]]', 'selection'),
|
||||||
|
array('video::-webkit-media-controls', 'Element[video]', '-webkit-media-controls'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -547,14 +547,15 @@ class ErrorHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$exceptionHandler = $this->exceptionHandler;
|
||||||
|
$this->exceptionHandler = null;
|
||||||
try {
|
try {
|
||||||
if (null !== $this->exceptionHandler) {
|
if (null !== $exceptionHandler) {
|
||||||
return \call_user_func($this->exceptionHandler, $exception);
|
return \call_user_func($exceptionHandler, $exception);
|
||||||
}
|
}
|
||||||
$handlerException = $handlerException ?: $exception;
|
$handlerException = $handlerException ?: $exception;
|
||||||
} catch (\Throwable $handlerException) {
|
} catch (\Throwable $handlerException) {
|
||||||
}
|
}
|
||||||
$this->exceptionHandler = null;
|
|
||||||
if ($exception === $handlerException) {
|
if ($exception === $handlerException) {
|
||||||
self::$reservedMemory = null; // Disable the fatal error handler
|
self::$reservedMemory = null; // Disable the fatal error handler
|
||||||
throw $exception; // Give back $exception to the native handler
|
throw $exception; // Give back $exception to the native handler
|
||||||
|
@ -464,4 +464,17 @@ class ErrorHandlerTest extends TestCase
|
|||||||
$this->assertInstanceOf('Symfony\Component\Debug\Exception\ClassNotFoundException', $args[0]);
|
$this->assertInstanceOf('Symfony\Component\Debug\Exception\ClassNotFoundException', $args[0]);
|
||||||
$this->assertStringStartsWith("Attempted to load class \"Foo\" from the global namespace.\nDid you forget a \"use\" statement", $args[0]->getMessage());
|
$this->assertStringStartsWith("Attempted to load class \"Foo\" from the global namespace.\nDid you forget a \"use\" statement", $args[0]->getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Exception
|
||||||
|
*/
|
||||||
|
public function testCustomExceptionHandler()
|
||||||
|
{
|
||||||
|
$handler = new ErrorHandler();
|
||||||
|
$handler->setExceptionHandler(function ($e) use ($handler) {
|
||||||
|
$handler->handleException($e);
|
||||||
|
});
|
||||||
|
|
||||||
|
$handler->handleException(new \Exception());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -648,7 +648,7 @@ class Crawler implements \Countable, \IteratorAggregate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$data[] = $count > 1 ? $elements : $elements[0];
|
$data[] = 1 === $count ? $elements[0] : $elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
|
@ -97,14 +97,14 @@ class ChoiceFormField extends FormField
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ticks a checkbox.
|
* Unticks a checkbox.
|
||||||
*
|
*
|
||||||
* @throws \LogicException When the type provided is not correct
|
* @throws \LogicException When the type provided is not correct
|
||||||
*/
|
*/
|
||||||
public function untick()
|
public function untick()
|
||||||
{
|
{
|
||||||
if ('checkbox' !== $this->type) {
|
if ('checkbox' !== $this->type) {
|
||||||
throw new \LogicException(sprintf('You cannot tick "%s" as it is not a checkbox (%s).', $this->name, $this->type));
|
throw new \LogicException(sprintf('You cannot untick "%s" as it is not a checkbox (%s).', $this->name, $this->type));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->setValue(false);
|
$this->setValue(false);
|
||||||
@ -113,7 +113,7 @@ class ChoiceFormField extends FormField
|
|||||||
/**
|
/**
|
||||||
* Sets the value of the field.
|
* Sets the value of the field.
|
||||||
*
|
*
|
||||||
* @param string $value The value of the field
|
* @param string|array $value The value of the field
|
||||||
*
|
*
|
||||||
* @throws \InvalidArgumentException When value type provided is not correct
|
* @throws \InvalidArgumentException When value type provided is not correct
|
||||||
*/
|
*/
|
||||||
|
@ -32,11 +32,12 @@ class InputFormField extends FormField
|
|||||||
throw new \LogicException(sprintf('An InputFormField can only be created from an input or button tag (%s given).', $this->node->nodeName));
|
throw new \LogicException(sprintf('An InputFormField can only be created from an input or button tag (%s given).', $this->node->nodeName));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('checkbox' === strtolower($this->node->getAttribute('type'))) {
|
$type = strtolower($this->node->getAttribute('type'));
|
||||||
|
if ('checkbox' === $type) {
|
||||||
throw new \LogicException('Checkboxes should be instances of ChoiceFormField.');
|
throw new \LogicException('Checkboxes should be instances of ChoiceFormField.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('file' === strtolower($this->node->getAttribute('type'))) {
|
if ('file' === $type) {
|
||||||
throw new \LogicException('File inputs should be instances of FileFormField.');
|
throw new \LogicException('File inputs should be instances of FileFormField.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,6 +413,7 @@ EOF
|
|||||||
|
|
||||||
$this->assertEquals(array('One', 'Two', 'Three'), $crawler->extract('_text'), '->extract() returns an array of extracted data from the node list');
|
$this->assertEquals(array('One', 'Two', 'Three'), $crawler->extract('_text'), '->extract() returns an array of extracted data from the node list');
|
||||||
$this->assertEquals(array(array('One', 'first'), array('Two', ''), array('Three', '')), $crawler->extract(array('_text', 'class')), '->extract() returns an array of extracted data from the node list');
|
$this->assertEquals(array(array('One', 'first'), array('Two', ''), array('Three', '')), $crawler->extract(array('_text', 'class')), '->extract() returns an array of extracted data from the node list');
|
||||||
|
$this->assertEquals(array(array(), array(), array()), $crawler->extract(array()), '->extract() returns empty arrays if the attribute list is empty');
|
||||||
|
|
||||||
$this->assertEquals(array(), $this->createTestCrawler()->filterXPath('//ol')->extract('_text'), '->extract() returns an empty array if the node list is empty');
|
$this->assertEquals(array(), $this->createTestCrawler()->filterXPath('//ol')->extract('_text'), '->extract() returns an empty array if the node list is empty');
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,7 @@ class FormType extends BaseType
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$formConfig = $form->getConfig();
|
||||||
$view->vars = array_replace($view->vars, array(
|
$view->vars = array_replace($view->vars, array(
|
||||||
'errors' => $form->getErrors(),
|
'errors' => $form->getErrors(),
|
||||||
'valid' => $form->isSubmitted() ? $form->isValid() : true,
|
'valid' => $form->isSubmitted() ? $form->isValid() : true,
|
||||||
@ -88,9 +89,9 @@ class FormType extends BaseType
|
|||||||
'required' => $form->isRequired(),
|
'required' => $form->isRequired(),
|
||||||
'size' => null,
|
'size' => null,
|
||||||
'label_attr' => $options['label_attr'],
|
'label_attr' => $options['label_attr'],
|
||||||
'compound' => $form->getConfig()->getCompound(),
|
'compound' => $formConfig->getCompound(),
|
||||||
'method' => $form->getConfig()->getMethod(),
|
'method' => $formConfig->getMethod(),
|
||||||
'action' => $form->getConfig()->getAction(),
|
'action' => $formConfig->getAction(),
|
||||||
'submitted' => $form->isSubmitted(),
|
'submitted' => $form->isSubmitted(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -52,9 +52,7 @@ class ValidationListener implements EventSubscriberInterface
|
|||||||
|
|
||||||
if ($form->isRoot()) {
|
if ($form->isRoot()) {
|
||||||
// Validate the form in group "Default"
|
// Validate the form in group "Default"
|
||||||
$violations = $this->validator->validate($form);
|
foreach ($this->validator->validate($form) as $violation) {
|
||||||
|
|
||||||
foreach ($violations as $violation) {
|
|
||||||
// Allow the "invalid" constraint to be put onto
|
// Allow the "invalid" constraint to be put onto
|
||||||
// non-synchronized forms
|
// non-synchronized forms
|
||||||
// ConstraintViolation::getConstraint() must not expect to provide a constraint as long as Symfony\Component\Validator\ExecutionContext exists (before 3.0)
|
// ConstraintViolation::getConstraint() must not expect to provide a constraint as long as Symfony\Component\Validator\ExecutionContext exists (before 3.0)
|
||||||
|
@ -253,12 +253,8 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface
|
|||||||
$classMetadata = $this->metadataFactory->getMetadataFor($class);
|
$classMetadata = $this->metadataFactory->getMetadataFor($class);
|
||||||
|
|
||||||
if ($classMetadata instanceof ClassMetadataInterface && $classMetadata->hasPropertyMetadata($property)) {
|
if ($classMetadata instanceof ClassMetadataInterface && $classMetadata->hasPropertyMetadata($property)) {
|
||||||
$memberMetadatas = $classMetadata->getPropertyMetadata($property);
|
foreach ($classMetadata->getPropertyMetadata($property) as $memberMetadata) {
|
||||||
|
foreach ($memberMetadata->getConstraints() as $constraint) {
|
||||||
foreach ($memberMetadatas as $memberMetadata) {
|
|
||||||
$constraints = $memberMetadata->getConstraints();
|
|
||||||
|
|
||||||
foreach ($constraints as $constraint) {
|
|
||||||
if ($guess = $closure($constraint)) {
|
if ($guess = $closure($constraint)) {
|
||||||
$guesses[] = $guess;
|
$guesses[] = $guess;
|
||||||
}
|
}
|
||||||
|
@ -166,10 +166,10 @@ abstract class AbstractBootstrap4LayoutTest extends AbstractBootstrap3LayoutTest
|
|||||||
./span[@class="mb-0 d-block"]
|
./span[@class="mb-0 d-block"]
|
||||||
[./span[.="[trans]Error[/trans]"]]
|
[./span[.="[trans]Error[/trans]"]]
|
||||||
[./span[.="[trans]Error 1[/trans]"]]
|
[./span[.="[trans]Error 1[/trans]"]]
|
||||||
|
|
||||||
/following-sibling::span[@class="mb-0 d-block"]
|
/following-sibling::span[@class="mb-0 d-block"]
|
||||||
[./span[.="[trans]Error[/trans]"]]
|
[./span[.="[trans]Error[/trans]"]]
|
||||||
[./span[.="[trans]Error 2[/trans]"]]
|
[./span[.="[trans]Error 2[/trans]"]]
|
||||||
]
|
]
|
||||||
[count(./span)=2]
|
[count(./span)=2]
|
||||||
'
|
'
|
||||||
|
@ -15,6 +15,7 @@ use Symfony\Component\Intl\Data\Bundle\Reader\JsonBundleReader;
|
|||||||
use Symfony\Component\Intl\Data\Bundle\Reader\BufferedBundleReader;
|
use Symfony\Component\Intl\Data\Bundle\Reader\BufferedBundleReader;
|
||||||
use Symfony\Component\Intl\Data\Bundle\Reader\BundleEntryReader;
|
use Symfony\Component\Intl\Data\Bundle\Reader\BundleEntryReader;
|
||||||
use Symfony\Component\Intl\Data\Bundle\Reader\BundleEntryReaderInterface;
|
use Symfony\Component\Intl\Data\Bundle\Reader\BundleEntryReaderInterface;
|
||||||
|
use Symfony\Component\Intl\Data\Provider\LocaleDataProvider;
|
||||||
use Symfony\Component\Intl\Data\Provider\ScriptDataProvider;
|
use Symfony\Component\Intl\Data\Provider\ScriptDataProvider;
|
||||||
use Symfony\Component\Intl\ResourceBundle\CurrencyBundle;
|
use Symfony\Component\Intl\ResourceBundle\CurrencyBundle;
|
||||||
use Symfony\Component\Intl\ResourceBundle\CurrencyBundleInterface;
|
use Symfony\Component\Intl\ResourceBundle\CurrencyBundleInterface;
|
||||||
@ -259,6 +260,11 @@ final class Intl
|
|||||||
new JsonBundleReader(),
|
new JsonBundleReader(),
|
||||||
self::BUFFER_SIZE
|
self::BUFFER_SIZE
|
||||||
));
|
));
|
||||||
|
$localeDataProvider = new LocaleDataProvider(
|
||||||
|
self::getDataDirectory().'/'.self::LOCALE_DIR,
|
||||||
|
self::$entryReader
|
||||||
|
);
|
||||||
|
self::$entryReader->setLocaleAliases($localeDataProvider->getAliases());
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::$entryReader;
|
return self::$entryReader;
|
||||||
|
84
src/Symfony/Component/Intl/Tests/IntlTest.php
Normal file
84
src/Symfony/Component/Intl/Tests/IntlTest.php
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Intl\Tests;
|
||||||
|
|
||||||
|
use Symfony\Component\Intl\Intl;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class IntlTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @requires extension intl
|
||||||
|
*/
|
||||||
|
public function testIsExtensionLoadedChecksIfIntlExtensionIsLoaded()
|
||||||
|
{
|
||||||
|
$this->assertTrue(Intl::isExtensionLoaded());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetCurrencyBundleCreatesTheCurrencyBundle()
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Symfony\Component\Intl\ResourceBundle\CurrencyBundleInterface', Intl::getCurrencyBundle());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetLanguageBundleCreatesTheLanguageBundle()
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Symfony\Component\Intl\ResourceBundle\LanguageBundleInterface', Intl::getLanguageBundle());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetLocaleBundleCreatesTheLocaleBundle()
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Symfony\Component\Intl\ResourceBundle\LocaleBundleInterface', Intl::getLocaleBundle());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetRegionBundleCreatesTheRegionBundle()
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Symfony\Component\Intl\ResourceBundle\LocaleBundleInterface', Intl::getLocaleBundle());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetIcuVersionReadsTheVersionOfInstalledIcuLibrary()
|
||||||
|
{
|
||||||
|
$this->assertStringMatchesFormat('%d.%d', Intl::getIcuVersion());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetIcuDataVersionReadsTheVersionOfInstalledIcuData()
|
||||||
|
{
|
||||||
|
$this->assertStringMatchesFormat('%d.%d', Intl::getIcuDataVersion());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetIcuStubVersionReadsTheVersionOfBundledStubs()
|
||||||
|
{
|
||||||
|
$this->assertStringMatchesFormat('%d.%d', Intl::getIcuStubVersion());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetDataDirectoryReturnsThePathToIcuData()
|
||||||
|
{
|
||||||
|
$this->assertTrue(is_dir(Intl::getDataDirectory()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @requires extension intl
|
||||||
|
*/
|
||||||
|
public function testLocaleAliasesAreLoaded()
|
||||||
|
{
|
||||||
|
\Locale::setDefault('zh_TW');
|
||||||
|
$countryNameZhTw = Intl::getRegionBundle()->getCountryName('AD');
|
||||||
|
|
||||||
|
\Locale::setDefault('zh_Hant_TW');
|
||||||
|
$countryNameHantZhTw = Intl::getRegionBundle()->getCountryName('AD');
|
||||||
|
|
||||||
|
\Locale::setDefault('zh');
|
||||||
|
$countryNameZh = Intl::getRegionBundle()->getCountryName('AD');
|
||||||
|
|
||||||
|
$this->assertSame($countryNameZhTw, $countryNameHantZhTw, 'zh_TW is an alias to zh_Hant_TW');
|
||||||
|
$this->assertNotSame($countryNameZh, $countryNameZhTw, 'zh_TW does not fall back to zh');
|
||||||
|
}
|
||||||
|
}
|
@ -39,7 +39,7 @@ class PhpExecutableFinder
|
|||||||
$args = $includeArgs && $args ? ' '.implode(' ', $args) : '';
|
$args = $includeArgs && $args ? ' '.implode(' ', $args) : '';
|
||||||
|
|
||||||
// PHP_BINARY return the current sapi executable
|
// PHP_BINARY return the current sapi executable
|
||||||
if (PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server', 'phpdbg')) && is_file(PHP_BINARY)) {
|
if (PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server', 'phpdbg'))) {
|
||||||
return PHP_BINARY.$args;
|
return PHP_BINARY.$args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Security\Core\Authentication\Provider;
|
namespace Symfony\Component\Security\Core\Authentication\Provider;
|
||||||
|
|
||||||
|
use Symfony\Component\Security\Core\User\UserChecker;
|
||||||
|
use Symfony\Component\Security\Core\User\UserCheckerInterface;
|
||||||
use Symfony\Component\Security\Core\User\UserProviderInterface;
|
use Symfony\Component\Security\Core\User\UserProviderInterface;
|
||||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||||
use Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface;
|
use Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface;
|
||||||
@ -24,23 +26,29 @@ class SimpleAuthenticationProvider implements AuthenticationProviderInterface
|
|||||||
private $simpleAuthenticator;
|
private $simpleAuthenticator;
|
||||||
private $userProvider;
|
private $userProvider;
|
||||||
private $providerKey;
|
private $providerKey;
|
||||||
|
private $userChecker;
|
||||||
|
|
||||||
public function __construct(SimpleAuthenticatorInterface $simpleAuthenticator, UserProviderInterface $userProvider, string $providerKey)
|
public function __construct(SimpleAuthenticatorInterface $simpleAuthenticator, UserProviderInterface $userProvider, string $providerKey, UserCheckerInterface $userChecker = null)
|
||||||
{
|
{
|
||||||
$this->simpleAuthenticator = $simpleAuthenticator;
|
$this->simpleAuthenticator = $simpleAuthenticator;
|
||||||
$this->userProvider = $userProvider;
|
$this->userProvider = $userProvider;
|
||||||
$this->providerKey = $providerKey;
|
$this->providerKey = $providerKey;
|
||||||
|
$this->userChecker = $userChecker ?: new UserChecker();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function authenticate(TokenInterface $token)
|
public function authenticate(TokenInterface $token)
|
||||||
{
|
{
|
||||||
$authToken = $this->simpleAuthenticator->authenticateToken($token, $this->userProvider, $this->providerKey);
|
$authToken = $this->simpleAuthenticator->authenticateToken($token, $this->userProvider, $this->providerKey);
|
||||||
|
|
||||||
if ($authToken instanceof TokenInterface) {
|
if (!$authToken instanceof TokenInterface) {
|
||||||
return $authToken;
|
throw new AuthenticationException('Simple authenticator failed to return an authenticated token.');
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new AuthenticationException('Simple authenticator failed to return an authenticated token.');
|
$user = $authToken->getUser();
|
||||||
|
$this->userChecker->checkPreAuth($user);
|
||||||
|
$this->userChecker->checkPostAuth($user);
|
||||||
|
|
||||||
|
return $authToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function supports(TokenInterface $token)
|
public function supports(TokenInterface $token)
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Security\Core\Tests\Authentication\Provider;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Symfony\Component\Security\Core\Exception\DisabledException;
|
||||||
|
use Symfony\Component\Security\Core\Authentication\Provider\SimpleAuthenticationProvider;
|
||||||
|
use Symfony\Component\Security\Core\Exception\LockedException;
|
||||||
|
|
||||||
|
class SimpleAuthenticationProviderTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\Security\Core\Exception\DisabledException
|
||||||
|
*/
|
||||||
|
public function testAuthenticateWhenPreChecksFails()
|
||||||
|
{
|
||||||
|
$user = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserInterface')->getMock();
|
||||||
|
|
||||||
|
$token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')->getMock();
|
||||||
|
$token->expects($this->any())
|
||||||
|
->method('getUser')
|
||||||
|
->will($this->returnValue($user));
|
||||||
|
|
||||||
|
$userChecker = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserCheckerInterface')->getMock();
|
||||||
|
$userChecker->expects($this->once())
|
||||||
|
->method('checkPreAuth')
|
||||||
|
->will($this->throwException(new DisabledException()));
|
||||||
|
|
||||||
|
$authenticator = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface')->getMock();
|
||||||
|
$authenticator->expects($this->once())
|
||||||
|
->method('authenticateToken')
|
||||||
|
->will($this->returnValue($token));
|
||||||
|
|
||||||
|
$provider = $this->getProvider($authenticator, null, $userChecker);
|
||||||
|
|
||||||
|
$provider->authenticate($token);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\Security\Core\Exception\LockedException
|
||||||
|
*/
|
||||||
|
public function testAuthenticateWhenPostChecksFails()
|
||||||
|
{
|
||||||
|
$user = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserInterface')->getMock();
|
||||||
|
|
||||||
|
$token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')->getMock();
|
||||||
|
$token->expects($this->any())
|
||||||
|
->method('getUser')
|
||||||
|
->will($this->returnValue($user));
|
||||||
|
|
||||||
|
$userChecker = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserCheckerInterface')->getMock();
|
||||||
|
$userChecker->expects($this->once())
|
||||||
|
->method('checkPostAuth')
|
||||||
|
->will($this->throwException(new LockedException()));
|
||||||
|
|
||||||
|
$authenticator = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface')->getMock();
|
||||||
|
$authenticator->expects($this->once())
|
||||||
|
->method('authenticateToken')
|
||||||
|
->will($this->returnValue($token));
|
||||||
|
|
||||||
|
$provider = $this->getProvider($authenticator, null, $userChecker);
|
||||||
|
|
||||||
|
$provider->authenticate($token);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getProvider($simpleAuthenticator = null, $userProvider = null, $userChecker = null, $key = 'test')
|
||||||
|
{
|
||||||
|
if (null === $userChecker) {
|
||||||
|
$userChecker = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserCheckerInterface')->getMock();
|
||||||
|
}
|
||||||
|
if (null === $simpleAuthenticator) {
|
||||||
|
$simpleAuthenticator = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface')->getMock();
|
||||||
|
}
|
||||||
|
if (null === $userProvider) {
|
||||||
|
$userProvider = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserProviderInterface')->getMock();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SimpleAuthenticationProvider($simpleAuthenticator, $userProvider, $key, $userChecker);
|
||||||
|
}
|
||||||
|
}
|
@ -47,7 +47,7 @@ class ClassMetadata extends GenericMetadata implements ClassMetadataInterface
|
|||||||
public $defaultGroup;
|
public $defaultGroup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var MemberMetadata[]
|
* @var MemberMetadata[][]
|
||||||
*
|
*
|
||||||
* @internal This property is public in order to reduce the size of the
|
* @internal This property is public in order to reduce the size of the
|
||||||
* class' serialized representation. Do not access it. Use
|
* class' serialized representation. Do not access it. Use
|
||||||
|
Reference in New Issue
Block a user