Merge branch '4.2'
* 4.2: Revert "bug #30423 [Security] Rework firewall's access denied rule (dimabory)" [FrameworkBundle] minor: remove a typo from changelog [VarDumper] fix tests with ICU 64.1 [VarDumper][Ldap] relax some locally failing tests [Validator] #30192 Added the missing translations for the Tagalog ("tl") locale. Make MimeTypeExtensionGuesser case insensitive Fix get session when the request stack is empty [Routing] fix trailing slash redirection with non-greedy trailing vars [FrameworkBundle] decorate the ValidatorBuilder's translator with LegacyTranslatorProxy
This commit is contained in:
commit
8d9686105d
@ -166,7 +166,7 @@ CHANGELOG
|
||||
The default value will be `state_machine` in Symfony 4.0.
|
||||
* Deprecated the `CompilerDebugDumpPass` class
|
||||
* Deprecated the "framework.trusted_proxies" configuration option and the corresponding "kernel.trusted_proxies" parameter
|
||||
* Added a new new version strategy option called json_manifest_path
|
||||
* Added a new version strategy option called "json_manifest_path"
|
||||
that allows you to use the `JsonManifestVersionStrategy`.
|
||||
* Added `Symfony\Bundle\FrameworkBundle\Controller\AbstractController`. It provides
|
||||
the same helpers as the `Controller` class, but does not allow accessing the dependency
|
||||
|
@ -110,6 +110,7 @@ use Symfony\Component\Translation\Translator;
|
||||
use Symfony\Component\Validator\ConstraintValidatorInterface;
|
||||
use Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader;
|
||||
use Symfony\Component\Validator\ObjectInitializerInterface;
|
||||
use Symfony\Component\Validator\Util\LegacyTranslatorProxy;
|
||||
use Symfony\Component\WebLink\HttpHeaderSerializer;
|
||||
use Symfony\Component\Workflow;
|
||||
use Symfony\Component\Workflow\WorkflowInterface;
|
||||
@ -1208,6 +1209,12 @@ class FrameworkExtension extends Extension
|
||||
|
||||
$validatorBuilder = $container->getDefinition('validator.builder');
|
||||
|
||||
if (class_exists(LegacyTranslatorProxy::class)) {
|
||||
$calls = $validatorBuilder->getMethodCalls();
|
||||
$calls[1] = ['setTranslator', [new Definition(LegacyTranslatorProxy::class, [new Reference('translator')])]];
|
||||
$validatorBuilder->setMethodCalls($calls);
|
||||
}
|
||||
|
||||
$container->setParameter('validator.translation_domain', $config['translation_domain']);
|
||||
|
||||
$files = ['xml' => [], 'yml' => []];
|
||||
|
@ -55,6 +55,7 @@ use Symfony\Component\Serializer\Serializer;
|
||||
use Symfony\Component\Translation\DependencyInjection\TranslatorPass;
|
||||
use Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass;
|
||||
use Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader;
|
||||
use Symfony\Component\Validator\Util\LegacyTranslatorProxy;
|
||||
use Symfony\Component\Validator\Validation;
|
||||
use Symfony\Component\Workflow;
|
||||
|
||||
@ -882,7 +883,11 @@ abstract class FrameworkExtensionTest extends TestCase
|
||||
$this->assertSame('setConstraintValidatorFactory', $calls[0][0]);
|
||||
$this->assertEquals([new Reference('validator.validator_factory')], $calls[0][1]);
|
||||
$this->assertSame('setTranslator', $calls[1][0]);
|
||||
$this->assertEquals([new Reference('translator')], $calls[1][1]);
|
||||
if (class_exists(LegacyTranslatorProxy::class)) {
|
||||
$this->assertEquals([new Definition(LegacyTranslatorProxy::class, [new Reference('translator')])], $calls[1][1]);
|
||||
} else {
|
||||
$this->assertEquals([new Reference('translator')], $calls[1][1]);
|
||||
}
|
||||
$this->assertSame('setTranslationDomain', $calls[2][0]);
|
||||
$this->assertSame(['%validator.translation_domain%'], $calls[2][1]);
|
||||
$this->assertSame('addXmlMappings', $calls[3][0]);
|
||||
|
@ -814,6 +814,12 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
|
||||
*/
|
||||
public function guess($mimeType)
|
||||
{
|
||||
return isset($this->defaultExtensions[$mimeType]) ? $this->defaultExtensions[$mimeType] : null;
|
||||
if (isset($this->defaultExtensions[$mimeType])) {
|
||||
return $this->defaultExtensions[$mimeType];
|
||||
}
|
||||
|
||||
$lcMimeType = strtolower($mimeType);
|
||||
|
||||
return isset($this->defaultExtensions[$lcMimeType]) ? $this->defaultExtensions[$lcMimeType] : null;
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
@ -94,6 +94,18 @@ class UploadedFileTest extends TestCase
|
||||
$this->assertEquals('jpeg', $file->guessClientExtension());
|
||||
}
|
||||
|
||||
public function testCaseSensitiveMimeType()
|
||||
{
|
||||
$file = new UploadedFile(
|
||||
__DIR__.'/Fixtures/case-sensitive-mime-type.xlsm',
|
||||
'test.xlsm',
|
||||
'application/vnd.ms-excel.sheet.macroEnabled.12',
|
||||
null
|
||||
);
|
||||
|
||||
$this->assertEquals('xlsm', $file->guessClientExtension());
|
||||
}
|
||||
|
||||
public function testErrorIsOkByDefault()
|
||||
{
|
||||
$file = new UploadedFile(
|
||||
|
@ -40,7 +40,8 @@ class SessionListener extends AbstractSessionListener
|
||||
|
||||
if ($this->container->has('session_storage')
|
||||
&& ($storage = $this->container->get('session_storage')) instanceof NativeSessionStorage
|
||||
&& $this->container->get('request_stack')->getMasterRequest()->isSecure()
|
||||
&& ($masterRequest = $this->container->get('request_stack')->getMasterRequest())
|
||||
&& $masterRequest->isSecure()
|
||||
) {
|
||||
$storage->setOptions(['cookie_secure' => true]);
|
||||
}
|
||||
|
@ -15,8 +15,10 @@ use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\DependencyInjection\Container;
|
||||
use Symfony\Component\DependencyInjection\ServiceLocator;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\RequestStack;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpFoundation\Session\Session;
|
||||
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
|
||||
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
|
||||
use Symfony\Component\HttpKernel\Event\RequestEvent;
|
||||
use Symfony\Component\HttpKernel\Event\ResponseEvent;
|
||||
@ -41,8 +43,16 @@ class SessionListenerTest extends TestCase
|
||||
{
|
||||
$session = $this->getMockBuilder(Session::class)->disableOriginalConstructor()->getMock();
|
||||
|
||||
$requestStack = $this->getMockBuilder(RequestStack::class)->getMock();
|
||||
$requestStack->expects($this->once())->method('getMasterRequest')->willReturn(null);
|
||||
|
||||
$sessionStorage = $this->getMockBuilder(NativeSessionStorage::class)->getMock();
|
||||
$sessionStorage->expects($this->never())->method('setOptions')->with(['cookie_secure' => true]);
|
||||
|
||||
$container = new Container();
|
||||
$container->set('session', $session);
|
||||
$container->set('request_stack', $requestStack);
|
||||
$container->set('session_storage', $sessionStorage);
|
||||
|
||||
$request = new Request();
|
||||
$listener = new SessionListener($container);
|
||||
|
@ -8,6 +8,14 @@ class LdapTestCase extends TestCase
|
||||
{
|
||||
protected function getLdapConfig()
|
||||
{
|
||||
$h = @ldap_connect(getenv('LDAP_HOST'), getenv('LDAP_PORT'));
|
||||
|
||||
if (!$h || !@ldap_bind($h)) {
|
||||
$this->markTestSkipped('No server is listening on LDAP_HOST:LDAP_PORT');
|
||||
}
|
||||
|
||||
ldap_close($h);
|
||||
|
||||
return [
|
||||
'host' => getenv('LDAP_HOST'),
|
||||
'port' => getenv('LDAP_PORT'),
|
||||
|
@ -39,6 +39,7 @@ use Symfony\Component\Mime\Exception\LogicException;
|
||||
final class MimeTypes implements MimeTypesInterface
|
||||
{
|
||||
private $extensions = [];
|
||||
private $mimeTypes = [];
|
||||
|
||||
/**
|
||||
* @var MimeTypeGuesserInterface[]
|
||||
@ -50,6 +51,10 @@ final class MimeTypes implements MimeTypesInterface
|
||||
{
|
||||
foreach ($map as $mimeType => $extensions) {
|
||||
$this->extensions[$mimeType] = $extensions;
|
||||
|
||||
foreach ($extensions as $extension) {
|
||||
$this->mimeTypes[$extension] = $mimeType;
|
||||
}
|
||||
}
|
||||
$this->registerGuesser(new FileBinaryMimeTypeGuesser());
|
||||
$this->registerGuesser(new FileinfoMimeTypeGuesser());
|
||||
@ -80,7 +85,11 @@ final class MimeTypes implements MimeTypesInterface
|
||||
*/
|
||||
public function getExtensions(string $mimeType): array
|
||||
{
|
||||
return $this->extensions[$mimeType] ?? self::$map[$mimeType] ?? [];
|
||||
if ($this->extensions) {
|
||||
$extensions = $this->extensions[$mimeType] ?? $this->extensions[$lcMimeType = strtolower($mimeType)] ?? null;
|
||||
}
|
||||
|
||||
return $extensions ?? self::$map[$mimeType] ?? self::$map[$lcMimeType ?? strtolower($mimeType)] ?? [];
|
||||
}
|
||||
|
||||
/**
|
||||
@ -88,7 +97,11 @@ final class MimeTypes implements MimeTypesInterface
|
||||
*/
|
||||
public function getMimeTypes(string $ext): array
|
||||
{
|
||||
return self::$reverseMap[$ext] ?? [];
|
||||
if ($this->mimeTypes) {
|
||||
$mimeTypes = $this->mimeTypes[$ext] ?? $this->mimeTypes[$lcExt = strtolower($ext)] ?? null;
|
||||
}
|
||||
|
||||
return $mimeTypes ?? self::$reverseMap[$ext] ?? self::$reverseMap[$lcExt ?? strtolower($ext)] ?? [];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -136,6 +136,15 @@ trait CompiledUrlMatcherTrait
|
||||
}
|
||||
|
||||
$hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar;
|
||||
|
||||
if ($hasTrailingVar && ($hasTrailingSlash || '/' !== substr($matches[\count($vars)], -1)) && preg_match($regex, $this->matchHost ? $host.'.'.$trimmedPathinfo : $trimmedPathinfo, $n) && $m === (int) $n['MARK']) {
|
||||
if ($hasTrailingSlash) {
|
||||
$matches = $n;
|
||||
} else {
|
||||
$hasTrailingVar = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) {
|
||||
if ($supportsRedirections && (!$requiredMethods || isset($requiredMethods['GET']))) {
|
||||
return $allow = $allowSchemes = [];
|
||||
@ -143,10 +152,6 @@ trait CompiledUrlMatcherTrait
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, $this->matchHost ? $host.'.'.$trimmedPathinfo : $trimmedPathinfo, $n) && $m === (int) $n['MARK']) {
|
||||
$matches = $n;
|
||||
}
|
||||
|
||||
foreach ($vars as $i => $v) {
|
||||
if (isset($matches[1 + $i])) {
|
||||
$ret[$v] = $matches[1 + $i];
|
||||
|
@ -158,6 +158,14 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
|
||||
|
||||
$hasTrailingVar = $trimmedPathinfo !== $pathinfo && preg_match('#\{\w+\}/?$#', $route->getPath());
|
||||
|
||||
if ($hasTrailingVar && ($hasTrailingSlash || '/' !== substr($matches[(\count($matches) - 1) >> 1], -1)) && preg_match($regex, $trimmedPathinfo, $m)) {
|
||||
if ($hasTrailingSlash) {
|
||||
$matches = $m;
|
||||
} else {
|
||||
$hasTrailingVar = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) {
|
||||
if ($supportsTrailingSlash && (!$requiredMethods || \in_array('GET', $requiredMethods))) {
|
||||
return $this->allow = $this->allowSchemes = [];
|
||||
@ -166,10 +174,6 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, $trimmedPathinfo, $m)) {
|
||||
$matches = $m;
|
||||
}
|
||||
|
||||
$hostMatches = [];
|
||||
if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) {
|
||||
continue;
|
||||
|
@ -187,6 +187,17 @@ class RedirectableUrlMatcherTest extends UrlMatcherTest
|
||||
$this->assertEquals($expected, $matcher->match('/api/customers/123/contactpersons'));
|
||||
}
|
||||
|
||||
public function testNonGreedyTrailingRequirement()
|
||||
{
|
||||
$coll = new RouteCollection();
|
||||
$coll->add('a', new Route('/{a}', [], ['a' => '\d+']));
|
||||
|
||||
$matcher = $this->getUrlMatcher($coll);
|
||||
$matcher->expects($this->once())->method('redirect')->with('/123')->willReturn([]);
|
||||
|
||||
$this->assertEquals(['_route' => 'a', 'a' => '123'], $matcher->match('/123/'));
|
||||
}
|
||||
|
||||
protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
|
||||
{
|
||||
return $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', [$routes, $context ?: new RequestContext()]);
|
||||
|
@ -133,6 +133,8 @@ class ExceptionListener
|
||||
} catch (\Exception $e) {
|
||||
$event->setException($e);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (null !== $this->logger) {
|
||||
@ -150,7 +152,7 @@ class ExceptionListener
|
||||
$subRequest = $this->httpUtils->createRequest($event->getRequest(), $this->errorPage);
|
||||
$subRequest->attributes->set(Security::ACCESS_DENIED_ERROR, $exception);
|
||||
|
||||
$event->setResponse($event->getKernel()->handle($subRequest, HttpKernelInterface::SUB_REQUEST));
|
||||
$event->setResponse($event->getKernel()->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true));
|
||||
$event->allowCustomResponseCode();
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
|
@ -131,8 +131,10 @@ class ExceptionListenerTest extends TestCase
|
||||
{
|
||||
$event = $this->createEvent($exception);
|
||||
|
||||
$listener = $this->createExceptionListener(null, $this->createTrustResolver(true), null, null, null, $this->createCustomAccessDeniedHandler(new Response('error')));
|
||||
$accessDeniedHandler = $this->getMockBuilder('Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface')->getMock();
|
||||
$accessDeniedHandler->expects($this->once())->method('handle')->will($this->returnValue(new Response('error')));
|
||||
|
||||
$listener = $this->createExceptionListener(null, $this->createTrustResolver(true), null, null, null, $accessDeniedHandler);
|
||||
$listener->onKernelException($event);
|
||||
|
||||
$this->assertEquals('error', $event->getResponse()->getContent());
|
||||
@ -146,51 +148,16 @@ class ExceptionListenerTest extends TestCase
|
||||
{
|
||||
$event = $this->createEvent($exception);
|
||||
|
||||
$listener = $this->createExceptionListener($this->createTokenStorage(), $this->createTrustResolver(false), null, $this->createEntryPoint());
|
||||
$tokenStorage = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')->getMock();
|
||||
$tokenStorage->expects($this->once())->method('getToken')->will($this->returnValue($this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')->getMock()));
|
||||
|
||||
$listener = $this->createExceptionListener($tokenStorage, $this->createTrustResolver(false), null, $this->createEntryPoint());
|
||||
$listener->onKernelException($event);
|
||||
|
||||
$this->assertEquals('OK', $event->getResponse()->getContent());
|
||||
$this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAccessDeniedExceptionProvider
|
||||
*/
|
||||
public function testAccessDeniedExceptionNotFullFledgedAndWithAccessDeniedHandlerAndWithoutErrorPage(\Exception $exception, \Exception $eventException = null)
|
||||
{
|
||||
$event = $this->createEvent($exception);
|
||||
|
||||
$listener = $this->createExceptionListener($this->createTokenStorage(), $this->createTrustResolver(false), null, $this->createEntryPoint(), null, $this->createCustomAccessDeniedHandler(new Response('denied', 403)));
|
||||
$listener->onKernelException($event);
|
||||
|
||||
$this->assertEquals('denied', $event->getResponse()->getContent());
|
||||
$this->assertEquals(403, $event->getResponse()->getStatusCode());
|
||||
$this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAccessDeniedExceptionProvider
|
||||
*/
|
||||
public function testAccessDeniedExceptionNotFullFledgedAndWithoutAccessDeniedHandlerAndWithErrorPage(\Exception $exception, \Exception $eventException = null)
|
||||
{
|
||||
$kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
|
||||
$kernel->expects($this->once())->method('handle')->will($this->returnValue(new Response('Unauthorized', 401)));
|
||||
|
||||
$event = $this->createEvent($exception, $kernel);
|
||||
|
||||
$httpUtils = $this->getMockBuilder('Symfony\Component\Security\Http\HttpUtils')->getMock();
|
||||
$httpUtils->expects($this->once())->method('createRequest')->will($this->returnValue(Request::create('/error')));
|
||||
|
||||
$listener = $this->createExceptionListener($this->createTokenStorage(), $this->createTrustResolver(true), $httpUtils, null, '/error');
|
||||
$listener->onKernelException($event);
|
||||
|
||||
$this->assertTrue($event->isAllowingCustomResponseCode());
|
||||
|
||||
$this->assertEquals('Unauthorized', $event->getResponse()->getContent());
|
||||
$this->assertEquals(401, $event->getResponse()->getStatusCode());
|
||||
$this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
|
||||
}
|
||||
|
||||
public function getAccessDeniedExceptionProvider()
|
||||
{
|
||||
return [
|
||||
@ -202,22 +169,6 @@ class ExceptionListenerTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
private function createTokenStorage()
|
||||
{
|
||||
$tokenStorage = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')->getMock();
|
||||
$tokenStorage->expects($this->once())->method('getToken')->will($this->returnValue($this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')->getMock()));
|
||||
|
||||
return $tokenStorage;
|
||||
}
|
||||
|
||||
private function createCustomAccessDeniedHandler(Response $response)
|
||||
{
|
||||
$accessDeniedHandler = $this->getMockBuilder('Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface')->getMock();
|
||||
$accessDeniedHandler->expects($this->once())->method('handle')->will($this->returnValue($response));
|
||||
|
||||
return $accessDeniedHandler;
|
||||
}
|
||||
|
||||
private function createEntryPoint(Response $response = null)
|
||||
{
|
||||
$entryPoint = $this->getMockBuilder('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface')->getMock();
|
||||
|
@ -314,6 +314,54 @@
|
||||
<source>This is not a valid Business Identifier Code (BIC).</source>
|
||||
<target>Ito ay hindi isang balidong Business Identifier Code (BIC).</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="82">
|
||||
<source>Error</source>
|
||||
<target>Error</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="83">
|
||||
<source>This is not a valid UUID.</source>
|
||||
<target>Ito ay hindi wastong UUID.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="84">
|
||||
<source>This value should be a multiple of {{ compared_value }}.</source>
|
||||
<target>Ang halagang ito ay dapat multiple ng {{ compared_value }}.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="85">
|
||||
<source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
|
||||
<target>Ang Business Identifier Code (BIC) na ito ay walang kaugnayan sa IBAN {{ iban }}.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="86">
|
||||
<source>This value should be valid JSON.</source>
|
||||
<target>Ang halagang ito ay dapat naka wastong JSON.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="87">
|
||||
<source>This collection should contain only unique elements.</source>
|
||||
<target>Ang mga elemento ng koleksyong ito ay dapat magkakaiba.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="88">
|
||||
<source>This value should be positive.</source>
|
||||
<target>Ang halagang ito ay dapat positibo.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="89">
|
||||
<source>This value should be either positive or zero.</source>
|
||||
<target>Ang halagang ito ay dapat positibo o zero.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="90">
|
||||
<source>This value should be negative.</source>
|
||||
<target>Ang halagang ito ay dapat negatibo.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="91">
|
||||
<source>This value should be either negative or zero.</source>
|
||||
<target>Ang halagang ito ay dapat negatibo o zero.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="92">
|
||||
<source>This value is not a valid timezone.</source>
|
||||
<target>Ang halagang ito ay hindi wastong timezone.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="93">
|
||||
<source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
|
||||
<target>Naikalat ang password na ito sa isang data breach at hindi na dapat gamitin. Mangyaring gumamit ng ibang pang password.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
|
@ -258,7 +258,11 @@ class ValidatorBuilder implements ValidatorBuilderInterface
|
||||
*/
|
||||
public function setTranslator(LegacyTranslatorInterface $translator)
|
||||
{
|
||||
$this->translator = $translator instanceof LegacyTranslatorProxy ? $translator->getTranslator() : $translator;
|
||||
$this->translator = $translator;
|
||||
|
||||
while ($this->translator instanceof LegacyTranslatorProxy) {
|
||||
$this->translator = $this->translator->getTranslator();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
@ -54,12 +54,12 @@ EOTXT;
|
||||
$expectedAttribute11 = $var->getAttribute(\NumberFormatter::GROUPING_SIZE);
|
||||
$expectedAttribute12 = $var->getAttribute(\NumberFormatter::ROUNDING_MODE);
|
||||
$expectedAttribute13 = number_format($var->getAttribute(\NumberFormatter::ROUNDING_INCREMENT), 1);
|
||||
$expectedAttribute14 = $var->getAttribute(\NumberFormatter::FORMAT_WIDTH);
|
||||
$expectedAttribute14 = $this->getDump($var->getAttribute(\NumberFormatter::FORMAT_WIDTH));
|
||||
$expectedAttribute15 = $var->getAttribute(\NumberFormatter::PADDING_POSITION);
|
||||
$expectedAttribute16 = $var->getAttribute(\NumberFormatter::SECONDARY_GROUPING_SIZE);
|
||||
$expectedAttribute17 = $var->getAttribute(\NumberFormatter::SIGNIFICANT_DIGITS_USED);
|
||||
$expectedAttribute18 = $var->getAttribute(\NumberFormatter::MIN_SIGNIFICANT_DIGITS);
|
||||
$expectedAttribute19 = $var->getAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS);
|
||||
$expectedAttribute18 = $this->getDump($var->getAttribute(\NumberFormatter::MIN_SIGNIFICANT_DIGITS));
|
||||
$expectedAttribute19 = $this->getDump($var->getAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS));
|
||||
$expectedAttribute20 = $var->getAttribute(\NumberFormatter::LENIENT_PARSE);
|
||||
|
||||
$expectedTextAttribute1 = $var->getTextAttribute(\NumberFormatter::POSITIVE_PREFIX);
|
||||
|
@ -37,7 +37,7 @@ ReflectionClass {
|
||||
%A]
|
||||
constants: array:3 [
|
||||
"IS_IMPLICIT_ABSTRACT" => 16
|
||||
"IS_EXPLICIT_ABSTRACT" => 32
|
||||
"IS_EXPLICIT_ABSTRACT" => %d
|
||||
"IS_FINAL" => %d
|
||||
]
|
||||
properties: array:%d [
|
||||
|
Reference in New Issue
Block a user