diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig
index 952ef3aec1ec9..e821ac9c5adbd 100644
--- a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig
+++ b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig
@@ -114,6 +114,16 @@
{%- endblock percent_widget %}
+{% block file_widget -%}
+
+ <{{ element|default('div') }} class="custom-file">
+ {%- set type = type|default('file') -%}
+ {{- block('form_widget_simple') -}}
+
+ {{ element|default('div') }}>
+
+{% endblock %}
+
{% block form_widget_simple -%}
{% if type is not defined or type != 'hidden' %}
{%- set attr = attr|merge({class: (attr.class|default('') ~ (type|default('') == 'file' ? ' custom-file-input' : ' form-control'))|trim}) -%}
@@ -186,8 +196,6 @@
{%- if compound is defined and compound -%}
{%- set element = 'legend' -%}
{%- set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' col-form-label')|trim}) -%}
- {% elseif type is defined and type == 'file' %}
- {%- set label_attr = label_attr|merge({for: id, class: (label_attr.class|default('') ~ ' custom-file-label')|trim}) -%}
{%- else -%}
{%- set label_attr = label_attr|merge({for: id}) -%}
{%- endif -%}
@@ -269,15 +277,6 @@
{{ element|default('div') }}>
{%- endblock form_row %}
-{% block file_row -%}
-
- <{{ element|default('div') }} class="custom-file">
- {{- form_widget(form) -}}
- {{- form_label(form) -}}
- {{ element|default('div') }}>
-
-{% endblock %}
-
{# Errors #}
{% block form_errors -%}
diff --git a/src/Symfony/Component/Form/Tests/AbstractBootstrap4LayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractBootstrap4LayoutTest.php
index 28b3111c4af07..a3fc43a49f280 100644
--- a/src/Symfony/Component/Form/Tests/AbstractBootstrap4LayoutTest.php
+++ b/src/Symfony/Component/Form/Tests/AbstractBootstrap4LayoutTest.php
@@ -940,9 +940,20 @@ public function testFile()
{
$form = $this->factory->createNamed('name', FileType::class);
- $this->assertWidgetMatchesXpath($form->createView(), array('attr' => array('class' => 'my&class form-control-file')),
-'/input
- [@type="file"]
+ $this->assertWidgetMatchesXpath($form->createView(), array('id' => 'nope', 'attr' => array('class' => 'my&class form-control-file')),
+'/div
+ [@class="form-group"]
+ [
+ ./div
+ [@class="custom-file"]
+ [
+ ./input
+ [@type="file"]
+ [@name="name"]
+ /following-sibling::label
+ [@for="name"]
+ ]
+ ]
'
);
}