Bootstrap + Symfony : integrer un theme proprement
Bootstrap reste le framework CSS le plus utilise dans l'ecosysteme Symfony, notamment pour les interfaces d'administration, les dashboards et les applications metier. Symfony s'integre particulierement bien avec Bootstrap grace au form theming natif et a Webpack Encore. Voici comment integrer Bootstrap proprement dans un projet Symfony 7.2, en evitant les erreurs classiques.
Installation avec Webpack Encore
La methode recommandee est d'utiliser Webpack Encore, l'outil officiel Symfony pour la gestion des assets frontend. Si vous ne l'avez pas encore installe, consultez le guide complet Webpack Encore.
# Installer Webpack Encore
composer require symfony/webpack-encore-bundle
npm install
# Installer Bootstrap et ses dependances
npm install bootstrap @popperjs/core sass sass-loader
Configuration de Webpack Encore
// webpack.config.js
const Encore = require('@symfony/webpack-encore');
Encore
.setOutputPath('public/build/')
.setPublicPath('/build')
.addEntry('app', './assets/app.js')
.enableSassLoader()
.enableSourceMaps(!Encore.isProduction())
.cleanupOutputBeforeBuild()
.enableSingleRuntimeChunk()
.autoProvidejQuery() // si vous utilisez des plugins jQuery
;
module.exports = Encore.getWebpackConfig();
Importer Bootstrap dans les assets
// assets/app.js
import './styles/app.scss';
// Importer tout Bootstrap JS
import * as bootstrap from 'bootstrap';
// Ou importer uniquement les composants utilises
// import { Dropdown, Modal, Tooltip } from 'bootstrap';
// assets/styles/app.scss
// 1. Personnaliser les variables AVANT l'import Bootstrap
$primary: #2563eb;
$secondary: #64748b;
$font-family-base: 'Inter', sans-serif;
$border-radius: 0.5rem;
$enable-negative-margins: true;
// 2. Importer Bootstrap
@import '~bootstrap/scss/bootstrap';
// 3. Vos styles personnalises APRES
.navbar-brand {
font-weight: 700;
letter-spacing: -0.02em;
}
L'ordre est important : les variables doivent etre definies avant l'import de Bootstrap pour les surcharger correctement. Vos styles personnalises viennent apres pour pouvoir utiliser les mixins et variables Bootstrap.
Form Theming : Bootstrap automatique
Symfony inclut un theme de formulaire Bootstrap pret a l'emploi. Activez-le globalement :
# config/packages/twig.yaml
twig:
form_themes:
- 'bootstrap_5_layout.html.twig'
Tous vos formulaires utiliseront automatiquement les classes Bootstrap : form-control, form-label, form-check, is-invalid, invalid-feedback, etc. Le rendu des erreurs de validation est gere nativement.
{# templates/contact/index.html.twig #}
{% extends 'base.html.twig' %}
{% block body %}
Contact
{{ form_start(form, {attr: {class: 'needs-validation', novalidate: 'novalidate'}}) }}
{{ form_row(form.firstName) }}
{{ form_row(form.lastName) }}
{{ form_row(form.email) }}
{{ form_row(form.message, {attr: {rows: 6}}) }}
{{ form_end(form) }}
{% endblock %}
Le form_row() genere automatiquement le label, l'input avec form-control, et le message d'erreur avec invalid-feedback. Pour personnaliser davantage les formulaires, le guide FormType couvre toutes les options.
Personnaliser le rendu d'un champ specifique
Si le rendu par defaut ne convient pas, surchargez un bloc Twig :
{# Surcharge locale pour un formulaire specifique #}
{% form_theme form _self %}
{% block _contact_form_message_widget %}
{% endblock %}
{{ form_row(form.message) }}
Personnalisation avancee avec Sass
Bootstrap est entierement configurable via des variables Sass. Voici les personnalisations les plus utiles :
// assets/styles/_variables.scss
// Couleurs de marque
$primary: #1e40af;
$success: #059669;
$danger: #dc2626;
$warning: #d97706;
// Typographie
$font-family-base: 'Inter', system-ui, sans-serif;
$font-size-base: 1rem;
$headings-font-weight: 700;
// Espacement
$spacer: 1rem;
$grid-gutter-width: 2rem;
// Bordures
$border-radius: 0.75rem;
$border-radius-lg: 1rem;
$border-radius-sm: 0.5rem;
// Ombres
$box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);
$box-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
// Boutons
$btn-padding-y: 0.625rem;
$btn-padding-x: 1.5rem;
$btn-font-weight: 600;
Importez ce fichier de variables avant Bootstrap dans votre app.scss :
// assets/styles/app.scss
@import 'variables';
@import '~bootstrap/scss/bootstrap';
@import 'custom';
Import selectif : reduire la taille du CSS
Un import complet de Bootstrap genere environ 230 Ko de CSS non minifie. Si vous n'utilisez que la grille, les boutons et les formulaires, importez uniquement ce dont vous avez besoin :
// assets/styles/app.scss
// Fonctions et variables (obligatoires)
@import '~bootstrap/scss/functions';
@import '~bootstrap/scss/variables';
@import '~bootstrap/scss/mixins';
// Reset
@import '~bootstrap/scss/root';
@import '~bootstrap/scss/reboot';
// Composants utilises
@import '~bootstrap/scss/grid';
@import '~bootstrap/scss/containers';
@import '~bootstrap/scss/type';
@import '~bootstrap/scss/forms';
@import '~bootstrap/scss/buttons';
@import '~bootstrap/scss/navbar';
@import '~bootstrap/scss/card';
@import '~bootstrap/scss/alert';
@import '~bootstrap/scss/utilities';
@import '~bootstrap/scss/utilities/api'; // genere les classes utilitaires
Cette approche peut reduire la taille du CSS de 60 a 70 %. Le JavaScript fonctionne de la meme maniere avec les imports individuels.
Composants Twig reutilisables
Creez des composants Twig pour encapsuler les patterns Bootstrap recurrents :
{# templates/components/card.html.twig #}
{% set card_class = card_class|default('') %}
{% if image is defined %}
{% endif %}
{{ title }}
{% if subtitle is defined %}
{{ subtitle }}
{% endif %}
{{ body|raw }}
{% if link is defined %}
{{ link_text|default('En savoir plus') }}
{% endif %}
{# Utilisation #}
{% include 'components/card.html.twig' with {
title: 'Mon service',
body: 'Description du service...
',
link: '/services/dev-symfony',
link_text: 'Decouvrir',
card_class: 'shadow-sm h-100'
} %}
Grille responsive dans les templates Symfony
La grille Bootstrap s'utilise naturellement dans les templates Twig pour afficher des listes d'entites :
{# templates/post/index.html.twig #}
{% for post in posts %}
{% endfor %}
Mode sombre avec Bootstrap 5.3+
Bootstrap 5.3 supporte le mode sombre nativement via l'attribut data-bs-theme. Voici un composant Stimulus pour le basculer :
// assets/controllers/theme_controller.js
import { Controller } from '@hotwired/stimulus';
export default class extends Controller {
static values = {
default: { type: String, default: 'light' },
};
connect() {
const saved = localStorage.getItem('theme') || this.defaultValue;
this.apply(saved);
}
toggle() {
const current = document.documentElement.getAttribute('data-bs-theme');
const next = current === 'dark' ? 'light' : 'dark';
this.apply(next);
localStorage.setItem('theme', next);
}
apply(theme) {
document.documentElement.setAttribute('data-bs-theme', theme);
}
}
{# Dans le layout #}
Ce pattern utilise Stimulus via Symfony UX. L'attribut data-bs-theme est lu par Bootstrap pour appliquer les couleurs sombres sur tous les composants.
Bootstrap Icons
Installez Bootstrap Icons pour completer l'integration :
npm install bootstrap-icons
// assets/styles/app.scss
@import '~bootstrap-icons/font/bootstrap-icons.css';
{# Utilisation dans Twig #}
Envoyer un email
Valide
Bootstrap vs Tailwind vs CSS custom : quand choisir quoi ?
- Bootstrap : back-office, dashboards, formulaires complexes, equipe backend. Productivite maximale sur les patterns UI standards.
- Tailwind CSS : site vitrine design, application avec une identite visuelle forte, equipe avec un developpeur front-end dedie. Plus de flexibilite mais plus de travail initial.
- CSS custom : projets avec des contraintes de performance extremes ou une charte graphique tres specifique. Rarement justifie en 2026 sauf cas particuliers.
Pour la majorite des applications Symfony metier (CRUD, admin, intranet), Bootstrap reste le choix le plus productif. Le form theming natif fait gagner des heures de developpement.
Pour aller plus loin
L'integration Bootstrap dans Symfony est un sujet vaste. Pour la partie build, le guide Webpack Encore couvre les cas avances (code splitting, CDN, PostCSS). Pour enrichir l'experience utilisateur sans quitter Twig, explorez Symfony UX avec Stimulus et Turbo. Et pour les formulaires, le guide FormType vous montre comment tirer le maximum du form theming Bootstrap.
Besoin d'integrer un theme Bootstrap dans votre application Symfony ou de migrer vers un design system ? Contactez-moi pour en discuter. Retrouvez aussi mes tarifs et mes services.
