Symfony : – Doctrine

Doctrine est une librairie puissante qui simplifie la gestion des interactions entre une application et une base de données. En tant qu’ORM (Object-Relational Mapping), elle est intégrée nativement dans Symfony et constitue une solution privilégiée pour la manipulation des données.

ORM

Un ORM (Object-Relational Mapping) établit une correspondance entre les classes d’un langage orienté objet (comme PHP) et les tables d’une base de données relationnelle. Avec Doctrine, une fois ce mapping réalisé, vous pouvez manipuler des objets PHP comme des entités pour interagir avec les données stockées dans la base.

Avantages de l’utilisation d’un ORM comme Doctrine :

  • Abstraction : Plus besoin d’écrire des requêtes SQL pour effectuer des opérations courantes (CRUD : Create, Read, Update, Delete).
  • Gain de temps : Doctrine simplifie la gestion des relations entre les entités (one-to-one, one-to-many, many-to-many).
  • Portabilité : Compatible avec plusieurs systèmes de gestion de bases de données (MySQL, PostgreSQL, SQLite, etc.).
  • Évolutivité : Doctrine génère automatiquement le schéma des tables à partir des entités, ce qui facilite les modifications du modèle.

Architecture de Doctrine

Doctrine est constitué de plusieurs couches distinctes, chacune jouant un rôle précis dans le processus de gestion des données.

a. DBAL (Database Abstraction Layer)

La couche DBAL est responsable de la communication directe avec la base de données. Elle agit comme un pont, transmettant des requêtes et récupérant des résultats. Comparable à l’extension PHP PDO, la DBAL est une version plus avancée qui ajoute des fonctionnalités comme :

  • La gestion des transactions.
  • Le support des types de données spécifiques à Doctrine.
  • L’abstraction des requêtes SQL.

Exemple avec DBAL :

$conn = $entityManager->getConnection();
$stmt = $conn->prepare('SELECT * FROM user');
$stmt->execute();
$results = $stmt->fetchAllAssociative();
b. Entité Une entité est une classe PHP représentant une table dans la base de données. Chaque attribut d’une entité correspond à une colonne de la table, et chaque instance de cette classe représente une ligne. Caractéristiques d’une entité : Les attributs sont privés (encapsulation). Les méthodes getter et setter permettent de lire et écrire les données. Doctrine s’appuie sur ces méthodes pour gérer les interactions avec la base. Exemple d’entité : namespace App\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity() */ class User { /** @ORM\Id @ORM\GeneratedValue @ORM\Column(type="integer") */ private $id; /** @ORM\Column(type="string", length=255) */ private $name; public function getId(): ?int { return $this->id; } public function getName(): ?string { return $this->name; } public function setName(string $name): self { $this->name = $name; return $this; } } c. ORM La couche ORM se situe entre l’application et la DBAL. Son rôle est double : Convertir les données relationnelles de la DBAL en objets PHP (entités). Générer les requêtes SQL nécessaires à partir des interactions avec les entités. Exemple avec l’ORM : $user = new User(); $user->setName('John Doe'); $entityManager->persist($user); $entityManager->flush(); Dans cet exemple : Lobjet $user est préparé via la méthode persist . La méthode flush enregistre les modifications dans la base en générant et exécutant automatiquement une requête SQL. La Notion d’Entité Une entité est la base de travail avec Doctrine. Elle représente une table dans la base et permet de manipuler des données comme des objets. Structure d’une entité : Propriétés privées pour chaque colonne de la table. Annotations ou attributs PHP pour configurer le mapping entre les propriétés et les colonnes. Méthodes d’accès (getter/setter) pour interagir avec les données. Constructeur sans paramètre pour permettre l’instanciation par Doctrine. Exemple : Pour une table user avec les colonnes id et name : /** * @ORM\Entity() */ class User { /** @ORM\Id @ORM\GeneratedValue @ORM\Column(type="integer") */ private $id; /** @ORM\Column(type="string", length=255) */ private $name; public function getId(): ?int { return $this->id; } public function getName(): ?string { return $this->name; } public function setName(string $name): self { $this->name = $name; return $this; } } Interagir avec une entité : Créer un utilisateur : $user = new User(); $user->setName('Jane Doe'); $entityManager->persist($user); $entityManager->flush(); Récupérer des utilisateurs : $users = $entityManager->getRepository(User::class)->findAll(); Mettre à jour un utilisateur : $user = $entityManager->find(User::class, 1); $user->setName('John Smith'); $entityManager->flush(); Supprimer un utilisateur : $entityManager->remove($user); $entityManager->flush(); Les entités ne sont pas des services Symfony. Leur cycle de vie est géré par Doctrine, et elles ne sont pas injectées par le Service Container. Doctrine génère les schémas des bases de données à partir des entités, ce qui facilite l’évolution du modèle de données. La séparation des couches DBAL et ORM offre une grande flexibilité dans la gestion des données. Doctrine ORM Documentation Symfony - Doctrine ORM Integration Mapping in Doctrine Doctrine, en tant qu’ORM, simplifie considérablement les interactions avec les bases de données en permettant de manipuler des objets PHP plutôt que d’écrire des requêtes SQL. Grâce à son architecture modulaire et ses concepts d’entités, de DBAL et d’ORM, il constitue un outil incontournable pour tout développeur Symfony cherchant à gérer ses données de manière efficace et maintenable.
par admin4460 | Symfony
Systèmes & RéseauxVPS Exemple de Nettoyage et VérificationVPS Exemple de Nettoyage et VérificationProblème Détecté Espace disque critique : 85% d'utilisation (40GB/48GB) Application risquait de planter Site web potentiellement inaccessible VPS Ubuntu 24 avec Docker Diagnostic Étape 1 : Vérification de l'espace disque # Vérifier l'utilisation globale df -h #... 📍 Voir Plus ... DéveloppementSystèmes & Réseaux Tests, Sécurité et CI/CDTests, Sécurité et CI/CDCet article présente une stratégie pour assurer la qualité, la sécurité et le déploiement continu d'une application basée sur Laravel 11 et React 18. La stratégie s'articule autour de quatre piliers fondamentaux : Tests complets et modernes : Une approche... 📍 Voir Plus ... DéveloppementSystèmes & Réseaux Déploiement étape par étape d’une application web sur O2SwitchDéploiement étape par étape d’une application web sur O2SwitchJe vais vous expliquer de façon détaillée comment déployer votre application développée localement (Laravel 11 + React 19 + Axios + MySQL + Bootstrap) sur un hébergement O2Switch. Suivez ces étapes dans l'ordre pour un déploiement réussi. Étape 1: Préparation de... 📍 Voir Plus ... 📍 VOIR PLUS ... 📍
Dashboard Catégories Articles Apple Linux Windows Systèmes & Réseaux Systèmes & Bureautique Java JavaScript Laravel Symfony React JS HTML et CSS PHP SQL Data Cybersécurité Bug Développement & Codage Angular Gestion de projet L’intelligence artificielle Référencement Management E-commerce CMS LMS Design Pédagogie & Formation Pages GitHub ai Aide-mémoire AI CMS CMS LMS Codes Couleurs Concepteur Développeur Agile Architecture Base de données Cybersécurité Laravel Front Back Full Stack Angular C# Data Développement DevOps HTML et CSS Java JavaScript Liens Links المعلوميات و الإتصالات Map Design UX / UI Lexique Modéles Comment Clavier Virtuel Banques d’images Banques de sons Banques de videos Communications Clients Création mobile Bureautique Apple Infos Concepteur Modèles e-mails Paiements Utilitaires News Blog
© MyCreaNet 2025 Mentions légales Plan du site Gestion des cookies Accessibilité Nom d'utilisateur Mot de passe Mot de passe oublié? Se connecter SuivreSuivreSuivreSuivreSuivre window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-L58BSN4YKD');
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/Divi\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap:before, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper:before { content: "\45"; font-size: 27px; color: #ccffcc; font-family: ETModules; cursor: pointer; width: 28px; height: 27px; border-radius: 3px; padding-top: 1px; background-color: rgb(255, 255, 255, 0.2) !important; } .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-fb-form__group:nth-of-type(4) { display: none; } jQuery(document).ready(function($) { $(document).on('click', '.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper', function(event) { if (event.target !== event.currentTarget) { return; // Exit the function if the click is on a child element } var firstEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(0)?.CodeMirror; if (!firstEditor) { return; } $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] textarea[name="code_to_render"]').click(); // Enable hidden codemirror var secondEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(1)?.CodeMirror; if (!secondEditor) { return; } var content = firstEditor.getValue(); // Add a random nonce as the first line of content to prevent caching var nonce = Math.random().toString(36).substring(2, 15); content = '/* nonce:' + nonce + ' */\n' + content; secondEditor.setValue(content); }); }); (function() { var file = ["https:\/\/mycreanet.fr\/wp-content\/et-cache\/4966\/et-divi-dynamic-tb-7323-tb-7217-tb-6415-4966-late.css"]; var handle = document.getElementById('divi-style-inline-inline-css'); var location = handle.parentNode; if (0===document.querySelectorAll('link[href="' + file + '"]').length) { var link = document.createElement('link'); link.rel = 'stylesheet'; link.id = 'et-dynamic-late-css'; link.href = file; location.insertBefore(link, handle.nextSibling); } })(); /* <![CDATA[ */ var tocplus = {"smooth_scroll":"1","visibility_show":"Afficher","visibility_hide":"Masquer","width":"Auto"}; /* ]]> */ /* <![CDATA[ */ var DIVI = {"item_count":"%d Item","items_count":"%d Items"}; var et_builder_utils_params = {"condition":{"diviTheme":true,"extraTheme":false},"scrollLocations":["app","top"],"builderScrollLocations":{"desktop":"app","tablet":"app","phone":"app"},"onloadScrollLocation":"app","builderType":"fe"}; var et_frontend_scripts = {"builderCssContainerPrefix":"#et-boc","builderCssLayoutPrefix":"#et-boc .et-l"}; var et_pb_custom = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/images","builder_images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/images","et_frontend_nonce":"6c38216ff5","subscription_failed":"Veuillez v\u00e9rifier les champs ci-dessous pour vous assurer que vous avez entr\u00e9 les informations correctes.","et_ab_log_nonce":"c9ec72ba9c","fill_message":"S'il vous pla\u00eet, remplissez les champs suivants:","contact_error_message":"Veuillez corriger les erreurs suivantes :","invalid":"E-mail non valide","captcha":"Captcha","prev":"Pr\u00e9c\u00e9dent","previous":"Pr\u00e9c\u00e9dente","next":"Prochaine","wrong_captcha":"Vous avez entr\u00e9 le mauvais num\u00e9ro dans le captcha.","wrong_checkbox":"Case \u00e0 cocher","ignore_waypoints":"no","is_divi_theme_used":"1","widget_search_selector":".widget_search","ab_tests":[],"is_ab_testing_active":"","page_id":"4966","unique_test_id":"","ab_bounce_rate":"5","is_cache_plugin_active":"no","is_shortcode_tracking":"","tinymce_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/frontend-builder\/assets\/vendors","accent_color":"#006666","waypoints_options":[]}; var et_pb_box_shadow_elements = []; /* ]]> */ /* <![CDATA[ */ var DiviBlogExtrasFrontendData = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","ajax_nonce":"4ae0c6aabc","et_theme_accent_color":"#006666"}; /* ]]> */ /* <![CDATA[ */ var mejsL10n = {"language":"fr","strings":{"mejs.download-file":"T\u00e9l\u00e9charger le fichier","mejs.install-flash":"Vous utilisez un navigateur qui n\u2019a pas le lecteur Flash activ\u00e9 ou install\u00e9. Veuillez activer votre extension Flash ou t\u00e9l\u00e9charger la derni\u00e8re version \u00e0 partir de cette adresse\u00a0: https:\/\/get.adobe.com\/flashplayer\/","mejs.fullscreen":"Plein \u00e9cran","mejs.play":"Lecture","mejs.pause":"Pause","mejs.time-slider":"Curseur de temps","mejs.time-help-text":"Utilisez les fl\u00e8ches droite\/gauche pour avancer d\u2019une seconde, haut\/bas pour avancer de dix secondes.","mejs.live-broadcast":"\u00c9mission en direct","mejs.volume-help-text":"Utilisez les fl\u00e8ches haut\/bas pour augmenter ou diminuer le volume.","mejs.unmute":"R\u00e9activer le son","mejs.mute":"Muet","mejs.volume-slider":"Curseur de volume","mejs.video-player":"Lecteur vid\u00e9o","mejs.audio-player":"Lecteur audio","mejs.captions-subtitles":"L\u00e9gendes\/Sous-titres","mejs.captions-chapters":"Chapitres","mejs.none":"Aucun","mejs.afrikaans":"Afrikaans","mejs.albanian":"Albanais","mejs.arabic":"Arabe","mejs.belarusian":"Bi\u00e9lorusse","mejs.bulgarian":"Bulgare","mejs.catalan":"Catalan","mejs.chinese":"Chinois","mejs.chinese-simplified":"Chinois (simplifi\u00e9)","mejs.chinese-traditional":"Chinois (traditionnel)","mejs.croatian":"Croate","mejs.czech":"Tch\u00e8que","mejs.danish":"Danois","mejs.dutch":"N\u00e9erlandais","mejs.english":"Anglais","mejs.estonian":"Estonien","mejs.filipino":"Filipino","mejs.finnish":"Finnois","mejs.french":"Fran\u00e7ais","mejs.galician":"Galicien","mejs.german":"Allemand","mejs.greek":"Grec","mejs.haitian-creole":"Cr\u00e9ole ha\u00eftien","mejs.hebrew":"H\u00e9breu","mejs.hindi":"Hindi","mejs.hungarian":"Hongrois","mejs.icelandic":"Islandais","mejs.indonesian":"Indon\u00e9sien","mejs.irish":"Irlandais","mejs.italian":"Italien","mejs.japanese":"Japonais","mejs.korean":"Cor\u00e9en","mejs.latvian":"Letton","mejs.lithuanian":"Lituanien","mejs.macedonian":"Mac\u00e9donien","mejs.malay":"Malais","mejs.maltese":"Maltais","mejs.norwegian":"Norv\u00e9gien","mejs.persian":"Perse","mejs.polish":"Polonais","mejs.portuguese":"Portugais","mejs.romanian":"Roumain","mejs.russian":"Russe","mejs.serbian":"Serbe","mejs.slovak":"Slovaque","mejs.slovenian":"Slov\u00e9nien","mejs.spanish":"Espagnol","mejs.swahili":"Swahili","mejs.swedish":"Su\u00e9dois","mejs.tagalog":"Tagalog","mejs.thai":"Thai","mejs.turkish":"Turc","mejs.ukrainian":"Ukrainien","mejs.vietnamese":"Vietnamien","mejs.welsh":"Ga\u00e9lique","mejs.yiddish":"Yiddish"}}; /* ]]> */ /* <![CDATA[ */ var _wpmejsSettings = {"pluginPath":"\/wp-includes\/js\/mediaelement\/","classPrefix":"mejs-","stretching":"responsive","audioShortcodeLibrary":"mediaelement","videoShortcodeLibrary":"mediaelement"}; /* ]]> */ .wptpa_song_infrmtn, .wptpa_currenttime, .wptpa_duration, .wptpa_song, .wptpa_dwn_cnt, .wptpa_play_cnt, .wptpa_num, .wptpa_h2, .wptpa_ads{ font-family: 'Roboto', sans-serif; } .wptpa_player { background: #FFFFFF !important; } .wptpa_heading:before, .wptpa_heading:after { background: #000000 !important; } .wptpa_song_infrmtn { color: #000000 !important; } .wptpa_btn .wptpa_icon { fill: #555555; } .wptpa_btn.actv .wptpa_icon, .wptpa_btn:hover .wptpa_icon{ fill: #00D084; } .wptpa_btn:before{ background: #555555 !important; } .wptpa_player .wptpa_seek, .wptpa_player .wptpa_loader { background: #FFDA48 !important; } .wptpa_player .wptpa_seek span, .wptpa_progress { background: #CF2E2E !important; } .wptpa_ads, .wptpa_currenttime, .wptpa_duration { color: #FFFFFF !important; } .wptpa_volume_seek:before { background: #FFDA48 !important; } .wptpa_volume_value { background: #CF2E2E !important; } .wptpa_pllst_itm { border-bottom: 1px solid rgba(255, 255, 255, 0.25) !important; background: #23C5A3 !important; color: #000000 !important; } .wptpa_pllst_itm.crrnt, .wptpa_pllst_itm:hover { background: #FFDA48 !important; color: #000000 !important; } .wptpa_pllst_itm:last-child { border-bottom: 0px solid rgba(255, 255, 255, 0.25) !important; } .wptpa_bars, .wptpa_bars:before, .wptpa_bars:after{ background: #000000 !important; } .wptpa_line { border-color: #000000 !important; } .wptpa_pllst_itm .wptpa_icon { fill: #000000; } .wptpa_dwn_cnt, .wptpa_play_cnt { color: #000000 !important; } .wptpa_scroll_bar { background: #000000 !important; }