8000 Merge branch '3.4' into 4.0 · symfony/symfony@c7ab3a9 · GitHub
[go: up one dir, main page]

Skip to content 10000

Commit c7ab3a9

Browse files
author
Robin Chalas
committed
Merge branch '3.4' into 4.0
* 3.4: [Intl] Fixed the broken link Fix typo Fix typo Fixed issue #25985 Don't show wanna-be-private services as public in debug:container [Routing] Fix trailing slash redirection for non-safe verbs [DI] Fix tracking of source class changes for lazy-proxies Proxy class names should be deterministic and independent of spl_object_hash() which is somewhat random [Debug] Fix bad registration of exception handler, leading to mem leak [Form] Fixed empty data on expanded ChoiceType and FileType collect extension information as late as possible
2 parents e341b27 + 9f64a0f commit c7ab3a9

33 files changed

+452
-136
lines changed

src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public function getProxyCode(Definition $definition)
102102
*/
103103
private function getProxyClassName(Definition $definition)
104104
{
105-
return preg_replace('/^.*\\\\/', '', $definition->getClass()).'_'.substr(hash('sha256', spl_object_hash($definition).$this->salt), -7);
105+
return preg_replace('/^.*\\\\/', '', $definition->getClass()).'_'.substr(hash('sha256', $definition->getClass().$this->salt), -7);
106106
}
107107

108108
/**

src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4LayoutTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class FormExtensionBootstrap4LayoutTest extends AbstractBootstrap4LayoutTest
2929
{
3030
use RuntimeLoaderProvider;
3131
/**
32-
* @var FormRenderer;
32+
* @var FormRenderer
3333
*/
3434
private $renderer;
3535

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,11 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
113113
$service = $this->resolveServiceDefinition($builder, $serviceId);
114114

115115
if ($service instanceof Alias) {
116-
if ($showPrivate || $service->isPublic()) {
116+
if ($showPrivate || ($service->isPublic() && !$service->isPrivate())) {
117117
$data['aliases'][$serviceId] = $this->getContainerAliasData($service);
118118
}
119119
} elseif ($service instanceof Definition) {
120-
if (($showPrivate || $service->isPublic())) {
120+
if (($showPrivate || ($service->isPublic() && !$service->isPrivate()))) {
121121
$data['definitions'][$serviceId] = $this->getContainerDefinitionData($service, $omitTags, $showArguments);
122122
}
123123
} else {
@@ -211,7 +211,7 @@ private function getContainerDefinitionData(Definition $definition, bool $omitTa
211211
{
212212
$data = array(
213213
'class' => (string) $definition->getClass(),
214-
'public' => $definition->isPublic(),
214+
'public' => $definition->isPublic() && !$definition->isPrivate(),
215215
'synthetic' => $definition->isSynthetic(),
216216
'lazy' => $definition->isLazy(),
217217
'shared' => $definition->isShared(),
@@ -265,7 +265,7 @@ private function getContainerAliasData(Alias $alias): array
265265
{
266266
return array(
267267
'service' => (string) $alias,
268-
'public' => $alias->isPublic(),
268+
'public' => $alias->isPublic() && !$alias->isPrivate(),
269269
);
270270
}
271271

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,11 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
139139
$service = $this->resolveServiceDefinition($builder, $serviceId);
140140

141141
if ($service instanceof Alias) {
142-
if ($showPrivate || $service->isPublic()) {
142+
if ($showPrivate || ($service->isPublic() && !$service->isPrivate())) {
143143
$services['aliases'][$serviceId] = $service;
144144
}
145145
} elseif ($service instanceof Definition) {
146-
if (($showPrivate || $service->isPublic())) {
146+
if (($showPrivate || ($service->isPublic() && !$service->isPrivate()))) {
147147
$services['definitions'][$serviceId] = $service;
148148
}
149149
} else {
@@ -182,7 +182,7 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
182182
protected function describeContainerDefinition(Definition $definition, array $options = array())
183183
{
184184
$output = '- Class: `'.$definition->getClass().'`'
185-
."\n".'- Public: '.($definition->isPublic() ? 'yes' : 'no')
185+
."\n".'- Public: '.($definition->isPublic() && !$definition->isPrivate() ? 'yes' : 'no')
186186
."\n".'- Synthetic: '.($definition->isSynthetic() ? 'yes' : 'no')
187187
."\n".'- Lazy: '.($definition->isLazy() ? 'yes' : 'no')
188188
."\n".'- Shared: '.($definition->isShared() ? 'yes' : 'no')
@@ -239,7 +239,7 @@ protected function describeContainerDefinition(Definition $definition, array $op
239239
protected function describeContainerAlias(Alias $alias, array $options = array(), ContainerBuilder $builder = null)
240240
{
241241
$output = '- Service: `'.$alias.'`'
242-
."\n".'- Public: '.($alias->isPublic() ? 'yes' : 'no');
242+
."\n".'- Public: '.($alias->isPublic() && !$alias->isPrivate() ? 'yes' : 'no');
243243

244244
if (!isset($options['id'])) {
245245
return $this->write($output);

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
194194
$definition = $this->resolveServiceDefinition($builder, $serviceId);
195195
if ($definition instanceof Definition) {
196196
// filter out private services unless shown explicitly
197-
if (!$showPrivate && !$definition->isPublic()) {
197+
if (!$showPrivate && (!$definition->isPublic() || $definition->isPrivate())) {
198198
unset($serviceIds[$key]);
199199
continue;
200200
}
@@ -212,7 +212,7 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
212212
}
213213
}
214214
} elseif ($definition instanceof Alias) {
215-
if (!$showPrivate && !$definition->isPublic()) {
215+
if (!$showPrivate && (!$definition->isPublic() || $definition->isPrivate())) {
216216
unset($serviceIds[$key]);
217217
continue;
218218
}
@@ -302,7 +302,7 @@ protected function describeContainerDefinition(Definition $definition, array $op
302302
$tableRows[] = array('Calls', implode(', ', $callInformation));
303303
}
304304

305-
$tableRows[] = array('Public', $definition->isPublic() ? 'yes' : 'no');
305+
$tableRows[] = array('Public', $definition->isPublic() && !$definition->isPrivate() ? 'yes' : 'no');
306306
$tableRows[] = array('Synthetic', $definition->isSynthetic() ? 'yes' : 'no');
307307
$tableRows[] = array('Lazy', $definition->isLazy() ? 'yes' : 'no');
308308
$tableRows[] = array('Shared', $definition->isShared() ? 'yes' : 'no');

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ private function getContainerServicesDocument(ContainerBuilder $builder, string
283283
foreach ($this->sortServiceIds($serviceIds) as $serviceId) {
284284
$service = $this->resolveServiceDefinition($builder, $serviceId);
285285

286-
if (($service instanceof Definition || $service instanceof Alias) && !($showPrivate || $service->isPublic())) {
286+
if (($service instanceof Definition || $service instanceof Alias) && !($showPrivate || ($service->isPublic() && !$service->isPrivate()))) {
287287
continue;
288288
}
289289

@@ -322,7 +322,7 @@ private function getContainerDefinitionDocument(Definition $definition, string $
322322
}
323323
}
324324

325-
$serviceXML->setAttribute('public', $definition->isPublic() ? 'true' : 'false');
325+
$serviceXML->setAttribute('public', $definition->isPublic() && !$definition->isPrivate() ? 'true' : 'false');
326326
$serviceXML->setAttribute('synthetic', $definition->isSynthetic() ? 'true' : 'false');
327327
$serviceXML->setAttribute('lazy', $definition->isLazy() ? 'true' : 'false');
328328
$serviceXML->setAttribute('shared', $definition->isShared() ? 'true' : 'false');
@@ -421,7 +421,7 @@ private function getContainerAliasDocument(Alias $alias, string $id = null): \DO
421421
}
422422

423423
$aliasXML->setAttribute('service', (string) $alias);
424-
$aliasXML->setAttribute('public', $alias->isPublic() ? 'true' : 'false');
424+
$aliasXML->setAttribute('public', $alias->isPublic() && !$alias->isPrivate() ? 'true' : 'false');
425425

426426
return $dom;
427427
}

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_arguments.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"%parameter%",
1818
{
1919
"class": "inline_service",
20-
"public": true,
20+
"public": false,
2121
"synthetic": false,
2222
"lazy": false,
2323
"shared": true,
@@ -39,7 +39,7 @@
3939
},
4040
{
4141
"class": "inline_service",
42-
"public": true,
42+
"public": false,
4343
"synthetic": false,
4444
"lazy": false,
4545
"shared": true,

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_arguments.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<argument type="service" id="definition2"/>
77
<argument>%parameter%</argument>
88
<argument>
9-
<definition class="inline_service" public="true" synthetic="false" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file="">
9+
<definition class="inline_service" public="false" synthetic="false" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file="">
1010
<argument>arg1</argument>
1111
<argument>arg2</argument>
1212
</definition>
@@ -15,7 +15,7 @@
1515
<argument>foo</argument>
1616
<argument type="service" id="definition2"/>
1717
<argument>
18-
<definition class="inline_service" public="true" synthetic="false" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file=""/>
18+
<definition class="inline_service" public="false" synthetic="false" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file=""/>
1919
</argument>
2020
</argument>
2121
<argument type="iterator">

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_1.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"%parameter%",
1616
{
1717
"class": "inline_service",
18-
"public": true,
18+
"public": false,
1919
"synthetic": false,
2020
"lazy": false,
2121
"shared": true,
@@ -37,7 +37,7 @@
3737
},
3838
{
3939
"class": "inline_service",
40-
"public": true,
40+
"public": false,
4141
"synthetic": false,
4242
"lazy": false,
4343
"shared": true,

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_arguments_1.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<argument type="service" id="definition2"/>
55
<argument>%parameter%</argument>
66
<argument>
7-
<definition class="inline_service" public="true" synthetic="false" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file="">
7+
<definition class="inline_service" public="false" synthetic="false" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file="">
88
<argument>arg1</argument>
99
<argument>arg2</argument>
1010
</definition>
@@ -13,7 +13,7 @@
1313
<argument>foo</argument>
1414
<argument type="service" id="definition2"/>
1515
<argument>
16-
<definition class="inline_service" public="true" synthetic="false" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file=""/>
16+
<definition class="inline_service" public="false" synthetic="false" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file=""/>
1717
</argument>
1818
</argument>
1919
<argument type="iterator">

src/Symfony/Component/Debug/DebugClassLoader.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public function loadClass($class)
140140
if ($this->isFinder && !isset($this->loaded[$class])) {
141141
$this->loaded[$class] = true;
142142
if ($file = $this->classLoader[0]->findFile($class) ?: false) {
143-
$wasCached = \function_exists('opcache_is_script_cached') && opcache_is_script_cached($file);
143+
$wasCached = \function_exists('opcache_is_script_cached') && @opcache_is_script_cached($file);
144144

145145
require $file;
146146

src/Symfony/Component/Debug/ErrorHandler.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,20 @@ public static function register(self $handler = null, $replace = true)
133133
}
134134
if (!$replace && $prev) {
135135
restore_error_handler();
136+
$handlerIsRegistered = is_array($prev) && $handler === $prev[0];
137+
} else {
138+
$handlerIsRegistered = true;
136139
}
137-
if (is_array($prev = set_exception_handler(array($handler, 'handleException'))) && $prev[0] === $handler) {
140+
if (is_array($prev = set_exception_handler(array($handler, 'handleException'))) && $prev[0] instanceof self) {
138141
restore_exception_handler();
142+
if (!$handlerIsRegistered) {
143+
$handler = $prev[0];
144+
} elseif ($handler !== $prev[0] && $replace) {
145+
set_exception_handler(array($handler, 'handleException'));
146+
$p = $prev[0]->setExceptionHandler(null);
147+
$handler->setExceptionHandler($p);
148+
$prev[0]->setExceptionHandler($p);
149+
}
139150
} else {
140151
$handler->setExceptionHandler($prev);
141152
}

src/Symfony/Component/Debug/Tests/ErrorHandlerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function testRegister()
3535

3636
$newHandler = new ErrorHandler();
3737

38-
$this->assertSame($newHandler, ErrorHandler::register($newHandler, false));
38+
$this->assertSame($handler, ErrorHandler::register($newHandler, false));
3939
$h = set_error_handler('var_dump');
4040
restore_error_handler();
4141
$this->assertSame(array($handler, 'handleError'), $h);

src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,8 @@ private function generateProxyClasses()
399399
if (!$proxyDumper->isProxyCandidate($definition)) {
400400
continue;
401401
}
402+
// register class' reflector for resource tracking
403+
$this->container->getReflectionClass($definition->getClass());
402404
$proxyCode = "\n".$proxyDumper->getProxyCode($definition);
403405
if ($strip) {
404406
$proxyCode = "<?php\n".$proxyCode;
@@ -970,10 +972,10 @@ protected function load(\$file, \$lazyLoad = true)
970972
}
971973
$code .= <<<EOF
972974
973-
protected function createProxy(\$class, \Closure \$factory)
974-
{
975-
{$proxyLoader}return \$factory();
976-
}
975+
protected function createProxy(\$class, \Closure \$factory)
976+
{
977+
{$proxyLoader}return \$factory();
978+
}
977979
978980
EOF;
979981
break;

src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
use Symfony\Component\Form\Extension\Core\EventListener\MergeCollectionListener;
3232
use Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer;
3333
use Symfony\Component\Form\Extension\Core\DataTransformer\ChoicesToValuesTransformer;
34-
use Symfony\Component\Form\Util\FormUtil;
3534
use Symfony\Component\OptionsResolver\Options;
3635
use Symfony\Component\OptionsResolver\OptionsResolver;
3736

@@ -87,12 +86,12 @@ public function buildForm(FormBuilderInterface $builder, array $options)
8786
$form = $event->getForm();
8887
$data = $event->getData();
8988

89+
// Since the type always use mapper an empty array will not be
90+
// considered as empty in Form::submit(), we need to evaluate
91+
// empty data here so its value is submitted to sub forms
9092
if (null === $data) {
9193
$emptyData = $form->getConfig()->getEmptyData();
92-
93-
if (false === FormUtil::isEmpty($emptyData) && array() !== $emptyData) {
94-
$data = is_callable($emptyData) ? call_user_func($emptyData, $form, $data) : $emptyData;
95-
}
94+
$data = $emptyData instanceof \Closure ? $emptyData($form, $data) : $emptyData;
9695
}
9796

9897
// Convert the submitted data to a string, if scalar, before

src/Symfony/Component/Form/Extension/Core/Type/FileType.php

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ class FileType extends AbstractType
2727
*/
2828
public function buildForm(FormBuilderInterface $builder, array $options)
2929
{
30+
// Ensure that submitted data is always an uploaded file or an array of some
3031
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($options) {
3132
$form = $event->getForm();
3233
$requestHandler = $form->getConfig()->getRequestHandler();
33-
$data = null;
3434

3535
if ($options['multiple']) {
3636
$data = array();
@@ -46,19 +46,16 @@ public function buildForm(FormBuilderInterface $builder, array $options)
4646
}
4747
}
4848

49-
// submitted data for an input file (not required) without choosing any file
50-
if (array(null) === $data || array() === $data) {
49+
// Since the array is never considered empty in the view data format
50+
// on submission, we need to evaluate the configured empty data here
51+
if (array() === $data) {
5152
$emptyData = $form->getConfig()->getEmptyData();
52-
53-
$data = is_callable($emptyData) ? call_user_func($emptyData, $form, $data) : $emptyData;
53+
$data = $emptyData instanceof \Closure ? $emptyData($form, $data) : $emptyData;
5454
}
5555

5656
$event->setData($data);
5757
} elseif (!$requestHandler->isFileUpload($event->getData())) {
58-
$emptyData = $form->getConfig()->getEmptyData();
59-
60-
$data = is_callable($emptyData) ? call_user_func($emptyData, $form, $data) : $emptyData;
61-
$event->setData($data);
58+
$event->setData(null);
6259
}
6360
});
6461
}

0 commit comments

Comments
 (0)
0