CINXE.COM
The EventDispatcher Component (Symfony Docs)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="robots" content="index, follow, all" /> <meta name="Author" content="Symfony" /> <meta name="color-scheme" content="light dark"> <meta name="view-transition" content="same-origin" /> <meta name="description" content="The EventDispatcher component provides tools that allow your application components to communicate with each other by dispatching events and listening to them. Introduction Object-oriented code has …"> <meta name="Keywords" content="symfony3, symfony2, symfony, project, framework, php, php5, php7, php8, open-source, components, symphony, symfony framework, symfony tutorial" /> <link rel="preconnect" href="https://connect.symfony.com"> <title>The EventDispatcher Component (Symfony Docs)</title> <link rel="canonical" href="https://symfony.com/doc/current/components/event_dispatcher.html" /> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono&display=swap" rel="stylesheet"> <link rel="search" type="application/opensearchdescription+xml" href="https://symfony.com/opensearch/documentation.xml" title="Symfony documentation" /> <link rel="stylesheet" href="/assets/vendor/bootstrap/dist/css/bootstrap.min-1712f0378f8675ca7cd423d6262fcccf.css"> <link rel="stylesheet" href="/assets/styles/color-palette-d0d7a9d5fc86e4b1e9ad91ec0c957a96.css"> <link rel="stylesheet" href="/assets/styles/app-39ad25b073804b5438d03471928d0b16.css"> <link rel="stylesheet" href="/assets/styles/ui-components-155eb1e4e796922e265a182e612ed047.css"> <link rel="stylesheet" href="/assets/@symfony/ux-live-component/live.min-5108f988fb2a3dbb292d6feebc9db7e8.css"> <link rel="stylesheet" href="/assets/styles/search-42da4f901c7d6eabaf3c8671eb7664cf.css"> <link rel="stylesheet" href="/assets/styles/doc-18b41f70c1a0fecfc75a0b1dbb868dc0.css"> <link rel="stylesheet" href="/assets/styles/code-14f7094c46fcc117c0276b407fbada0f.css"> <link rel="stylesheet" href="/assets/styles/terminal_window-fbcf5e4dfdb661df120a5f5e2f2d2083.css"> <script type="importmap" data-turbo-track="reload"> { "imports": { "app": "/assets/app-8a87453761810fb014e976bf960715d7.js", "bootstrap/dist/css/bootstrap.min.css": "data:application/javascript,", "bootstrap/js/src/offcanvas": "/assets/vendor/bootstrap/js/src/offcanvas-6e548788bdb299ccf15bad01f85a1c4e.js", "/assets/styles/color-palette.css": "data:application/javascript,", "/assets/styles/app.css": "data:application/javascript,", "/assets/styles/ui-components.css": "data:application/javascript,", "/assets/stimulus.js": "/assets/stimulus-97656ab68e522ab9732b853e32a2116f.js", "@symfony/stimulus-bundle": "/assets/@symfony/stimulus-bundle/loader-870999a02e9fc147c034d522826ea70d.js", "@hotwired/stimulus": "/assets/vendor/@hotwired/stimulus/stimulus.index-b5b1d00e42695b8959b4a1e94e3bc92a.js", "/assets/@symfony/stimulus-bundle/controllers.js": "/assets/@symfony/stimulus-bundle/controllers-30ef92e440b067edafb440f89903311e.js", "/assets/@symfony/ux-live-component/live_controller.js": "/assets/@symfony/ux-live-component/live_controller-b4fdb1f53d5a5f813f85327cceb706b8.js", "/assets/@symfony/ux-live-component/live.min.css": "data:application/javascript,", "/assets/controllers/eventsmap_controller.js": "/assets/controllers/eventsmap_controller-dec85c248dc518bcca1ff8c1772842bc.js", "search": "/assets/search-04960a6f9bd1902ecc44ef024e74ecb9.js", "/assets/styles/search.css": "data:application/javascript,", "mousetrap": "/assets/vendor/mousetrap/mousetrap.index-2fcbabba04c2773c43d7b248b7bfcc5e.js", "doc": "/assets/doc-f53df194d5b1babeef5401af8562c6af.js", "/assets/styles/doc.css": "data:application/javascript,", "/assets/code.js": "/assets/code-5fce8b30c71ee457fcb7e2630873c57e.js", "/assets/styles/code.css": "data:application/javascript,", "/assets/styles/terminal_window.css": "data:application/javascript,", "new-home": "/assets/new-home-9a08d54a40d4a2fbb00487afc11859af.js", "/assets/styles/new-home.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Fnew-home-30a9da07f1ac1f13638453adae0c8ede.css%22%7D%29%29", "admin-bundles": "/assets/admin-bundles-ff6540dd6bb0d162e8fd444b0c404fea.js", "admin-blog": "/assets/admin-blog-a64407de34fbdd1ac8c240b95f6cbdcd.js", "/assets/@symfony/ux-leaflet-map/map_controller.js": "/assets/@symfony/ux-leaflet-map/map_controller-975755623ba9069450e62093d97cea8f.js", "terminal-recording-player": "/assets/asciinema-player-4aaff97af7e331a12fb59d2752290c4d.js", "backers": "/assets/backers-8abb46ccd02a5fbd206198fcd2c9f297.js", "/assets/styles/backers.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Fbackers-bcb27fa37219d1ba529093e1479b5a19.css%22%7D%29%29", "blog": "/assets/blog-770e3fee93dddddd01dac29b396d3383.js", "/assets/styles/blog.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Fblog-cad297648479c9b81fe847ad0bdf657d.css%22%7D%29%29", "cloud": "/assets/cloud-e761264af9ecf3b01ad5d8deb5e43ad5.js", "/assets/styles/cloud.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Fcloud-ece740794b00d30e70c83763358dc8ad.css%22%7D%29%29", "code": "/assets/code-5fce8b30c71ee457fcb7e2630873c57e.js", "components": "/assets/components-c0eda134e831efcfe777f1b2abcd9c4e.js", "/assets/styles/components.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Fcomponents-610c937560331814d9ddbc0d7e2c5fb3.css%22%7D%29%29", "components-downloads": "/assets/components-downloads-899b46584825ee6e9d0a168305dda680.js", "/assets/styles/components-downloads.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Fcomponents-downloads-ce0cd3bd06382f1b5c2900a9b0643329.css%22%7D%29%29", "download": "/assets/download-a62ed9c2100a867a69b0768dce5aa27b.js", "/assets/styles/download.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Fdownload-53c1d7854a73633d8e350387f980bb96.css%22%7D%29%29", "home": "/assets/home-10e0171d98f18dd5c029ff7bf1e272c6.js", "/assets/styles/home.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Fhome-7f88a24d2c54119eca4a3c47aaf482ac.css%22%7D%29%29", "jobs": "/assets/jobs-be103937b00f2d766b914ddead1b381b.js", "/assets/styles/jobs.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Fjobs-93b54b3ece823ef64e87f7cc5733340e.css%22%7D%29%29", "legacy": "/assets/legacy-f0a43a9e33b14a100a510cae76a194f6.js", "/assets/styles/legacy.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Flegacy-66528d42bff9478c9d5fef1226c8366d.css%22%7D%29%29", "releases": "/assets/releases-0fb630489a14d353cc90a5f15f4546eb.js", "/assets/styles/releases.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fstyles%2Freleases-2190108805c62f78be931070b1b36bad.css%22%7D%29%29", "support": "/assets/support-3d2321b292a7d005102aa200f6d974ca.js", "@popperjs/core": "/assets/vendor/@popperjs/core/core.index-ceb5b6c0f9e1d3f6c78ef733facfdcda.js", "sortablejs": "/assets/vendor/sortablejs/sortablejs.index-fae068bf1dd93b9616d070d86b7c859d.js", "tom-select": "/assets/vendor/tom-select/tom-select.index-c0036889cf3e94dade1e56c11996b014.js", "tom-select/dist/css/tom-select.bootstrap5.min.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fvendor%2Ftom-select%2Fdist%2Fcss%2Ftom-select.bootstrap5.min-ada7defe0a460fb59edebd9cb32f027a.css%22%7D%29%29", "clipboard": "/assets/vendor/clipboard/clipboard.index-925566f98181665b5a61fea1bcd9033d.js", "asciinema-player": "/assets/vendor/asciinema-player/asciinema-player.index-570112964ad129943315d4774ff2848c.js", "asciinema-player/dist/bundle/asciinema-player.min.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fvendor%2Fasciinema-player%2Fdist%2Fbundle%2Fasciinema-player.min-a05dfa789a7206f64313b61ebd22be96.css%22%7D%29%29", "@symfony/ux-live-component": "/assets/@symfony/ux-live-component/live_controller-b4fdb1f53d5a5f813f85327cceb706b8.js", "bootstrap": "/assets/vendor/bootstrap/bootstrap.index-c0423c99f6075e6b1cef7579b5c00d32.js", "bootstrap/js/src/collapse": "/assets/vendor/bootstrap/js/src/collapse-674fb69f06f8ee1254928307c13a98ee.js", "bootstrap/js/src/tab": "/assets/vendor/bootstrap/js/src/tab-7e2e431aae5d98b88d2f18d7c8e234f6.js", "bootstrap/js/src/dropdown": "/assets/vendor/bootstrap/js/src/dropdown-5c9d4a6d933f30fca054706951f97f80.js", "bootstrap/js/src/popover": "/assets/vendor/bootstrap/js/src/popover-138f0dbb5d2642645c5968a4782d3c67.js", "@symfony/ux-map/abstract-map-controller": "/assets/@symfony/ux-map/abstract_map_controller-eb94e55237a8107b072a686404d36758.js", "@symfony/ux-leaflet-map/map-controller": "/assets/@symfony/ux-leaflet-map/map_controller-975755623ba9069450e62093d97cea8f.js", "leaflet": "/assets/vendor/leaflet/leaflet.index-0fc72e43e04be464c7bda1ae45ac26ac.js", "leaflet/dist/leaflet.min.css": "data:application/javascript,document.head.appendChild%28Object.assign%28document.createElement%28%22link%22%29%2C%7Brel%3A%22stylesheet%22%2Chref%3A%22%2Fassets%2Fvendor%2Fleaflet%2Fdist%2Fleaflet.min-af732ed3306b383c4b260f42b19ee75f.css%22%7D%29%29", "@hotwired/turbo": "/assets/vendor/@hotwired/turbo/turbo.index-810f44ef1a202a441e4866b7a4c72d11.js", "emoji-mart": "/assets/vendor/emoji-mart/emoji-mart.index-dda5113ca0dd7ec52a0d00ea99c8e945.js", "@symfony/ux-leaflet-map": "/assets/@symfony/ux-leaflet-map/map_controller-975755623ba9069450e62093d97cea8f.js" } } </script> <!-- ES Module Shims: Import maps polyfill for modules browsers without import maps support --> <script async src="https://ga.jspm.io/npm:es-module-shims@1.10.0/dist/es-module-shims.js" data-turbo-track="reload"></script> <link rel="modulepreload" href="/assets/app-8a87453761810fb014e976bf960715d7.js"> <link rel="modulepreload" href="/assets/vendor/bootstrap/js/src/offcanvas-6e548788bdb299ccf15bad01f85a1c4e.js"> <link rel="modulepreload" href="/assets/stimulus-97656ab68e522ab9732b853e32a2116f.js"> <link rel="modulepreload" href="/assets/@symfony/stimulus-bundle/loader-870999a02e9fc147c034d522826ea70d.js"> <link rel="modulepreload" href="/assets/vendor/@hotwired/stimulus/stimulus.index-b5b1d00e42695b8959b4a1e94e3bc92a.js"> <link rel="modulepreload" href="/assets/@symfony/stimulus-bundle/controllers-30ef92e440b067edafb440f89903311e.js"> <link rel="modulepreload" href="/assets/@symfony/ux-live-component/live_controller-b4fdb1f53d5a5f813f85327cceb706b8.js"> <link rel="modulepreload" href="/assets/controllers/eventsmap_controller-dec85c248dc518bcca1ff8c1772842bc.js"> <link rel="modulepreload" href="/assets/search-04960a6f9bd1902ecc44ef024e74ecb9.js"> <link rel="modulepreload" href="/assets/vendor/mousetrap/mousetrap.index-2fcbabba04c2773c43d7b248b7bfcc5e.js"> <link rel="modulepreload" href="/assets/doc-f53df194d5b1babeef5401af8562c6af.js"> <link rel="modulepreload" href="/assets/code-5fce8b30c71ee457fcb7e2630873c57e.js"> <script type="module" data-turbo-track="reload">import 'app';import 'search';import 'doc';</script> <link rel="stylesheet" href="https://connect.symfony.com/css/sln.css"> <script type="text/javascript" defer> document.head.appendChild(Object.assign(document.createElement('script'), { src: 'https://connect.symfony.com/sln.js?customize_url=https%3A%2F%2Fsymfony.com%2Faccount%2Fsln_customiser.js', async: true, })); </script> <link rel="shortcut icon" type="image/svg+xml" href="/favicons/favicon.svg"> <link rel="alternate icon" type="image/png" sizes="180x180" href="/favicons/favicon-180x180.png"> <link rel="mask-icon" href="/favicons/safari-pinned-tab.svg" color="#5bbad5"> <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png"> <link rel="manifest" href="/static/webmanifest.json"> <meta name="msapplication-config" content="/static/browserconfig.xml" /> <meta name="theme-color" content="#ffffff"> <meta name="apple-mobile-web-app-title" content="Symfony"> <meta property="fb:pages" content="211720082183067"> <meta name="twitter:site" content="@symfony"> <meta name="twitter:card" content="summary_large_image" /> <meta property="og:type" content="website"> <meta property="og:title" content="The EventDispatcher Component (Symfony Docs)"> <meta property="og:image" content="https://symfony.com/images/opengraph/symfony.png"> <meta property="og:image:alt" content="The EventDispatcher component provides tools that allow your application components to communicate with each other by dispatching events and listening to them. Introduction Object-oriented code has …"> <meta property="og:url" content="https://symfony.com/doc/current/components/event_dispatcher.html"> <meta property="og:description" content="The EventDispatcher component provides tools that allow your application components to communicate with each other by dispatching events and listening to them. Introduction Object-oriented code has …"> <meta name="msapplication-TileColor" content="#262626"> <meta name="application-name" content="Symfony"> <meta name="msapplication-tooltip" content="Official Symfony website"> <meta name="theme-color" content="#262626"> <script async="true" data-browser-key="708cc1e7d4caf1babcf4add8f85ee4bab46c2fc9583f44e11b2bd8fb8a6d87ab" data-sample-rate="0.010000" data-parent-trace-id="d26271c657089fc409013efefcb7c4ee" data-transaction-name="App\Controller\DocController::docAction" data-collector="https://ingest.blackfire.io" src="https://admin.pipeline.blackfire.io/js/probe.js"></script></head> <body data-turbo="false" class="" data-is-doc-page data-doc-book="symfony" data-doc-page="components/event_dispatcher"> <a href="#main-content" class="show-on-focus skip-to-content">Skip to content</a> <script> function setSymfonyWebsiteColorScheme () { const selectedColorScheme = localStorage.getItem('colorScheme') || 'sync'; const resolvedColorScheme = 'sync' === selectedColorScheme ? matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' : selectedColorScheme; document.body.classList.remove('light-theme', 'dark-theme'); document.body.classList.add('light' === resolvedColorScheme ? 'light-theme' : 'dark-theme'); document.body.setAttribute('data-bs-theme', resolvedColorScheme); localStorage.setItem('colorScheme', selectedColorScheme); document.body.style.colorScheme = resolvedColorScheme; } setSymfonyWebsiteColorScheme(); window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function (e) { setSymfonyWebsiteColorScheme(); }); document.body.classList.add( (navigator.appVersion.indexOf('Win') !== -1) ? 'windows' : (navigator.appVersion.indexOf('Mac') !== -1) ? 'macos' : 'linux' ); </script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"WebSite","name":"Symfony","url":"https:\/\/symfony.com","potentialAction":{"@type":"SearchAction","target":"https:\/\/symfony.com\/search?q={query}","query-input":"required name=query"}}</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Organization","url":"https:\/\/symfony.com","name":"Symfony","logo":"\/images\/logos\/sf-positive.svg","sameAs":["https:\/\/github.com\/symfony","https:\/\/stackoverflow.com\/questions\/tagged\/symfony","https:\/\/twitter.com\/symfony","https:\/\/www.facebook.com\/SymfonyFramework","https:\/\/www.youtube.com\/user\/SensioLabs"]}</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Event","eventAttendanceMode":"OfflineEventAttendanceMode","eventStatus":"https:\/\/schema.org\/EventScheduled","name":"SymfonyCon Vienna 2024","image":"\/images\/conferences\/sfcon.svg","organizer":{"@type":"Organization","name":"Symfony","url":"https:\/\/live.symfony.com"},"location":{"@type":"Place","address":{"@type":"PostalAddress","streetAddress":"Austria Center Vienna, Entrance n\u00b02, Bruno-Kreisky-Platz 1, , A-1220 Wien, Austria","addressLocality":"Vienna","addressCountry":"AT"},"geo":{"@type":"GeoCoordinates","latitude":48.235390000000002,"longitude":16.414549999999998}},"url":"https:\/\/live.symfony.com\/2024-vienna-con\/","startDate":"2024-12-05","endDate":"2024-12-06","offers":[{"@type":"Offer","price":399,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2024-vienna-con\/registration\/","validFrom":"2023-12-07T00:00:00+01:00","availability":"https:\/\/schema.org\/SoldOut"},{"@type":"Offer","price":490,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2024-vienna-con\/registration\/","validFrom":"2024-04-09T00:00:00+02:00","availability":"https:\/\/schema.org\/SoldOut"},{"@type":"Offer","price":659,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2024-vienna-con\/registration\/","validFrom":"2024-10-17T00:00:00+02:00","availability":"https:\/\/schema.org\/SoldOut"},{"@type":"Offer","price":759,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2024-vienna-con\/registration\/","validFrom":"2024-11-21T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":919,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2024-vienna-con\/registration\/","validFrom":"2024-12-03T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":149,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2024-vienna-con\/registration\/","validFrom":"2024-12-07T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"}]}</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Event","eventAttendanceMode":"OnlineEventAttendanceMode","eventStatus":"https:\/\/schema.org\/EventScheduled","name":"Symfony January 2025","image":"\/images\/conferences\/sfcon.svg","organizer":{"@type":"Organization","name":"Symfony","url":"https:\/\/live.symfony.com"},"location":{"@type":"VirtualLocation","url":"https:\/\/live.symfony.com\/2025-online-january\/"},"url":"https:\/\/live.symfony.com\/2025-online-january\/","startDate":"2025-01-16","endDate":"2025-01-17","offers":[{"@type":"Offer","price":79,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-online-january\/registration\/","validFrom":"2024-06-06T00:00:00+02:00","availability":"https:\/\/schema.org\/SoldOut"},{"@type":"Offer","price":119,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-online-january\/registration\/","validFrom":"2024-09-10T00:00:00+02:00","availability":"https:\/\/schema.org\/SoldOut"},{"@type":"Offer","price":149,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-online-january\/registration\/","validFrom":"2024-11-12T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":149,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-online-january\/registration\/","validFrom":"2025-01-18T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"}]}</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Event","eventAttendanceMode":"OfflineEventAttendanceMode","eventStatus":"https:\/\/schema.org\/EventScheduled","name":"SymfonyLive Paris 2025","image":"\/images\/conferences\/sflive.svg","organizer":{"@type":"Organization","name":"Symfony","url":"https:\/\/live.symfony.com"},"location":{"@type":"Place","address":{"@type":"PostalAddress","streetAddress":"17, boulevard Jourdan, 75014 Paris","addressLocality":"Paris","addressCountry":"FR"},"geo":{"@type":"GeoCoordinates","latitude":48.820039999999999,"longitude":2.3388499999999999}},"url":"https:\/\/live.symfony.com\/2025-paris\/","startDate":"2025-03-27","endDate":"2025-03-28","offers":[{"@type":"Offer","price":349,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-paris\/registration\/","validFrom":"2024-03-29T15:00:00+01:00","availability":"https:\/\/schema.org\/SoldOut"},{"@type":"Offer","price":399,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-paris\/registration\/","validFrom":"2024-09-26T00:00:00+02:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":499,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-paris\/registration\/","validFrom":"2025-01-23T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":549,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-paris\/registration\/","validFrom":"2025-02-27T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":599,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-paris\/registration\/","validFrom":"2025-03-26T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":149,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-paris\/registration\/","validFrom":"2025-03-30T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"}]}</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Event","eventAttendanceMode":"OfflineEventAttendanceMode","eventStatus":"https:\/\/schema.org\/EventScheduled","name":"SymfonyLive Berlin 2025","image":"\/images\/conferences\/sflive.svg","organizer":{"@type":"Organization","name":"Symfony","url":"https:\/\/live.symfony.com"},"location":{"@type":"Place","address":{"@type":"PostalAddress","streetAddress":"CineStar CUBIX, Rathausstrasse 1, 10178 Berlin, Germany","addressLocality":"Berlin","addressCountry":"DE"},"geo":{"@type":"GeoCoordinates","latitude":52.520310000000002,"longitude":13.41194}},"url":"https:\/\/live.symfony.com\/2025-berlin\/","startDate":"2025-04-03","endDate":"2025-04-04","offers":[{"@type":"Offer","price":399,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-berlin\/registration\/","validFrom":"2024-07-09T00:00:00+02:00","availability":"https:\/\/schema.org\/SoldOut"},{"@type":"Offer","price":499,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-berlin\/registration\/","validFrom":"2024-10-08T00:00:00+02:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":549,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-berlin\/registration\/","validFrom":"2025-01-28T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":599,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-berlin\/registration\/","validFrom":"2025-03-04T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":649,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-berlin\/registration\/","validFrom":"2025-04-01T00:00:00+02:00","availability":"https:\/\/schema.org\/InStock"}]}</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Event","eventAttendanceMode":"OnlineEventAttendanceMode","eventStatus":"https:\/\/schema.org\/EventScheduled","name":"Symfony June 2025","image":"\/images\/conferences\/sfcon.svg","organizer":{"@type":"Organization","name":"Symfony","url":"https:\/\/live.symfony.com"},"location":{"@type":"VirtualLocation","url":"https:\/\/live.symfony.com\/2025-online-june\/"},"url":"https:\/\/live.symfony.com\/2025-online-june\/","startDate":"2025-06-12","endDate":"2025-06-13","offers":[{"@type":"Offer","price":79,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-online-june\/registration\/","validFrom":"2024-10-01T00:00:00+02:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":119,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-online-june\/registration\/","validFrom":"2025-02-20T00:00:00+01:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":149,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-online-june\/registration\/","validFrom":"2025-05-08T00:00:00+02:00","availability":"https:\/\/schema.org\/InStock"},{"@type":"Offer","price":149,"priceCurrency":"EUR","url":"https:\/\/live.symfony.com\/2025-online-june\/registration\/","validFrom":"2025-06-14T00:00:00+02:00","availability":"https:\/\/schema.org\/InStock"}]}</script> <div id="sln"></div> <header> <div class="ui-page-container ui-page-container-wide"> <nav class="navbar navbar-expand-lg"> <a class="navbar-brand" href="/" aria-label="Symfony"> <span aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="260" height="66" viewBox="0 0 260 66"><circle fill="#1A171B" cx="32.455" cy="32.665" r="32.455"/><path fill="#FFF" d="M46.644 12.219c-3.297.115-6.175 1.932-8.317 4.446-2.372 2.756-3.95 6.025-5.087 9.362-2.034-1.667-3.603-3.825-6.866-4.766-2.522-.724-5.171-.425-7.607 1.39-1.154.862-1.949 2.165-2.327 3.39-.979 3.183 1.029 6.016 1.941 7.033l1.994 2.137c.411.419 1.401 1.512.917 3.079-.523 1.704-2.577 2.807-4.684 2.157-.941-.287-2.293-.988-1.99-1.975.125-.404.414-.706.569-1.055.142-.3.21-.525.253-.657.385-1.257-.141-2.892-1.487-3.307-1.256-.385-2.541-.08-3.039 1.537-.565 1.837.314 5.171 5.023 6.623 5.517 1.695 10.184-1.309 10.846-5.227.417-2.454-.691-4.277-2.721-6.622l-1.654-1.829c-1.002-1.001-1.346-2.707-.309-4.018.875-1.106 2.121-1.578 4.162-1.023 2.979.809 4.307 2.876 6.523 4.543-.915 3.001-1.513 6.013-2.054 8.714l-.33 2.014c-1.584 8.308-2.793 12.87-5.935 15.489-.633.45-1.538 1.124-2.902 1.171-.715.022-.946-.47-.956-.684-.017-.502.406-.732.687-.958.42-.229 1.055-.609 1.012-1.826-.046-1.438-1.237-2.685-2.959-2.628-1.29.044-3.256 1.258-3.182 3.48.077 2.295 2.216 4.015 5.441 3.906 1.724-.059 5.574-.761 9.368-5.271 4.416-5.17 5.651-11.097 6.58-15.435l1.037-5.727c.576.069 1.192.115 1.862.131 5.5.116 8.251-2.733 8.292-4.805.027-1.254-.823-2.488-2.013-2.46-.852.024-1.922.591-2.179 1.769-.251 1.156 1.75 2.199.186 3.212-1.111.719-3.103 1.226-5.908.814l.51-2.819c1.041-5.346 2.325-11.922 7.196-12.082.355-.018 1.654.016 1.684.875.009.287-.062.36-.398 1.017-.342.512-.471.948-.455 1.449.047 1.365 1.085 2.262 2.586 2.208 2.01-.065 2.588-2.022 2.555-3.027-.081-2.361-2.57-3.853-5.865-3.745z"/><path fill="#1A171B" d="M196.782 23.534c7.48 0 12.499 5.407 12.499 12.887 0 7.048-5.116 12.886-12.499 12.886-7.435 0-12.55-5.838-12.55-12.886 0-7.48 5.018-12.887 12.55-12.887zm0 22.109c5.306 0 7.671-4.827 7.671-9.222 0-4.68-2.847-9.217-7.671-9.217-4.877 0-7.724 4.537-7.724 9.217.001 4.394 2.365 9.222 7.724 9.222zM183.61 25.825v-1.713h-6.518v-2.341c0-3.33.483-5.842 4.391-5.842.072 0 .149.005.224.008.008 0 .007-.012.016-.012 1.085.08 1.987-.804 2.048-1.887l.08-1.486c-.915-.146-1.884-.29-3.039-.29-6.709 0-8.255 3.91-8.255 9.896v1.955h-5.795v1.913c.149.99.996 1.752 2.031 1.752.006 0 .009.005.016.005h3.748V48.73h2.5l.006-.001c1.04 0 1.892-.779 2.03-1.779V27.783h4.538a2.052 2.052 0 0 0 1.979-1.958zm-60.435-1.713c-.008 0-.013.006-.024.006-.956 0-1.882.657-2.286 1.545l-6.244 18.82h-.096l-6.106-18.81c-.399-.893-1.329-1.555-2.291-1.555-.011 0-.015-.006-.024-.006h-3.164l8.351 22.977c.291.821.871 2.077.871 2.606 0 .483-1.353 6.08-5.409 6.08-.1 0-.201-.009-.3-.017-1.034-.057-1.815.665-1.989 1.779l-.124 1.57c.82.145 1.645.338 3.092.338 5.984 0 7.769-5.455 9.46-10.185l9.073-25.149h-2.79zm-28.843 5c-3.747-1.917-7.847-3.218-7.918-7.076.012-4.097 3.776-5.172 6.677-5.169.012-.002.024-.002.031-.002 1.26 0 2.268.125 3.251.34.013 0 .011-.016.027-.016 1.039.076 1.911-.737 2.034-1.762l.083-1.488c-1.902-.473-3.889-.712-5.619-.712-6.309.039-10.992 3.213-11.007 9.268.009 5.296 3.578 7.349 7.416 9.207 3.764 1.81 7.888 3.305 7.924 7.674-.023 4.56-4.423 6.241-7.455 6.247-1.773-.006-3.698-.449-5.32-.96-1.017-.168-1.851.729-1.982 1.917l-.138 1.327c2.23.72 4.517 1.348 6.815 1.348h.027c7.065-.051 12.557-2.869 12.578-10.185-.011-5.645-3.604-8.016-7.424-9.958zm68.623 19.617l.006-.001c.98 0 1.796-.687 2.004-1.604V32.947c0-5.358-2.267-9.413-8.546-9.413-2.219 0-5.934 1.257-7.623 4.779-1.306-3.331-4.15-4.779-7-4.779-3.619 0-6.082 1.303-7.816 4.152h-.099v-1.532a2.058 2.058 0 0 0-2.055-2.036c-.008 0-.014-.006-.022-.006h-2.169v24.617h2.456l.006-.001a2.06 2.06 0 0 0 2.059-2.059c0-.03.011-.042.016-.063v-10.28c0-4.585 1.834-9.122 6.467-9.122 3.669 0 4.396 3.811 4.396 6.853V48.73h2.49l.007-.001a2.05 2.05 0 0 0 2.037-1.873v-10.53c0-4.585 1.835-9.122 6.468-9.122 3.667 0 4.393 3.811 4.393 6.853V48.73h2.525zm70.113 0l.008-.001a2.054 2.054 0 0 0 2.049-1.964v-12.66c0-6.611-2.85-10.571-9.222-10.571-3.426 0-6.705 1.691-8.059 4.491h-.097v-1.839c0-.001-.004-.001-.004-.006a2.057 2.057 0 0 0-2.058-2.061c-.011 0-.015-.006-.022-.006h-2.311v24.617h2.493l.007-.001a2.05 2.05 0 0 0 2.038-1.895v-9.495c0-5.984 2.319-10.135 7.482-10.135 3.96.24 5.211 3.038 5.211 8.783v12.742h2.485zm24.428-24.617c-.011 0-.014.006-.026.006-.954 0-1.883.657-2.283 1.545l-6.242 18.82h-.102l-6.104-18.81c-.401-.893-1.331-1.555-2.293-1.555-.007 0-.015-.006-.021-.006h-3.164l8.351 22.977c.291.821.873 2.077.873 2.606 0 .483-1.355 6.08-5.41 6.08-.102 0-.201-.009-.301-.017-1.033-.057-1.815.665-1.99 1.779l-.122 1.57c.82.145 1.645.338 3.091.338 5.984 0 7.772-5.455 9.462-10.185l9.074-25.149h-2.793z"/></svg></span> </a> <button class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#header-nav-menu" aria-controls="header-nav-menu" aria-expanded="false" aria-label="Toggle navigation"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path></svg> </button> <div class="offcanvas offcanvas-end" tabindex="-1" id="header-nav-menu"> <div class="offcanvas-header justify-content-end"> <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close">Close</button> </div> <div class="offcanvas-body align-items-center"> <div id="sensiolabs-highlight-responsive-menu"></div> <ul class="navbar-nav flex-grow-1" role="menubar" aria-label="Menu"> <li role="none" class="nav-item"> <span tabindex="0" class="nav-header" role="menuitem" aria-haspopup="true" aria-expanded="false">About</span> <div class="submenu"> <ul role="menu" aria-label="About"> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M6 13q.687 1 2 1c1.313 0 2-.875 2-1.5c0-1.5-2-1-2-2C8 9.875 8.516 9 9.5 9c2.5 0 1.563 2 5.5 2q1 0 1-1"></path><path d="M9 17q-.143 1 1 1q2.571 0 3-6c.286-4 1.571-6 3-6q.857 0 1 1"></path><path d="M22 12c0 5.523-4.477 10-10 10S2 17.523 2 12S6.477 2 12 2a10 10 0 0 1 10 10"></path></g></svg> </span> <a role="menuitem" class="nav-link" href="/what-is-symfony">What is Symfony?</a> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 7a4 4 0 1 0 8 0a4 4 0 1 0-8 0M3 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v2m1-17.87a4 4 0 0 1 0 7.75M21 21v-2a4 4 0 0 0-3-3.85"></path></svg> </span> <a role="menuitem" class="nav-link" href="/community">Community</a> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 6h3a1 1 0 0 1 1 1v11a2 2 0 0 1-4 0V5a1 1 0 0 0-1-1H5a1 1 0 0 0-1 1v12a3 3 0 0 0 3 3h11M8 8h4m-4 4h4m-4 4h4"></path></svg> </span> <a role="menuitem" class="nav-link" href="/blog/">News</a> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2 8a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm4 2v.01m4-.01v.01m4-.01v.01m4-.01v.01M6 14v.01M18 14v.01M10 14l4 .01"></path></svg> </span> <a role="menuitem" class="nav-link" href="/doc/current/contributing/index.html">Contributing</a> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M3 12a9 9 0 1 0 18 0a9 9 0 1 0-18 0m9 5v.01"></path><path d="M12 13.5a1.5 1.5 0 0 1 1-1.5a2.6 2.6 0 1 0-3-4"></path></g></svg> </span> <a role="menuitem" class="nav-link" href="/support">Support</a> </li> </ul> </div> </li> <li role="none" class="nav-item"> <span tabindex="0" class="nav-header" role="menuitem" aria-haspopup="true" aria-expanded="false">Documentation</span> <div class="submenu"> <ul role="menu" aria-label="Documentation"> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M5 5a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1zm4 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1zM5 8h4m0 8h4"></path><path d="m13.803 4.56l2.184-.53c.562-.135 1.133.19 1.282.732l3.695 13.418a1.02 1.02 0 0 1-.634 1.219l-.133.041l-2.184.53c-.562.135-1.133-.19-1.282-.732L13.036 5.82a1.02 1.02 0 0 1 .634-1.219zM14 9l4-1m-2 8l3.923-.98"></path></g></svg> </span> <a role="menuitem" class="nav-link" href="/doc/current/index.html">Symfony Docs</a> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19 4v16H7a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z"></path><path d="M19 16H7a2 2 0 0 0-2 2M9 8h6"></path></g></svg> </span> <a role="menuitem" class="nav-link" href="/book">Symfony Book</a> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m15 10l4.553-2.276A1 1 0 0 1 21 8.618v6.764a1 1 0 0 1-1.447.894L15 14zM3 8a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path></svg> </span> <a role="menuitem" class="nav-link" href="https://symfonycasts.com">Screencasts</a> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m12 3l8 4.5v9L12 21l-8-4.5v-9zm0 9l8-4.5M12 12v9m0-9L4 7.5"></path></svg> </span> <a role="menuitem" class="nav-link" href="/bundles">Symfony Bundles</a> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6.657 18C4.085 18 2 15.993 2 13.517s2.085-4.482 4.657-4.482c.393-1.762 1.794-3.2 3.675-3.773c1.88-.572 3.956-.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.913 0 3.464 1.56 3.464 3.486s-1.551 3.487-3.465 3.487H6.657"></path></svg> </span> <a role="menuitem" class="nav-link" href="/doc/cloud/">Symfony Cloud</a> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M22 9L12 5L2 9l10 4zv6"></path><path d="M6 10.6V16a6 3 0 0 0 12 0v-5.4"></path></g></svg> </span> <a role="menuitem" class="nav-link" href="https://sensiolabs.com/training?utm_source=symfony&utm_medium=symfony_submenu&utm_campaign=permanent_referral">Training</a> </li> </ul> </div> </li> <li role="none" class="nav-item menu-services"> <span tabindex="0" class="nav-header" role="menuitem" aria-haspopup="true" aria-expanded="false">Services</span> <div class="submenu"> <ul role="menu" aria-label="Services"> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6.657 18C4.085 18 2 15.993 2 13.517s2.085-4.482 4.657-4.482c.393-1.762 1.794-3.2 3.675-3.773c1.88-.572 3.956-.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.913 0 3.464 1.56 3.464 3.486s-1.551 3.487-3.465 3.487H6.657"></path></svg> </span> <span> <a role="menuitem" class="nav-link" href="/cloud/">Platform.sh for Symfony</a> <span class="nav-link-description">Best platform to deploy Symfony apps</span> </span> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M8 5H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.697M18 12V7a2 2 0 0 0-2-2h-2"></path><path d="M8 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v0a2 2 0 0 1-2 2h-2a2 2 0 0 1-2-2m0 6h4m-4 4h3m3 2.5a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0-5 0m4.5 2L21 22"></path></g></svg> </span> <span> <a role="menuitem" class="nav-link" href="https://insight.symfony.com">SymfonyInsight</a> <span class="nav-link-description">Automatic quality checks for your apps</span> </span> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M12 15a3 3 0 1 0 6 0a3 3 0 1 0-6 0"></path><path d="M13 17.5V22l2-1.5l2 1.5v-4.5"></path><path d="M10 19H5a2 2 0 0 1-2-2V7c0-1.1.9-2 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-1 1.73M6 9h12M6 12h3m-3 3h2"></path></g></svg> </span> <span> <a role="menuitem" class="nav-link" href="https://certification.symfony.com">Symfony Certification</a> <span class="nav-link-description">Prove your knowledge and boost your career</span> </span> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M3 9a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zm5-2V5a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2m-4 5v.01"></path><path d="M3 13a20 20 0 0 0 18 0"></path></g></svg> </span> <span> <a role="menuitem" class="nav-link" href="https://sensiolabs.com/?utm_source=symfony&utm_medium=symfony_submenu&utm_campaign=permanent_referral">SensioLabs</a> <span class="nav-link-description">Professional services to help you with Symfony</span> </span> </li> <li role="none" class="nav-link-with-icon"> <span class="nav-link-icon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 12c2-2.96 0-7-1-8c0 3.038-1.773 4.741-3 6c-1.226 1.26-2 3.24-2 5a6 6 0 1 0 12 0c0-1.532-1.056-3.94-2-5c-1.786 3-2.791 3-4 2"></path></svg> </span> <span> <a role="menuitem" class="nav-link" href="https://www.blackfire.io/?utm_source=symfony&utm_medium=symfonycom_footer&utm_campaign=profiler">Blackfire</a> <span class="nav-link-description">Profile and monitor performance of your apps</span> </span> </li> </ul> </div> </li> <li role="none" class="d-lg-none"> <span class="nav-header">Other</span> </li> <li role="none" class="nav-item nav-item-standalone"> <a role="menuitem" class="nav-link" href="/blog/">Blog</a> </li> <li role="none" class="nav-item nav-item-standalone"> <a role="menuitem" class="nav-link" href="/download">Download</a> </li> </ul> <div class="sensiolabs d-none d-lg-block text-center position-relative"> <span class="byline">sponsored by</span> <a target="_blank" class="ui-stretched-link d-inline-block mt-2 mt-md-0" rel="external noopener" href="https://sensiolabs.com/?utm_source=symfony&utm_medium=symfony_sponsoredby&utm_campaign=permanent_referral" title="SensioLabs, PHP services and software solutions for enterprise and community."> <span class="dark-theme d-md-none"> <svg version="1.1" x="0px" y="0px" viewBox="0 0 326.866 51.069" width="81px" height="13px" enable-background="new 0 0 326.866 51.069" space="preserve" class="logo-sensiolabs" fill="currentColor" aria-hidden="true"><style> .logo-sensiolabs path.sensio-word { fill: #000000; } .logo-sensiolabs path.labs-word { fill: #82E83F; } .dark-theme .logo-sensiolabs path.sensio-word { fill: #FFFFFF; } </style><g> <path class="sensio-word" d="M10.459,33.728c0,6.486,5.091,9.012,10.872,9.012c3.784,0,9.563-1.094,9.563-6.073c0-5.26-7.362-6.147-14.586-8.059 c-7.294-1.911-14.656-4.71-14.656-13.861C1.652,4.779,11.147,0,20.022,0c10.253,0,19.679,4.439,19.679,15.702H29.242 c-0.344-5.87-4.54-7.373-9.7-7.373c-3.44,0-7.431,1.434-7.431,5.531c0,3.755,2.338,4.232,14.655,7.374 c3.577,0.887,14.586,3.141,14.586,14.2c0,8.944-7.087,15.635-20.435,15.635c-10.871,0-21.053-5.323-20.916-17.342H10.459z"></path> <path class="sensio-word" d="M51.453,34.488c0.275,6.192,3.302,9.013,8.737,9.013c3.922,0,7.088-2.408,7.707-4.611h8.6 c-2.753,8.395-8.6,11.973-16.65,11.973c-11.215,0-18.165-7.706-18.165-18.713c0-10.666,7.363-18.784,18.165-18.784 c12.109,0,17.957,10.183,17.27,21.123H51.453z M67.347,28.295c-0.895-4.953-3.027-7.568-7.775-7.568 c-6.192,0-7.981,4.816-8.118,7.568H67.347z"></path> <path class="sensio-word" d="M78.026,14.327h9.287v4.956h0.207c2.477-3.991,6.742-5.918,10.871-5.918c10.389,0,13.004,5.847,13.004,14.653v21.88h-9.771 v-20.09c0-5.849-1.72-8.738-6.263-8.738c-5.297,0-7.567,2.958-7.567,10.182v18.646h-9.769V14.327z"></path> <path class="sensio-word" d="M121.47,38.34c0.069,4.267,3.647,5.986,7.5,5.986c2.817,0,6.396-1.101,6.396-4.54c0-2.96-4.059-3.991-11.075-5.505 c-5.642-1.238-11.282-3.233-11.282-9.496c0-9.08,7.842-11.42,15.479-11.42c7.773,0,14.93,2.613,15.685,11.352h-9.289 c-0.272-3.783-3.164-4.814-6.672-4.814c-2.199,0-5.434,0.412-5.434,3.301c0,3.509,5.503,3.99,11.074,5.3 c5.711,1.306,11.284,3.37,11.284,9.974c0,9.359-8.118,12.386-16.235,12.386c-8.256,0-16.307-3.096-16.721-12.522H121.47z"></path> <path class="sensio-word" d="M155.728,8.823h-9.769v-8.05h9.769V8.823z M145.959,14.327h9.769v35.571h-9.769V14.327z"></path> <path class="sensio-word" d="M175.05,13.365c11.214,0,18.438,7.43,18.438,18.783c0,11.283-7.225,18.714-18.438,18.714 c-11.146,0-18.37-7.431-18.37-18.714C156.68,20.795,163.904,13.365,175.05,13.365 M175.05,43.501c6.674,0,8.669-5.711,8.669-11.353 c0-5.712-1.995-11.422-8.669-11.422c-6.604,0-8.601,5.71-8.601,11.422C166.449,37.79,168.445,43.501,175.05,43.501"></path> </g><g> <path class="labs-word" d="M195.349,49.579V1.357h9.817v40.03h19.409v8.191H195.349z"></path> <path class="labs-word" d="M234.742,25.104l-8.457-1.526c0.95-3.404,2.587-5.925,4.909-7.562c2.32-1.636,5.77-2.454,10.347-2.454 c4.157,0,7.252,0.492,9.286,1.476c2.034,0.984,3.467,2.233,4.295,3.748c0.83,1.515,1.244,4.295,1.244,8.341l-0.1,10.879 c0,3.096,0.149,5.378,0.447,6.849c0.299,1.47,0.857,3.046,1.676,4.726h-9.221c-0.243-0.619-0.541-1.536-0.895-2.753 c-0.156-0.552-0.266-0.917-0.332-1.095c-1.592,1.549-3.295,2.709-5.107,3.482c-1.813,0.774-3.748,1.161-5.805,1.161 c-3.626,0-6.483-0.983-8.572-2.951c-2.09-1.968-3.135-4.455-3.135-7.463c0-1.989,0.476-3.764,1.426-5.323 c0.951-1.559,2.283-2.752,3.997-3.581c1.713-0.829,4.185-1.554,7.412-2.173c4.356-0.817,7.374-1.58,9.054-2.288v-0.929 c0-1.791-0.441-3.068-1.326-3.831s-2.554-1.144-5.008-1.144c-1.658,0-2.951,0.326-3.881,0.979 C236.069,22.323,235.317,23.467,234.742,25.104z M247.212,32.665c-1.193,0.397-3.084,0.873-5.671,1.426s-4.278,1.095-5.074,1.625 c-1.216,0.862-1.823,1.957-1.823,3.283c0,1.306,0.485,2.433,1.459,3.383c0.973,0.951,2.211,1.427,3.715,1.427 c1.68,0,3.283-0.553,4.809-1.658c1.127-0.841,1.867-1.868,2.222-3.085c0.243-0.796,0.364-2.31,0.364-4.543V32.665z"></path> <path class="labs-word" d="M260.093,49.579V0.959h9.318V18.47c2.875-3.271,6.279-4.908,10.215-4.908c4.289,0,7.838,1.554,10.646,4.66 c2.808,3.106,4.212,7.567,4.212,13.382c0,6.015-1.432,10.646-4.295,13.896s-6.341,4.875-10.431,4.875 c-2.012,0-3.996-0.503-5.953-1.509s-3.643-2.493-5.058-4.461v5.174H260.093z M269.345,31.205c0,3.648,0.575,6.347,1.725,8.093 c1.614,2.477,3.759,3.715,6.435,3.715c2.056,0,3.808-0.879,5.257-2.637c1.447-1.758,2.172-4.527,2.172-8.309 c0-4.023-0.729-6.926-2.188-8.705c-1.46-1.78-3.328-2.67-5.604-2.67c-2.234,0-4.092,0.868-5.572,2.604 C270.086,25.031,269.345,27.668,269.345,31.205z"></path> <path class="labs-word" d="M293.967,39.53l9.353-1.427c0.398,1.813,1.205,3.19,2.422,4.13c1.215,0.939,2.918,1.409,5.107,1.409 c2.409,0,4.223-0.442,5.438-1.327c0.817-0.618,1.228-1.447,1.228-2.487c0-0.707-0.222-1.293-0.664-1.758 c-0.464-0.441-1.504-0.851-3.117-1.227c-7.518-1.658-12.283-3.173-14.294-4.544c-2.786-1.901-4.179-4.544-4.179-7.927 c0-3.051,1.205-5.615,3.615-7.694c2.409-2.077,6.146-3.117,11.209-3.117c4.82,0,8.402,0.785,10.746,2.354 c2.344,1.57,3.957,3.892,4.842,6.965l-8.789,1.625c-0.376-1.37-1.089-2.421-2.139-3.15c-1.051-0.729-2.549-1.095-4.494-1.095 c-2.454,0-4.212,0.344-5.273,1.028c-0.707,0.486-1.061,1.117-1.061,1.891c0,0.663,0.309,1.227,0.928,1.691 c0.84,0.619,3.742,1.492,8.707,2.62c4.963,1.127,8.429,2.51,10.396,4.146c1.945,1.658,2.918,3.969,2.918,6.932 c0,3.229-1.348,6.003-4.045,8.324c-2.698,2.321-6.689,3.482-11.973,3.482c-4.799,0-8.596-0.973-11.393-2.919 C296.659,45.511,294.829,42.869,293.967,39.53z"></path> </g></svg> </span> <span class="d-none d-md-inline-block"> <svg version="1.1" x="0px" y="0px" viewBox="0 0 326.866 51.069" width="81px" height="13px" enable-background="new 0 0 326.866 51.069" space="preserve" class="logo-sensiolabs" fill="currentColor" aria-hidden="true"><style> .logo-sensiolabs path.sensio-word { fill: #000000; } .logo-sensiolabs path.labs-word { fill: #82E83F; } .dark-theme .logo-sensiolabs path.sensio-word { fill: #FFFFFF; } </style><g> <path class="sensio-word" d="M10.459,33.728c0,6.486,5.091,9.012,10.872,9.012c3.784,0,9.563-1.094,9.563-6.073c0-5.26-7.362-6.147-14.586-8.059 c-7.294-1.911-14.656-4.71-14.656-13.861C1.652,4.779,11.147,0,20.022,0c10.253,0,19.679,4.439,19.679,15.702H29.242 c-0.344-5.87-4.54-7.373-9.7-7.373c-3.44,0-7.431,1.434-7.431,5.531c0,3.755,2.338,4.232,14.655,7.374 c3.577,0.887,14.586,3.141,14.586,14.2c0,8.944-7.087,15.635-20.435,15.635c-10.871,0-21.053-5.323-20.916-17.342H10.459z"></path> <path class="sensio-word" d="M51.453,34.488c0.275,6.192,3.302,9.013,8.737,9.013c3.922,0,7.088-2.408,7.707-4.611h8.6 c-2.753,8.395-8.6,11.973-16.65,11.973c-11.215,0-18.165-7.706-18.165-18.713c0-10.666,7.363-18.784,18.165-18.784 c12.109,0,17.957,10.183,17.27,21.123H51.453z M67.347,28.295c-0.895-4.953-3.027-7.568-7.775-7.568 c-6.192,0-7.981,4.816-8.118,7.568H67.347z"></path> <path class="sensio-word" d="M78.026,14.327h9.287v4.956h0.207c2.477-3.991,6.742-5.918,10.871-5.918c10.389,0,13.004,5.847,13.004,14.653v21.88h-9.771 v-20.09c0-5.849-1.72-8.738-6.263-8.738c-5.297,0-7.567,2.958-7.567,10.182v18.646h-9.769V14.327z"></path> <path class="sensio-word" d="M121.47,38.34c0.069,4.267,3.647,5.986,7.5,5.986c2.817,0,6.396-1.101,6.396-4.54c0-2.96-4.059-3.991-11.075-5.505 c-5.642-1.238-11.282-3.233-11.282-9.496c0-9.08,7.842-11.42,15.479-11.42c7.773,0,14.93,2.613,15.685,11.352h-9.289 c-0.272-3.783-3.164-4.814-6.672-4.814c-2.199,0-5.434,0.412-5.434,3.301c0,3.509,5.503,3.99,11.074,5.3 c5.711,1.306,11.284,3.37,11.284,9.974c0,9.359-8.118,12.386-16.235,12.386c-8.256,0-16.307-3.096-16.721-12.522H121.47z"></path> <path class="sensio-word" d="M155.728,8.823h-9.769v-8.05h9.769V8.823z M145.959,14.327h9.769v35.571h-9.769V14.327z"></path> <path class="sensio-word" d="M175.05,13.365c11.214,0,18.438,7.43,18.438,18.783c0,11.283-7.225,18.714-18.438,18.714 c-11.146,0-18.37-7.431-18.37-18.714C156.68,20.795,163.904,13.365,175.05,13.365 M175.05,43.501c6.674,0,8.669-5.711,8.669-11.353 c0-5.712-1.995-11.422-8.669-11.422c-6.604,0-8.601,5.71-8.601,11.422C166.449,37.79,168.445,43.501,175.05,43.501"></path> </g><g> <path class="labs-word" d="M195.349,49.579V1.357h9.817v40.03h19.409v8.191H195.349z"></path> <path class="labs-word" d="M234.742,25.104l-8.457-1.526c0.95-3.404,2.587-5.925,4.909-7.562c2.32-1.636,5.77-2.454,10.347-2.454 c4.157,0,7.252,0.492,9.286,1.476c2.034,0.984,3.467,2.233,4.295,3.748c0.83,1.515,1.244,4.295,1.244,8.341l-0.1,10.879 c0,3.096,0.149,5.378,0.447,6.849c0.299,1.47,0.857,3.046,1.676,4.726h-9.221c-0.243-0.619-0.541-1.536-0.895-2.753 c-0.156-0.552-0.266-0.917-0.332-1.095c-1.592,1.549-3.295,2.709-5.107,3.482c-1.813,0.774-3.748,1.161-5.805,1.161 c-3.626,0-6.483-0.983-8.572-2.951c-2.09-1.968-3.135-4.455-3.135-7.463c0-1.989,0.476-3.764,1.426-5.323 c0.951-1.559,2.283-2.752,3.997-3.581c1.713-0.829,4.185-1.554,7.412-2.173c4.356-0.817,7.374-1.58,9.054-2.288v-0.929 c0-1.791-0.441-3.068-1.326-3.831s-2.554-1.144-5.008-1.144c-1.658,0-2.951,0.326-3.881,0.979 C236.069,22.323,235.317,23.467,234.742,25.104z M247.212,32.665c-1.193,0.397-3.084,0.873-5.671,1.426s-4.278,1.095-5.074,1.625 c-1.216,0.862-1.823,1.957-1.823,3.283c0,1.306,0.485,2.433,1.459,3.383c0.973,0.951,2.211,1.427,3.715,1.427 c1.68,0,3.283-0.553,4.809-1.658c1.127-0.841,1.867-1.868,2.222-3.085c0.243-0.796,0.364-2.31,0.364-4.543V32.665z"></path> <path class="labs-word" d="M260.093,49.579V0.959h9.318V18.47c2.875-3.271,6.279-4.908,10.215-4.908c4.289,0,7.838,1.554,10.646,4.66 c2.808,3.106,4.212,7.567,4.212,13.382c0,6.015-1.432,10.646-4.295,13.896s-6.341,4.875-10.431,4.875 c-2.012,0-3.996-0.503-5.953-1.509s-3.643-2.493-5.058-4.461v5.174H260.093z M269.345,31.205c0,3.648,0.575,6.347,1.725,8.093 c1.614,2.477,3.759,3.715,6.435,3.715c2.056,0,3.808-0.879,5.257-2.637c1.447-1.758,2.172-4.527,2.172-8.309 c0-4.023-0.729-6.926-2.188-8.705c-1.46-1.78-3.328-2.67-5.604-2.67c-2.234,0-4.092,0.868-5.572,2.604 C270.086,25.031,269.345,27.668,269.345,31.205z"></path> <path class="labs-word" d="M293.967,39.53l9.353-1.427c0.398,1.813,1.205,3.19,2.422,4.13c1.215,0.939,2.918,1.409,5.107,1.409 c2.409,0,4.223-0.442,5.438-1.327c0.817-0.618,1.228-1.447,1.228-2.487c0-0.707-0.222-1.293-0.664-1.758 c-0.464-0.441-1.504-0.851-3.117-1.227c-7.518-1.658-12.283-3.173-14.294-4.544c-2.786-1.901-4.179-4.544-4.179-7.927 c0-3.051,1.205-5.615,3.615-7.694c2.409-2.077,6.146-3.117,11.209-3.117c4.82,0,8.402,0.785,10.746,2.354 c2.344,1.57,3.957,3.892,4.842,6.965l-8.789,1.625c-0.376-1.37-1.089-2.421-2.139-3.15c-1.051-0.729-2.549-1.095-4.494-1.095 c-2.454,0-4.212,0.344-5.273,1.028c-0.707,0.486-1.061,1.117-1.061,1.891c0,0.663,0.309,1.227,0.928,1.691 c0.84,0.619,3.742,1.492,8.707,2.62c4.963,1.127,8.429,2.51,10.396,4.146c1.945,1.658,2.918,3.969,2.918,6.932 c0,3.229-1.348,6.003-4.045,8.324c-2.698,2.321-6.689,3.482-11.973,3.482c-4.799,0-8.596-0.973-11.393-2.919 C296.659,45.511,294.829,42.869,293.967,39.53z"></path> </g></svg> </span> </a> </div> </div> </div> </nav> </div> </header> <aside class="highlight-top-horizontal"> <style> .top-horizontal-highlights { background: #18181B; font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; position: relative; width: 100%; } .top-horizontal-highlights a::after { content: ''; position: absolute; top: 0; left: 0; height: 100%; width: 100%; } .top-horizontal-highlight { align-items: center; display: flex; flex-wrap: nowrap; padding: 12px 0; } a.top-horizontal-highlight-title, a.top-horizontal-highlight-title:hover { color: #00ff00; font-weight: 600; } .top-horizontal-highlight-data { color: #ffffff; display: none; font-size: 15px; margin-left: 30px; } .truncate-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .nowrap-text { white-space: nowrap; } .only-visible-on-small-screens { display: inline-block; } @media (min-width: 768px) { .top-horizontal-highlight-data { display: block; margin-left: 30px; } .only-visible-on-small-screens { display: none; } } .dark-theme .top-horizontal-highlights { background: #00ff7f; } .dark-theme a.top-horizontal-highlight-title, .dark-theme a.top-horizontal-highlight-title:hover { color: #18181B; } .dark-theme .top-horizontal-highlight-data { color: #18181B; } </style> <div class="top-horizontal-highlights"> <div class="ui-page-container"> <div class="top-horizontal-highlight"> <a class="top-horizontal-highlight-title" href="https://symfony.com/blog/black-friday-2024-offers-from-the-symfony-ecosystem"> <span class="nowrap-text">Black Friday 2024 <span class="only-visible-on-small-screens">discounts</span></span> </a> <span class="top-horizontal-highlight-data truncate-text"> 30% discount on all SymfonyInsight yearly Team plans <strong>(offer ends in 6 days)</strong> </span> </div> </div> </div> </aside> <nav class="breadcrumb-nav d-none d-sm-block" aria-label="breadcrumb"> <div class="ui-page-container ui-page-container-wide"> <ol class="breadcrumb ui-text-muted flex-nowrap pt-2"> <li class="breadcrumb-item "> <a href="/" class="ui-link-muted">Home</a> </li> <li class="breadcrumb-item text-truncate"> <a href="/doc/current/index.html" class="ui-link-muted">Documentation</a> </li> <li class="breadcrumb-item text-truncate active" aria-current="page"> The EventDispatcher Component </li> </ol> </div> </nav> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"\/","name":"Home"}},{"@type":"ListItem","position":2,"item":{"@id":"\/doc\/current\/index.html","name":"Documentation"}},{"@type":"ListItem","position":3,"item":{"@id":"\/doc\/current\/components\/event_dispatcher.html","name":"The EventDispatcher Component"}}]}</script> <main id="main-content" class="ui-page-main-content "> <div class="ui-page-container ui-page-container-wide"> <div class="ui-page-grid-content-left-sidebar-right-sidebar"> <aside class="sidebar sidebar-left"> <div class="ui-sidebar-content-sticky"> <div class="doc-sidebar-search mt-2 mb-3"> <button type="button" class="form-search-input-button d-flex flex-fill align-items-center flex-nowrap w-100 rounded-5 ui-border-primary ui-text-muted ui-text-sm px-2 py-1 ui-hover-outline-link ui-cursor-pointer"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" class="me-2"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10a7 7 0 1 0 14 0a7 7 0 1 0-14 0m18 11l-6-6"></path></svg> Search Symfony Docs </button> </div> <div class="doc-action doc-alternative-selector branch-selector"> <span class="label">Version:</span> <select class="form-select ui-text-sm"> <optgroup label="Maintained Versions"> <option data-url="https://symfony.com/doc/7.3/components/event_dispatcher.html"> 7.3 (dev) </option> <option data-url="https://symfony.com/doc/7.2/components/event_dispatcher.html"> 7.2 </option> <option selected data-url="https://symfony.com/doc/current/components/event_dispatcher.html"> 7.1 (current) </option> <option data-url="https://symfony.com/doc/6.4/components/event_dispatcher.html"> 6.4 </option> <option data-url="https://symfony.com/doc/5.x/components/event_dispatcher.html"> 5.x </option> </optgroup> <optgroup label="Unmaintained Versions"> <option data-url="https://symfony.com/doc/7.0/components/event_dispatcher.html"> 7.0 </option> <option data-url="https://symfony.com/doc/6.3/components/event_dispatcher.html"> 6.3 </option> <option data-url="https://symfony.com/doc/6.2/components/event_dispatcher.html"> 6.2 </option> <option data-url="https://symfony.com/doc/6.1/components/event_dispatcher.html"> 6.1 </option> <option data-url="https://symfony.com/doc/6.0/components/event_dispatcher.html"> 6.0 </option> <option data-url="https://symfony.com/doc/4.x/components/event_dispatcher.html"> 4.x </option> <option data-url="https://symfony.com/doc/3.x/components/event_dispatcher.html"> 3.x </option> <option data-url="https://symfony.com/doc/2.x/components/event_dispatcher.html"> 2.x </option> </optgroup> </select> </div> <div class="doc-sidebar-menu"> <div class="toctree-wrapper toctree-programmatic toctree-size-lg"> <p class="toctree-title">Table of Contents</p> <ul class="toctree toctree-level-1 toctree-length-5"> <li> <a href="#introduction">Introduction</a> </li> <li> <a href="#installation">Installation</a> </li> <li> <a href="#usage">Usage</a> <ul class="toctree toctree-level-2 toctree-length-8"> <li> <a href="#events">Events</a> </li> <li> <a href="#the-dispatcher">The Dispatcher</a> </li> <li> <a href="#connecting-listeners">Connecting Listeners</a> </li> <li> <a href="#creating-and-dispatching-an-event">Creating and Dispatching an Event</a> </li> <li> <a href="#using-event-subscribers">Using Event Subscribers</a> </li> <li> <a href="#stopping-event-flow-propagation">Stopping Event Flow/Propagation</a> </li> <li> <a href="#eventdispatcher-aware-events-and-listeners">EventDispatcher Aware Events and Listeners</a> </li> <li> <a href="#event-name-introspection">Event Name Introspection</a> </li> </ul> </li> <li> <a href="#other-dispatchers">Other Dispatchers</a> </li> <li> <a href="#learn-more">Learn More</a> </li> </ul> </div> </div> </div> </aside> <article class="content" lang="en"> <div class="ui-heading"> <h1 id="the-eventdispatcher-component" class="ui-heading-title"> The EventDispatcher Component </h1> </div> <a class="doc-action content-edit ui-link-muted mb-2" href="https://github.com/symfony/symfony-docs/edit/7.1/components/event_dispatcher.rst"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" height="18" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" /> </svg> Edit this page </a> <div class="ui-prose"> <div class="section"> <blockquote><p>The EventDispatcher component provides tools that allow your application components to communicate with each other by dispatching events and listening to them.</p> </blockquote> <div class="section"> <h2 id="introduction"><a class="headerlink" href="#introduction" title="Permalink to this headline">Introduction</a></h2> <p>Object-oriented code has gone a long way to ensuring code extensibility. By creating classes that have well-defined responsibilities, your code becomes more flexible and a developer can extend them with subclasses to modify their behaviors. But if they want to share the changes with other developers who have also made their own subclasses, code inheritance is no longer the answer.</p> <p>Consider the real-world example where you want to provide a plugin system for your project. A plugin should be able to add methods, or do something before or after a method is executed, without interfering with other plugins. This is not an easy problem to solve with single inheritance, and even if multiple inheritance was possible with PHP, it comes with its own drawbacks.</p> <p>The Symfony EventDispatcher component implements the <a href="https://en.wikipedia.org/wiki/Mediator_pattern" class="reference external" rel="external noopener noreferrer" target="_blank">Mediator</a> and <a href="https://en.wikipedia.org/wiki/Observer_pattern" class="reference external" rel="external noopener noreferrer" target="_blank">Observer</a> design patterns to make all these things possible and to make your projects truly extensible.</p> <p>Take an example from <a href="http_kernel.html" class="reference internal">the HttpKernel component</a>. Once a <code translate="no" class="notranslate">Response</code> object has been created, it may be useful to allow other elements in the system to modify it (e.g. add some cache headers) before it's actually used. To make this possible, the Symfony kernel dispatches an event - <code translate="no" class="notranslate">kernel.response</code>. Here's how it works:</p> <ul> <li>A <em>listener</em> (PHP object) tells a central <em>dispatcher</em> object that it wants to listen to the <code translate="no" class="notranslate">kernel.response</code> event;</li> <li>At some point, the Symfony kernel tells the <em>dispatcher</em> object to dispatch the <code translate="no" class="notranslate">kernel.response</code> event, passing with it an <code translate="no" class="notranslate">Event</code> object that has access to the <code translate="no" class="notranslate">Response</code> object;</li> <li>The dispatcher notifies (i.e. calls a method on) all listeners of the <code translate="no" class="notranslate">kernel.response</code> event, allowing each of them to make modifications to the <code translate="no" class="notranslate">Response</code> object.</li> </ul> </div> <div class="section"> <h2 id="installation"><a class="headerlink" href="#installation" title="Permalink to this headline">Installation</a></h2> <div translate="no" data-loc="1" class="notranslate codeblock codeblock-length-sm codeblock-terminal codeblock-bash"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1</pre> <pre class="codeblock-code"><code><span class="hljs-prompt">$ </span>composer require symfony/event-dispatcher</code></pre> </div> </div> <div class="admonition admonition-note "> <p class="admonition-title"> <svg fill="none" width="24" height="24" viewbox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path></svg> <span>Note</span> </p><p>If you install this component outside of a Symfony application, you must require the <code translate="no" class="notranslate">vendor/autoload.php</code> file in your code to enable the class autoloading mechanism provided by Composer. Read <a href="using_components.html" class="reference internal">this article</a> for more details.</p> </div> </div> <div class="section"> <h2 id="usage"><a class="headerlink" href="#usage" title="Permalink to this headline">Usage</a></h2> <div class="admonition admonition-seealso "> <p class="admonition-title"> <svg fill="none" width="24" height="24" viewbox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"></path></svg> <span>See also</span> </p><p>This article explains how to use the EventDispatcher features as an independent component in any PHP application. Read the <a href="../event_dispatcher.html" class="reference internal">Events and Event Listeners</a> article to learn about how to use it in Symfony applications.</p> </div> <div class="section"> <h3 id="events"><a class="headerlink" href="#events" title="Permalink to this headline">Events</a></h3> <p>When an event is dispatched, it's identified by a unique name (e.g. <code translate="no" class="notranslate">kernel.response</code>), which any number of listeners might be listening to. An <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Contracts/EventDispatcher/Event.php" class="reference external" title="Symfony\Contracts\EventDispatcher\Event" rel="external noopener noreferrer" target="_blank">Event</a> instance is also created and passed to all of the listeners. As you'll see later, the <code translate="no" class="notranslate">Event</code> object itself often contains data about the event being dispatched.</p> <div class="section"> <h4 id="event-names-and-event-objects"><a class="headerlink" href="#event-names-and-event-objects" title="Permalink to this headline">Event Names and Event Objects</a></h4> <p>When the dispatcher notifies listeners, it passes an actual <code translate="no" class="notranslate">Event</code> object to those listeners. The base <code translate="no" class="notranslate">Event</code> class contains a method for stopping <a href="event_dispatcher.html#event_dispatcher-event-propagation" class="reference internal">event propagation</a>, but not much else.</p> <div class="admonition admonition-seealso "> <p class="admonition-title"> <svg fill="none" width="24" height="24" viewbox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"></path></svg> <span>See also</span> </p><p>Read "<a href="../components/event_dispatcher/generic_event.html" class="reference internal">The Generic Event Object</a>" for more information about this base event object.</p> </div> <p>Often times, data about a specific event needs to be passed along with the <code translate="no" class="notranslate">Event</code> object so that the listeners have the needed information. In such case, a special subclass that has additional methods for retrieving and overriding information can be passed when dispatching an event. For example, the <code translate="no" class="notranslate">kernel.response</code> event uses a <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Component/HttpKernel/Event/ResponseEvent.php" class="reference external" title="Symfony\Component\HttpKernel\Event\ResponseEvent" rel="external noopener noreferrer" target="_blank">ResponseEvent</a>, which contains methods to get and even replace the <code translate="no" class="notranslate">Response</code> object.</p> </div> </div> <div class="section"> <h3 id="the-dispatcher"><a class="headerlink" href="#the-dispatcher" title="Permalink to this headline">The Dispatcher</a></h3> <p>The dispatcher is the central object of the event dispatcher system. In general, a single dispatcher is created, which maintains a registry of listeners. When an event is dispatched via the dispatcher, it notifies all listeners registered with that event:</p> <div translate="no" data-loc="3" class="notranslate codeblock codeblock-length-sm codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">EventDispatcher</span>; <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>dispatcher</span> = <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">EventDispatcher</span>();</code></pre> </div> </div> </div> <div class="section"> <h3 id="connecting-listeners"><a class="headerlink" href="#connecting-listeners" title="Permalink to this headline">Connecting Listeners</a></h3> <p>To take advantage of an existing event, you need to connect a listener to the dispatcher so that it can be notified when the event is dispatched. A call to the dispatcher's <code translate="no" class="notranslate">addListener()</code> method associates any valid PHP callable to an event:</p> <div translate="no" data-loc="2" class="notranslate codeblock codeblock-length-sm codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2</pre> <pre class="codeblock-code"><code><span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>listener</span> = <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">AcmeListener</span>(); <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>dispatcher</span>-><span class="hljs-title invoke__">addListener</span>(<span class="hljs-string">'acme.foo.action'</span>, [<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>listener</span>, <span class="hljs-string">'onFooAction'</span>]);</code></pre> </div> </div> <p>The <code translate="no" class="notranslate">addListener()</code> method takes up to three arguments:</p> <ol class="arabic"> <li>The event name (string) that this listener wants to listen to;</li> <li>A PHP callable that will be executed when the specified event is dispatched;</li> <li>An optional priority, defined as a positive or negative integer (defaults to <code translate="no" class="notranslate">0</code>). The higher the number, the earlier the listener is called. If two listeners have the same priority, they are executed in the order that they were added to the dispatcher.</li> </ol> <div class="admonition admonition-note "> <p class="admonition-title"> <svg fill="none" width="24" height="24" viewbox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path></svg> <span>Note</span> </p><p>A <a href="https://www.php.net/manual/en/language.types.callable.php" class="reference external" rel="external noopener noreferrer" target="_blank">PHP callable</a> is a PHP variable that can be used by the <code translate="no" class="notranslate">call_user_func()</code> function and returns <code translate="no" class="notranslate">true</code> when passed to the <code translate="no" class="notranslate">is_callable()</code> function. It can be a <code translate="no" class="notranslate">\Closure</code> instance, an object implementing an <code translate="no" class="notranslate">__invoke()</code> method (which is what closures are in fact), a string representing a function or an array representing an object method or a class method.</p> <p>So far, you've seen how PHP objects can be registered as listeners. You can also register PHP <a href="https://www.php.net/manual/en/functions.anonymous.php" class="reference external" rel="external noopener noreferrer" target="_blank">Closures</a> as event listeners:</p> <div translate="no" data-loc="5" class="notranslate codeblock codeblock-length-sm codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Contracts</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">Event</span>; <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>dispatcher</span>-><span class="hljs-title invoke__">addListener</span>(<span class="hljs-string">'acme.foo.action'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(Event <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>)</span>: <span class="hljs-title">void</span> </span>{ // will be executed when the acme.foo.action event is dispatched });</code></pre> </div> </div> </div> <p>Once a listener is registered with the dispatcher, it waits until the event is notified. In the above example, when the <code translate="no" class="notranslate">acme.foo.action</code> event is dispatched, the dispatcher calls the <code translate="no" class="notranslate">AcmeListener::onFooAction()</code> method and passes the <code translate="no" class="notranslate">Event</code> object as the single argument:</p> <div translate="no" data-loc="11" class="notranslate codeblock codeblock-length-md codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5 6 7 8 9 10 11</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Contracts</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">Event</span>; <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AcmeListener</span> </span>{ <span class="hljs-comment">// ...</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onFooAction</span><span class="hljs-params">(Event <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>)</span>: <span class="hljs-title">void</span> </span>{ <span class="hljs-comment">// ... do something</span> } }</code></pre> </div> </div> <p>The <code translate="no" class="notranslate">$event</code> argument is the event object that was passed when dispatching the event. In many cases, a special event subclass is passed with extra information. You can check the documentation or implementation of each event to determine which instance is passed.</p> <div class="admonition-wrapper"><div class="admonition admonition-sidebar"><p class="sidebar-title"><span>Registering Event Listeners and Subscribers in the Service Container</span></p><p>Registering service definitions and tagging them with the <code translate="no" class="notranslate">kernel.event_listener</code> and <code translate="no" class="notranslate">kernel.event_subscriber</code> tags is not enough to enable the event listeners and event subscribers. You must also register a compiler pass called <code translate="no" class="notranslate">RegisterListenersPass()</code> in the container builder:</p> <div translate="no" data-loc="22" class="notranslate codeblock codeblock-length-md codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">DependencyInjection</span>\<span class="hljs-title">ContainerBuilder</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">DependencyInjection</span>\<span class="hljs-title">ParameterBag</span>\<span class="hljs-title">ParameterBag</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">DependencyInjection</span>\<span class="hljs-title">RegisterListenersPass</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">EventDispatcher</span>; <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span> = <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">ContainerBuilder</span>(<span class="hljs-keyword">new</span> <span class="hljs-title invoke__">ParameterBag</span>()); <span class="hljs-comment">// register the compiler pass that handles the 'kernel.event_listener'</span> <span class="hljs-comment">// and 'kernel.event_subscriber' service tags</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span>-><span class="hljs-title invoke__">addCompilerPass</span>(<span class="hljs-keyword">new</span> <span class="hljs-title invoke__">RegisterListenersPass</span>()); <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span>-><span class="hljs-title invoke__">register</span>(<span class="hljs-string">'event_dispatcher'</span>, EventDispatcher::<span class="hljs-variable language_">class</span>); <span class="hljs-comment">// registers an event listener</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span>-><span class="hljs-title invoke__">register</span>(<span class="hljs-string">'listener_service_id'</span>, \AcmeListener::<span class="hljs-variable language_">class</span>) -><span class="hljs-title invoke__">addTag</span>(<span class="hljs-string">'kernel.event_listener'</span>, [ <span class="hljs-string">'event'</span> => <span class="hljs-string">'acme.foo.action'</span>, <span class="hljs-string">'method'</span> => <span class="hljs-string">'onFooAction'</span>, ]); <span class="hljs-comment">// registers an event subscriber</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span>-><span class="hljs-title invoke__">register</span>(<span class="hljs-string">'subscriber_service_id'</span>, \AcmeSubscriber::<span class="hljs-variable language_">class</span>) -><span class="hljs-title invoke__">addTag</span>(<span class="hljs-string">'kernel.event_subscriber'</span>);</code></pre> </div> </div> <p><code translate="no" class="notranslate">RegisterListenersPass</code> resolves aliased class names which for instance allows to refer to an event via the fully qualified class name (FQCN) of the event class. The pass will read the alias mapping from a dedicated container parameter. This parameter can be extended by registering another compiler pass, <code translate="no" class="notranslate">AddEventAliasesPass</code>:</p> <div translate="no" data-loc="22" class="notranslate codeblock codeblock-length-md codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">DependencyInjection</span>\<span class="hljs-title">Compiler</span>\<span class="hljs-title">PassConfig</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">DependencyInjection</span>\<span class="hljs-title">ContainerBuilder</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">DependencyInjection</span>\<span class="hljs-title">ParameterBag</span>\<span class="hljs-title">ParameterBag</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">DependencyInjection</span>\<span class="hljs-title">AddEventAliasesPass</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">DependencyInjection</span>\<span class="hljs-title">RegisterListenersPass</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">EventDispatcher</span>; <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span> = <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">ContainerBuilder</span>(<span class="hljs-keyword">new</span> <span class="hljs-title invoke__">ParameterBag</span>()); <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span>-><span class="hljs-title invoke__">addCompilerPass</span>(<span class="hljs-keyword">new</span> <span class="hljs-title invoke__">AddEventAliasesPass</span>([ \AcmeFooActionEvent::<span class="hljs-variable language_">class</span> => <span class="hljs-string">'acme.foo.action'</span>, ])); <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span>-><span class="hljs-title invoke__">addCompilerPass</span>(<span class="hljs-keyword">new</span> <span class="hljs-title invoke__">RegisterListenersPass</span>(), PassConfig::<span class="hljs-variable constant_">TYPE_BEFORE_REMOVING</span>); <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span>-><span class="hljs-title invoke__">register</span>(<span class="hljs-string">'event_dispatcher'</span>, EventDispatcher::<span class="hljs-variable language_">class</span>); <span class="hljs-comment">// registers an event listener</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>container</span>-><span class="hljs-title invoke__">register</span>(<span class="hljs-string">'listener_service_id'</span>, \AcmeListener::<span class="hljs-variable language_">class</span>) -><span class="hljs-title invoke__">addTag</span>(<span class="hljs-string">'kernel.event_listener'</span>, [ // will be translated to <span class="hljs-string">'acme.foo.action'</span> by RegisterListenersPass. <span class="hljs-string">'event'</span> => \AcmeFooActionEvent::<span class="hljs-variable language_">class</span>, <span class="hljs-string">'method'</span> => <span class="hljs-string">'onFooAction'</span>, ]);</code></pre> </div> </div> <div class="admonition admonition-note "> <p class="admonition-title"> <svg fill="none" width="24" height="24" viewbox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path></svg> <span>Note</span> </p><p>Note that <code translate="no" class="notranslate">AddEventAliasesPass</code> has to be processed before <code translate="no" class="notranslate">RegisterListenersPass</code>.</p> </div> <p>The listeners pass assumes that the event dispatcher's service id is <code translate="no" class="notranslate">event_dispatcher</code>, that event listeners are tagged with the <code translate="no" class="notranslate">kernel.event_listener</code> tag, that event subscribers are tagged with the <code translate="no" class="notranslate">kernel.event_subscriber</code> tag and that the alias mapping is stored as parameter <code translate="no" class="notranslate">event_dispatcher.event_aliases</code>.</p> </div></div> <span id="event_dispatcher-closures-as-listeners"></span> </div> <div class="section"> <h3 id="creating-and-dispatching-an-event"><a class="headerlink" href="#creating-and-dispatching-an-event" title="Permalink to this headline">Creating and Dispatching an Event</a></h3> <p>In addition to registering listeners with existing events, you can create and dispatch your own events. This is useful when creating third-party libraries and also when you want to keep different components of your own system flexible and decoupled.</p> <span id="creating-an-event-object"></span> <div class="section"> <h4 id="creating-an-event-class"><a class="headerlink" href="#creating-an-event-class" title="Permalink to this headline">Creating an Event Class</a></h4> <p>Suppose you want to create a new event that is dispatched each time a customer orders a product with your application. When dispatching this event, you'll pass a custom event instance that has access to the placed order. Start by creating this custom event class and documenting it:</p> <div translate="no" data-loc="18" class="notranslate codeblock codeblock-length-md codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">namespace</span> <span class="hljs-title">Acme</span>\<span class="hljs-title">Store</span>\<span class="hljs-title">Event</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Acme</span>\<span class="hljs-title">Store</span>\<span class="hljs-title">Order</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Contracts</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">Event</span>; <span class="hljs-comment">/** * This event is dispatched each time an order * is placed in the system. */</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">OrderPlacedEvent</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Event</span> </span>{ <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(<span class="hljs-keyword">private</span> Order <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>order</span>)</span> </span>{} <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getOrder</span><span class="hljs-params">()</span>: <span class="hljs-title">Order</span> </span>{ <span class="hljs-keyword">return</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>this</span>->order; } }</code></pre> </div> </div> <p>Each listener now has access to the order via the <code translate="no" class="notranslate">getOrder()</code> method.</p> </div> <div class="section"> <h4 id="dispatch-the-event"><a class="headerlink" href="#dispatch-the-event" title="Permalink to this headline">Dispatch the Event</a></h4> <p>The <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Component/EventDispatcher/EventDispatcher.php#:~:text=function%20dispatch" class="reference external" title="Symfony\Component\EventDispatcher\EventDispatcher::dispatch()" rel="external noopener noreferrer" target="_blank">dispatch()</a> method notifies all listeners of the given event. It takes two arguments: the <code translate="no" class="notranslate">Event</code> instance to pass to each listener of that event and the name of the event to dispatch:</p> <div translate="no" data-loc="10" class="notranslate codeblock codeblock-length-md codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5 6 7 8 9 10</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Acme</span>\<span class="hljs-title">Store</span>\<span class="hljs-title">Event</span>\<span class="hljs-title">OrderPlacedEvent</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Acme</span>\<span class="hljs-title">Store</span>\<span class="hljs-title">Order</span>; <span class="hljs-comment">// the order is somehow created or retrieved</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>order</span> = <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">Order</span>(); <span class="hljs-comment">// ...</span> <span class="hljs-comment">// creates the OrderPlacedEvent and dispatches it</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span> = <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">OrderPlacedEvent</span>(<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>order</span>); <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>dispatcher</span>-><span class="hljs-title invoke__">dispatch</span>(<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>);</code></pre> </div> </div> <p>Notice that the special <code translate="no" class="notranslate">OrderPlacedEvent</code> object is created and passed to the <code translate="no" class="notranslate">dispatch()</code> method. Now, any listener to the <code translate="no" class="notranslate">OrderPlacedEvent::class</code> event will receive the <code translate="no" class="notranslate">OrderPlacedEvent</code>.</p> <div class="admonition admonition-note "> <p class="admonition-title"> <svg fill="none" width="24" height="24" viewbox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path></svg> <span>Note</span> </p><p>If you don't need to pass any additional data to the event listeners, you can also use the default <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Contracts/EventDispatcher/Event.php" class="reference external" title="Symfony\Contracts\EventDispatcher\Event" rel="external noopener noreferrer" target="_blank">Event</a> class. In such case, you can document the event and its name in a generic <code translate="no" class="notranslate">StoreEvents</code> class, similar to the <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Component/HttpKernel/KernelEvents.php" class="reference external" title="Symfony\Component\HttpKernel\KernelEvents" rel="external noopener noreferrer" target="_blank">KernelEvents</a> class:</p> <div translate="no" data-loc="9" class="notranslate codeblock codeblock-length-sm codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5 6 7 8 9</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">Event</span>; <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">StoreEvents</span> </span>{ <span class="hljs-comment">/** * <span class="hljs-doctag">@Event</span>("Symfony\Contracts\EventDispatcher\Event") */</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">const</span> ORDER_PLACED = <span class="hljs-string">'order.placed'</span>; }</code></pre> </div> </div> <p>And use the <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Contracts/EventDispatcher/Event.php" class="reference external" title="Symfony\Contracts\EventDispatcher\Event" rel="external noopener noreferrer" target="_blank">Event</a> class to dispatch the event:</p> <div translate="no" data-loc="3" class="notranslate codeblock codeblock-length-sm codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Contracts</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">Event</span>; <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>this</span>->eventDispatcher-><span class="hljs-title invoke__">dispatch</span>(<span class="hljs-keyword">new</span> <span class="hljs-title invoke__">Event</span>(), StoreEvents::<span class="hljs-variable constant_">ORDER_PLACED</span>);</code></pre> </div> </div> </div> <span id="event_dispatcher-using-event-subscribers"></span> </div> </div> <div class="section"> <h3 id="using-event-subscribers"><a class="headerlink" href="#using-event-subscribers" title="Permalink to this headline">Using Event Subscribers</a></h3> <p>The most common way to listen to an event is to register an <em>event listener</em> with the dispatcher. This listener can listen to one or more events and is notified each time those events are dispatched.</p> <p>Another way to listen to events is via an <em>event subscriber</em>. An event subscriber is a PHP class that's able to tell the dispatcher exactly which events it should subscribe to. It implements the <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Component/EventDispatcher/EventSubscriberInterface.php" class="reference external" title="Symfony\Component\EventDispatcher\EventSubscriberInterface" rel="external noopener noreferrer" target="_blank">EventSubscriberInterface</a> interface, which requires a single static method called <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Component/EventDispatcher/EventSubscriberInterface.php#:~:text=function%20getSubscribedEvents" class="reference external" title="Symfony\Component\EventDispatcher\EventSubscriberInterface::getSubscribedEvents()" rel="external noopener noreferrer" target="_blank">getSubscribedEvents()</a>. Take the following example of a subscriber that subscribes to the <code translate="no" class="notranslate">kernel.response</code> and <code translate="no" class="notranslate">OrderPlacedEvent::class</code> events:</p> <div translate="no" data-loc="36" class="notranslate codeblock codeblock-length-md codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">namespace</span> <span class="hljs-title">Acme</span>\<span class="hljs-title">Store</span>\<span class="hljs-title">Event</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Acme</span>\<span class="hljs-title">Store</span>\<span class="hljs-title">Event</span>\<span class="hljs-title">OrderPlacedEvent</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">EventSubscriberInterface</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpKernel</span>\<span class="hljs-title">Event</span>\<span class="hljs-title">ResponseEvent</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpKernel</span>\<span class="hljs-title">KernelEvents</span>; <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">StoreSubscriber</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">EventSubscriberInterface</span> </span>{ <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getSubscribedEvents</span><span class="hljs-params">()</span>: <span class="hljs-title">array</span> </span>{ <span class="hljs-keyword">return</span> [ KernelEvents::<span class="hljs-variable constant_">RESPONSE</span> => [ [<span class="hljs-string">'onKernelResponsePre'</span>, <span class="hljs-number">10</span>], [<span class="hljs-string">'onKernelResponsePost'</span>, <span class="hljs-number">-10</span>], ], OrderPlacedEvent::<span class="hljs-variable language_">class</span> => <span class="hljs-string">'onPlacedOrder'</span>, ]; } <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onKernelResponsePre</span><span class="hljs-params">(ResponseEvent <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>)</span>: <span class="hljs-title">void</span> </span>{ <span class="hljs-comment">// ...</span> } <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onKernelResponsePost</span><span class="hljs-params">(ResponseEvent <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>)</span>: <span class="hljs-title">void</span> </span>{ <span class="hljs-comment">// ...</span> } <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onPlacedOrder</span><span class="hljs-params">(OrderPlacedEvent <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>)</span>: <span class="hljs-title">void</span> </span>{ <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>order</span> = <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-><span class="hljs-title invoke__">getOrder</span>(); <span class="hljs-comment">// ...</span> } }</code></pre> </div> </div> <p>This is very similar to a listener class, except that the class itself can tell the dispatcher which events it should listen to. To register a subscriber with the dispatcher, use the <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Component/EventDispatcher/EventDispatcher.php#:~:text=function%20addSubscriber" class="reference external" title="Symfony\Component\EventDispatcher\EventDispatcher::addSubscriber()" rel="external noopener noreferrer" target="_blank">addSubscriber()</a> method:</p> <div translate="no" data-loc="5" class="notranslate codeblock codeblock-length-sm codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Acme</span>\<span class="hljs-title">Store</span>\<span class="hljs-title">Event</span>\<span class="hljs-title">StoreSubscriber</span>; <span class="hljs-comment">// ...</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>subscriber</span> = <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">StoreSubscriber</span>(); <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>dispatcher</span>-><span class="hljs-title invoke__">addSubscriber</span>(<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>subscriber</span>);</code></pre> </div> </div> <p>The dispatcher will automatically register the subscriber for each event returned by the <code translate="no" class="notranslate">getSubscribedEvents()</code> method. This method returns an array indexed by event names and whose values are either the method name to call or an array composed of the method name to call and a priority (a positive or negative integer that defaults to <code translate="no" class="notranslate">0</code>).</p> <p>The example above shows how to register several listener methods for the same event in subscriber and also shows how to pass the priority of each listener method. The higher the number, the earlier the method is called. In the above example, when the <code translate="no" class="notranslate">kernel.response</code> event is triggered, the methods <code translate="no" class="notranslate">onKernelResponsePre()</code> and <code translate="no" class="notranslate">onKernelResponsePost()</code> are called in that order.</p> <span id="event_dispatcher-event-propagation"></span> </div> <div class="section"> <h3 id="stopping-event-flow-propagation"><a class="headerlink" href="#stopping-event-flow-propagation" title="Permalink to this headline">Stopping Event Flow/Propagation</a></h3> <p>In some cases, it may make sense for a listener to prevent any other listeners from being called. In other words, the listener needs to be able to tell the dispatcher to stop all propagation of the event to future listeners (i.e. to not notify any more listeners). This can be accomplished from inside a listener via the <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Contracts/EventDispatcher/Event.php#:~:text=function%20stopPropagation" class="reference external" title="Symfony\Contracts\EventDispatcher\Event::stopPropagation()" rel="external noopener noreferrer" target="_blank">stopPropagation()</a> method:</p> <div translate="no" data-loc="8" class="notranslate codeblock codeblock-length-sm codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5 6 7 8</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Acme</span>\<span class="hljs-title">Store</span>\<span class="hljs-title">Event</span>\<span class="hljs-title">OrderPlacedEvent</span>; <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onPlacedOrder</span><span class="hljs-params">(OrderPlacedEvent <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>)</span>: <span class="hljs-title">void</span> </span>{ <span class="hljs-comment">// ...</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-><span class="hljs-title invoke__">stopPropagation</span>(); }</code></pre> </div> </div> <p>Now, any listeners to <code translate="no" class="notranslate">OrderPlacedEvent::class</code> that have not yet been called will <em>not</em> be called.</p> <p>It is possible to detect if an event was stopped by using the <a href="https://github.com/symfony/symfony/blob/7.1/src/Symfony/Contracts/EventDispatcher/Event.php#:~:text=function%20isPropagationStopped" class="reference external" title="Symfony\Contracts\EventDispatcher\Event::isPropagationStopped()" rel="external noopener noreferrer" target="_blank">isPropagationStopped()</a> method which returns a boolean value:</p> <div translate="no" data-loc="5" class="notranslate codeblock codeblock-length-sm codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5</pre> <pre class="codeblock-code"><code><span class="hljs-comment">// ...</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>dispatcher</span>-><span class="hljs-title invoke__">dispatch</span>(<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>, <span class="hljs-string">'foo.event'</span>); <span class="hljs-keyword">if</span> (<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-><span class="hljs-title invoke__">isPropagationStopped</span>()) { <span class="hljs-comment">// ...</span> }</code></pre> </div> </div> <span id="event_dispatcher-dispatcher-aware-events"></span> </div> <div class="section"> <h3 id="eventdispatcher-aware-events-and-listeners"><a class="headerlink" href="#eventdispatcher-aware-events-and-listeners" title="Permalink to this headline">EventDispatcher Aware Events and Listeners</a></h3> <p>The <code translate="no" class="notranslate">EventDispatcher</code> always passes the dispatched event, the event's name and a reference to itself to the listeners. This can lead to some advanced applications of the <code translate="no" class="notranslate">EventDispatcher</code> including dispatching other events inside listeners, chaining events or even lazy loading listeners into the dispatcher object.</p> <span id="event_dispatcher-event-name-introspection"></span> </div> <div class="section"> <h3 id="event-name-introspection"><a class="headerlink" href="#event-name-introspection" title="Permalink to this headline">Event Name Introspection</a></h3> <p>The <code translate="no" class="notranslate">EventDispatcher</code> instance, as well as the name of the event that is dispatched, are passed as arguments to the listener:</p> <div translate="no" data-loc="10" class="notranslate codeblock codeblock-length-md codeblock-php"> <div class="codeblock-scroll"> <pre class="codeblock-lines">1 2 3 4 5 6 7 8 9 10</pre> <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Contracts</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">Event</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Contracts</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">EventDispatcherInterface</span>; <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyListener</span> </span>{ <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">myEventListener</span><span class="hljs-params">(Event <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>, <span class="hljs-keyword">string</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>eventName</span>, EventDispatcherInterface <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>dispatcher</span>)</span>: <span class="hljs-title">void</span> </span>{ <span class="hljs-comment">// ... do something with the event name</span> } }</code></pre> </div> </div> </div> </div> <div class="section"> <h2 id="other-dispatchers"><a class="headerlink" href="#other-dispatchers" title="Permalink to this headline">Other Dispatchers</a></h2> <p>Besides the commonly used <code translate="no" class="notranslate">EventDispatcher</code>, the component comes with some other dispatchers:</p> <ul> <li><a href="../components/event_dispatcher/immutable_dispatcher.html" class="reference internal">The Immutable Event Dispatcher</a></li> <li><a href="../components/event_dispatcher/traceable_dispatcher.html" class="reference internal">The Traceable Event Dispatcher</a></li> </ul> </div> <div class="section"> <h2 id="learn-more"><a class="headerlink" href="#learn-more" title="Permalink to this headline">Learn More</a></h2> <div class="toctree-wrapper toc-size-md"> <ul class="toctree toctree-level-1 toctree-length-1"> <li> <a href="../components/event_dispatcher/generic_event.html">The Generic Event Object</a> </li> </ul> </div> <ul> <li><a href="../reference/dic_tags.html#dic-tags-kernel-event-listener" class="reference internal">The kernel.event_listener tag</a></li> <li><a href="../reference/dic_tags.html#dic-tags-kernel-event-subscriber" class="reference internal">The kernel.event_subscriber tag</a></li> </ul> </div> </div> </div> <div class="ui-text-sm ui-text-muted mt-4"> This work, including the code samples, is licensed under a <a class="ui-link-muted" rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons BY-SA 3.0</a> license. </div> <div id="doc-mobile-shortcuts-bar"> <div> <details class="toc"> <summary> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 6h11M9 12h11M9 18h11M5 6v.01M5 12v.01M5 18v.01"></path></svg> TOC </summary> <ul class="toc-contents toctree is-empty"></ul> </details> </div> <div> <button type="button" class="form-search-input-button d-flex flex-fill align-items-center flex-nowrap w-100 shadow-none"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10a7 7 0 1 0 14 0a7 7 0 1 0-14 0m18 11l-6-6"></path></svg> Search </button> </div> <div> <details class="version"> <summary> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 7a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-6a2 2 0 0 1-2-2zM7 7v10M4 8v8"></path></svg> Version </summary> <div class="version-contents is-empty"></div> </details> </div> </div> </article> <aside class="sidebar sidebar-right"> <div class="ui-sidebar-content-sticky"> <div class="mb-3 px-1"> <p class="ui-text-sm text-center mb-1"> <strong>Symfony 7.1</strong> is <a href="/backers">backed</a> by </p> <div class="doc-backer doc-backer-release"> <div class="backer_logo"><a class="link stretched-link" href="http://getrector.com/" target="_blank" rel="noopener"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 189.3 46.4" class="backer-logo-rector"><style> .dark-theme .backer-logo-rector path.logo-rector-word { fill: #fff; } </style><linearGradient id="a"><stop offset="0" stop-color="#d08a70"/><stop offset="1" stop-color="#955848"/></linearGradient><radialGradient xlink:href="#a" id="h" cx="0" cy="0" r="1" gradientTransform="matrix(56.96474 0 0 -76.9024 469 256)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#a" id="i" cx="0" cy="0" r="1" gradientTransform="matrix(69.1537 0 0 -107.18825 468.333 88)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient id="j" cx="0" cy="0" r="1" gradientTransform="matrix(12.66626 0 0 -12.66626 445.667 148.34)" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#f9ea39"/><stop offset="1" stop-color="#945515"/></radialGradient><linearGradient id="b"><stop offset="0" stop-color="#d08a70"/><stop offset="1" stop-color="#bf3818"/></linearGradient><radialGradient xlink:href="#b" id="l" cx="0" cy="0" r="1" gradientTransform="matrix(0 -17.81527 -35.63054 0 98.833 7.666)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#b" id="m" cx="0" cy="0" r="1" gradientTransform="matrix(0 -16.6966 -33.3932 0 151.667 7.666)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#b" id="n" cx="0" cy="0" r="1" gradientTransform="matrix(0 -11.70201 -23.40402 0 89.501 30.006)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#b" id="o" cx="0" cy="0" r="1" gradientTransform="matrix(0 -6.8836 -13.7672 0 80.834 52.172)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#b" id="q" cx="0" cy="0" r="1" gradientTransform="matrix(0 -11.9638 -23.9276 0 236.417 7.666)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#b" id="r" cx="0" cy="0" r="1" gradientTransform="matrix(0 -14.05142 -28.10284 0 197.667 7.666)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#b" id="s" cx="0" cy="0" r="1" gradientTransform="matrix(0 -17.81527 -35.63054 0 134.667 30.34)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#b" id="t" cx="0" cy="0" r="1" gradientTransform="matrix(0 -16.52167 -33.04334 0 114.071 52.34)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#b" id="u" cx="0" cy="0" r="1" gradientTransform="matrix(0 -11.29369 -22.98834 0 88.917 72.174)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><radialGradient xlink:href="#b" id="v" cx="0" cy="0" r="1" gradientTransform="matrix(0 -9.69276 -19.947 0 86.506 92.34)" gradientUnits="userSpaceOnUse" spreadMethod="pad"/><clipPath id="c"><path d="M0 1052h1041V0H0z"/></clipPath><clipPath id="e"><path d="M0 1052h1041V0H0z"/></clipPath><clipPath id="g"><path d="M0 1052h1041V0H0z"/></clipPath><clipPath id="k"><path d="M0 1052h1041V0H0z"/></clipPath><clipPath id="p"><path d="M0 1052h1041V0H0z"/></clipPath><clipPath id="w"><path d="M0 1052h1041V0H0z"/></clipPath><mask id="d" width="1" height="1" x="0" y="0" maskUnits="userSpaceOnUse"><image xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAADbCAAAAAD8Vhi/AAAAAXNCSVQI5gpbmQAABJhJREFUaIHtm9uS2zgOhvEDJHWw3Yck+wD7/q+W6XZs60QSwF44k+3MtLpr53KLX5VvJPErAIYoXEj4t5lv21LoHwMQEZH/c0Oj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaPx/wsQ7Z8Lni8FkAAAntnde2cZn6wl8v4qhRE5OpP+bQgAQmEBwclKYk/8ey4cKZgbAxMx0T6ISFXJXf/MS+ge1EGIWMJgFAQQz8lh/xkL6y7EfBYQCc2DhyCIMruRatVKpFdX8V0X2ogAzmBNSkJREJIDNtWjdKgtrUHP7RMEQiMQQ05C6jkMAyHKxbVtz4WyobOUjBQAWhBSHvh+7vku9MJFuZdvWZVlYMtyJbV8BIQ4IqRsO43E8DkPfcyCrZVvn6xxjXDhTQaju+4lARFJ3OB2ODw+n4zh0Qcjrti63wzVNgRxEWpnqvoIRUnc4PpyeH58eTqe+i0JW8zrfLufxNYDYlUxUdEfBAglxOJwev3z5+vx4OvZdYHjN23w9DL0ATmrZ3HW3FiQxdsN4fPr67duXx9PYJwGolryMXRIiqqpuqqxs7yuEJYRhPD4+P//r29PjcUiBATfNfRcjyLSUXDcRB3YUxEFiPx6fnr8+Pz89jF0AE9w9psjslvOyLmv0Cjb4+4kEkZT64+nh8fHh4ZASA0TkzgB5ycsyLdNaKjP7Ti2EOKQuDcfT6XQcusiMe4kswTVv83Tp+m5hqSDWndaSmOIwDuNh6KMI/rwZ2YJ14zKOfdenKMLOjp0NkUMIXdenrovxvwYiQELquq7vQgAzGLSzpzIzJLCkEN4KiAAWSTGmKMIEwMDvK4B7ewnzX68AM7EIM1iciMh2EoGZE9zx969s3O8/un+B4zuJuMLNVGutZr+fMndTVf15fLcWruY1l1Jy0d+2a3fXkreSS9Vancjd31WYudZStmXdcq5vJO5Wy7Zty5Jrra5Ge63l5prLOq/TvPSRQbh3J5nXsq7TPC3Lurm6qe/dI6S15nW+Hq5DDEyJAZCTW93m6Xq7TnPeSi7m5k7ynkAYBIkcUxC5ryZzMy15uf14/f7Hy+uPy7zUWn1XAefAHIQFANzNTauWbZ2u55c/Xr6fX8+3daumaju1UIhmTlOM4qRlPfQpEFxznqcfr99fzufLtBVTJd8tJ1XUuoDhpusyj2MXwFbzNt/O55fXl5frsm7V1AHfKaehAORw17Iut8PYBYHVbZ1vl8v5/HqZt1yqqu9GYWCqALGr1nW+HLuUAt0V0+1yuc7LmmvR+5TwfhRemUDuppqnqR/6FIVM87rO83xd1jnnrOb3Jt9LBK7m5rWs/dx1XRQhU83rtmzTtpVSVJU+eCASkZFzBWqp29KnEIKQVa1bziXnejf87Pvd+UIgTBKihJACiwiZei21Fqu1uJvpZwqCMLFIEBZhFocSqVqtZmqu/mu++GjWYhaCsDAEBCJ3dTM1c3s7sX00dxrByWH05/5oRm5m7r/NjR8PjRCi+3KwE5mzm7sZ3m5Dn82dRAwQyMXp/ic6/WUE/lxBBGIyAu6Ov+3H/wG5LNpDfU+nuAAAAABJRU5ErkJggg==" width="1" height="1" image-rendering="optimizeSpeed" preserveAspectRatio="none"/></mask><mask id="f" width="1" height="1" x="0" y="0" maskUnits="userSpaceOnUse"><image xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAADbCAAAAAD8Vhi/AAAAAXNCSVQI5gpbmQAABJhJREFUaIHtm9uS2zgOhvEDJHWw3Yck+wD7/q+W6XZs60QSwF44k+3MtLpr53KLX5VvJPErAIYoXEj4t5lv21LoHwMQEZH/c0Oj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaPx/wsQ7Z8Lni8FkAAAntnde2cZn6wl8v4qhRE5OpP+bQgAQmEBwclKYk/8ey4cKZgbAxMx0T6ISFXJXf/MS+ge1EGIWMJgFAQQz8lh/xkL6y7EfBYQCc2DhyCIMruRatVKpFdX8V0X2ogAzmBNSkJREJIDNtWjdKgtrUHP7RMEQiMQQ05C6jkMAyHKxbVtz4WyobOUjBQAWhBSHvh+7vku9MJFuZdvWZVlYMtyJbV8BIQ4IqRsO43E8DkPfcyCrZVvn6xxjXDhTQaju+4lARFJ3OB2ODw+n4zh0Qcjrti63wzVNgRxEWpnqvoIRUnc4PpyeH58eTqe+i0JW8zrfLufxNYDYlUxUdEfBAglxOJwev3z5+vx4OvZdYHjN23w9DL0ATmrZ3HW3FiQxdsN4fPr67duXx9PYJwGolryMXRIiqqpuqqxs7yuEJYRhPD4+P//r29PjcUiBATfNfRcjyLSUXDcRB3YUxEFiPx6fnr8+Pz89jF0AE9w9psjslvOyLmv0Cjb4+4kEkZT64+nh8fHh4ZASA0TkzgB5ycsyLdNaKjP7Ti2EOKQuDcfT6XQcusiMe4kswTVv83Tp+m5hqSDWndaSmOIwDuNh6KMI/rwZ2YJ14zKOfdenKMLOjp0NkUMIXdenrovxvwYiQELquq7vQgAzGLSzpzIzJLCkEN4KiAAWSTGmKMIEwMDvK4B7ewnzX68AM7EIM1iciMh2EoGZE9zx969s3O8/un+B4zuJuMLNVGutZr+fMndTVf15fLcWruY1l1Jy0d+2a3fXkreSS9Vancjd31WYudZStmXdcq5vJO5Wy7Zty5Jrra5Ge63l5prLOq/TvPSRQbh3J5nXsq7TPC3Lurm6qe/dI6S15nW+Hq5DDEyJAZCTW93m6Xq7TnPeSi7m5k7ynkAYBIkcUxC5ryZzMy15uf14/f7Hy+uPy7zUWn1XAefAHIQFANzNTauWbZ2u55c/Xr6fX8+3daumaju1UIhmTlOM4qRlPfQpEFxznqcfr99fzufLtBVTJd8tJ1XUuoDhpusyj2MXwFbzNt/O55fXl5frsm7V1AHfKaehAORw17Iut8PYBYHVbZ1vl8v5/HqZt1yqqu9GYWCqALGr1nW+HLuUAt0V0+1yuc7LmmvR+5TwfhRemUDuppqnqR/6FIVM87rO83xd1jnnrOb3Jt9LBK7m5rWs/dx1XRQhU83rtmzTtpVSVJU+eCASkZFzBWqp29KnEIKQVa1bziXnejf87Pvd+UIgTBKihJACiwiZei21Fqu1uJvpZwqCMLFIEBZhFocSqVqtZmqu/mu++GjWYhaCsDAEBCJ3dTM1c3s7sX00dxrByWH05/5oRm5m7r/NjR8PjRCi+3KwE5mzm7sZ3m5Dn82dRAwQyMXp/ic6/WUE/lxBBGIyAu6Ov+3H/wG5LNpDfU+nuAAAAABJRU5ErkJggg==" width="1" height="1" image-rendering="optimizeSpeed" preserveAspectRatio="none"/></mask><mask id="x" width="1" height="1" x="0" y="0" maskUnits="userSpaceOnUse"><image xlink:href="data:image/png;base64,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" width="1" height="1" image-rendering="optimizeSpeed" preserveAspectRatio="none"/></mask><path class="logo-rector-word" d="M18 22.7q0 5.3-4.2 6.8l5.6 8h-6.1l-5-7.1H5v7H0v-22h8.4q5.2 0 7.4 1.7 2.2 1.8 2.2 5.7zM8.6 26q2.5 0 3.4-.8 1-.8 1-2.6t-1-2.5q-1-.7-3.3-.7H5V26zM39 15.3v4.4H28v4.6h10v4.2H28v4.6h11.4v4.4H23.1V15.3zM54 33q3.6 0 5.9-2.9l3.2 3.3q-3.8 4.2-9 4.2-5 0-8.4-3.2-3.3-3.2-3.3-8.2 0-5 3.4-8.2 3.4-3.3 8.3-3.3 5.4 0 9.1 4.1l-3 3.5q-2.4-2.9-6-2.9-2.7 0-4.7 1.9-2 1.8-2 4.9 0 3 1.9 5 2 1.8 4.6 1.8m22.5-13.5v17.9h-5v-18h-6.2v-4.2h17.5v4.3zm26.2 6.7q0-3-1.9-5.1-1.9-2.1-4.7-2.1-2.7 0-4.6 2.1-2 2-2 5t2 5.1q1.9 2 4.6 2 2.8 0 4.7-2 2-2 2-5m1.6 8.1q-3.3 3.3-8.3 3.3-4.9 0-8.2-3.3-3.4-3.3-3.4-8.2 0-4.8 3.4-8.1 3.3-3.3 8.2-3.3 5 0 8.3 3.3 3.4 3.3 3.4 8.1 0 5-3.4 8.2M130 22.7q0 5.3-4.2 6.8l5.6 8h-6.1l-5-7.1H117v7h-5v-22h8.5q5.2 0 7.4 1.7 2.2 1.8 2.2 5.7zm-9.4 3.4q2.5 0 3.4-.8 1-.8 1-2.6t-1-2.5q-1-.7-3.3-.7h-3.8v6.6z"/><path fill="#74c079" d="m166.2 31.7 4.4 14.9h14.9v-34l-19.3-11z"/><path fill="#7c4c40" d="M160.9 31.2v15.4h5.4V31.2z"/><g clip-path="url(#c)" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"><path fill="#e3e3e3" d="M410.6 1.6c-.9 2.9-.6 4.4-.3 7.4.4 2.8.7 5-.9 7-2.1 2.8-3.2 2.2-1.6 5.6.7 1.6 1.1 1.4 1.3 3.1 0 1.2-.3 2.5-.4 3.6-.3 2.5-.7 5.4-.4 8 .8 5.7 3.5 9 1.3 15-2.1 5.8 0 10.6-.3 16.6-8 2.7-1.4 10.8-1.3 15.8 0 3.4-1.4 6-.4 9.6.7 2.7 2.1 6.7 4 8.4.4 2.3-1.5 4.2-1.6 6.6 0 2.6.5 5.5 2.2 7.4-1.6.8-3 3.6-3.3 5.2-.6 3 1.2 3.8 1.7 6 1 4.8-.9 9-.6 13.8.2 2.6 1.6 3.7 1 6.3-.5 2.4-2.5 3.7-2 6.3.4 2.3 3.1 3 3.7 4.7.8 2.3-1.5 4.2-2 6.3-.6 2-.2 3.9.6 5.8.5 1.3 3.2 1.8.4 3-.8 2.8 0 4.3 2 6.2-2.5 3.5-3.2 7-4 11-.7 3-2.5 6.6-2 9.7.4 1.9 1.5 3 1.6 5 .1 1.7-.9 3.2-1.2 4.7-1 4.4.9 4.6 2.5 8 1.5 3.1-1 5-1.9 7.7-.8 2.7.3 5.4 0 8.3-.3 2.6-2.2 4.5-1.1 7 .8 2 3.6 3 4 5 .6 1.9-1 4.9-1.6 6.6-1 3.1-.9 4.5 0 7.7 1.2 5.2-.9 10.6-.7 16.3.2 6 1.7 10.4 0 16-1.7 5.8 3.8 8.2 2.7 14-.5 2.6-1.9 4.7-2.3 7-.6 2.7.2 5.8-.4 8.3-1 4.6.2 11.3-1.7 15.7l-.6.3c1 1.5 4.4 4.3 6.3 4.3 2.6-2.9 8.3-3.3 12-2 2.4.8 3.5 3.5 6 3.7 1.9.1 3.8-1.6 5.3-2.3 7-3.4 14.4.2 21.4.7 3.2.2 6.5.2 9.7 0 1.3 0 2.7 0 4-.4.4-.2 1.7-1.9 2.5-2 2.2-.4 2 .8 3.8 1.5 1.8.7 2 .6 4 .6 3 0 6.2-.3 9.3 0 2.9.2 5.7 1 8.7.6 2.7-.3 5-1.5 7.7-1.6 4.8-.3 8.8 2.7 13.3 4v667.5L73.5 757.4 75 0h336.3l-.7 1.6"/></g><image xlink:href="data:image/png;base64,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" width="1" height="1" image-rendering="optimizeSpeed" mask="url(#d)" preserveAspectRatio="none" transform="matrix(2.92153 0 0 9.69418 161.273 31.235)"/><g clip-path="url(#e)" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"><path fill="#b72222" fill-rule="evenodd" d="M305 1013V912c-4.6-1.8-9.5-3-13.6-5.7-4.3-2.6-7.7-6.6-11.5-10-3-2.5-5.4-6-8.8-7.6-15.3-7.3-31-13.8-46.2-21.2-7-3.4-13.5-8.3-20.3-12.4l-20.4-12.6v80.2c0 3.2-.7 6.5.1 9.5.7 2.7 2.5 5.9 4.7 7.1 1.4.8 4.7-1.6 6.9-3 1-.5 1.3-2.1 1.9-3.3l2.2.5c2.4 4.7 4.5 9.6 7.4 14 2 3.1 4.7 6.7 8 8 2.8 1.2 4.8 2.2 4.7 5.1-.3 6.5 5.1 10.1 7 15.5.1.6 1.2 1.4 1.8 1.3 4.1-.2 3.5 2.3 3.9 5.2.4 3.2 2.3 6.3 3.6 9.4 1 2.4 2.5 4.6 3.4 7 3.5 9.4 5.4 14.4 16.3 14 16.3-.6 32.6 0 48.9 0"/><path fill="#952e2e" d="m217.4 894 2 2.3c0 .2.2.3.3.4a9 9 0 0 1-2.3-2.7m17 54.3c1.6-2.3 5.7-5 5.9-7.6-1.8-.2-3.2 1.3-4.7 1.9-1.7.6-3 .7-5 .7-3.4 0-7.7.4-10.5 2.4 1-.3 1.2.3 1.7.5 1.3 2.5 1.4 4 1.6 7a19 19 0 0 1 5 2.8c2.7-.9 4.2-5.2 6-7.7m15 42.4c4.8 7.1 7.3.6 11.6-2.4 4.4-3 11.5-1 14.6 3-2.7.4-6-2.2-9-2-2.5.2-3 1.4-4.3 3.4-1.5 2.5-4.1 9.8-8.7 6.4 1.6 3.8 4.4 7 1.1 11-1.5 1.8-6 4.3-8.6 3.9-1.4-2.3-1.9-4-2.8-6.3-.8-2.3-2.8-3.5-4-5.4-1.2-2-1-5-2.5-7-1.6-2-5-2.1-6.4-4.4-1.2-1.9-.2-5.6-.1-7.6.2-5.1-1-2.6-4.3-4.6-2-1.3-1.7-4-3-6-1.4-1.8-4-3-4.7-5.4-.7-2.7 1.8-5.4-1-7.6-2.1-1.6-7-1.5-9.6-2.7-6-3-2-7.6-4-12.3-.7-1.5-2.7-5.1-3.6-6.1-2-2.3-3.3-1.8-5.6-.3-2.3 1.6-2.6 3.7-5.8 3.4-3.3-.4-4-2.2-4.7-4.7 0-.3 0-.4-.3-.3l-.5-1.3c0-2.8.2-2.5.8-5 2 1.7 3.5 3.8 5.4 5.6 1.8-2 2.3-4.1 5-5.3 2.3-1 5.3-.7 8-.7 4.7 0 7.9-3.2 12-6 1.1-1 5.8-3.4 6.3-4.7 1-2.4-2-4.7-2.4-7-.5-3.9 3-5.7 3.7-9 .6-2.4-.9-4.7-2.3-6.6 4.2 3.7 5.3 11.1 5.9 9.1.8-2.8 1.5 5.6 1.1 8.3-.4 3.3.2 5.6-1.4 8.5-1.2 2-4.3 7-6.6 7.5-1.8 3.2-7.8 11.5.9 9.5 2.8-.6 5.2-2.8 8-3.6 3.5-1 6.8-.8 10.4-1 5-.3 10-3.2 8.6-9.3-.7-3-1.3-4-1-7.4a22 22 0 0 0-.3-8.9c4 5 .4 11 5.4 14.3 6 4 4.2 8.5-1.7 11.6-4.6 2.5-3.2 8-6.3 12.1l-4.4 6.5c-1.3 1.7-3.4 3.1-4.5 5.2-.7 1.1-1.2 1.8-1 3.2 1.4.7 3.2 2.2 4 3.7 4.1-8.5 12.7-7.6 19-13 2.6-2.3 3-5.6 5.9-7.7 2.5-1.7 6.4-4 9.9-3.9-2.4 2.4-6 3-8.2 5.7-1.4 1.7-2 3.7-2.7 5.6-2.1 4.9-6.9 7-11 10.2-2.2 1.6-4 3.1-5.4 5.4-1.8 2.6-1.3 3.3-1 6.4.6 5.7 2.7 11 6 16"/><path fill="#9a9a9a" d="m521 1048 516-304.5-18-28.5-498 292.7z"/><g fill-rule="evenodd"><path fill="#6e1f1f" d="M520 325h82.3V17H520z"/><path fill="#6e1f1f" d="M520 17h82.3v308H520v19.9h104V0H520z"/><path fill="#9d2e2e" d="M520 276.2v8h72.1v32.9H520v8h82.6V17.2H520v144.4h72.1v32.9H520v8h72.1v32.9H520v8h72.1v32.8z"/><path fill="#75d5eb" d="M520 317h72.1v-32.8H520zm0-40.8h72.1v-32.9H520zm0-40.8h72.1v-33H520zm0-41h72.1v-32.8H520z"/></g></g><image xlink:href="data:image/png;base64,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" width="1" height="1" image-rendering="optimizeSpeed" mask="url(#f)" preserveAspectRatio="none" transform="matrix(2.92153 0 0 9.69418 161.273 31.235)"/><g clip-path="url(#g)" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"><path fill="#fff" d="M866 459.7H638v245.6h228z"/><path fill="#75d5eb" d="M853 471H650.3v221.3H853z"/><path fill="#fff" d="M894.7 100h-228v245.7h228z"/><path fill="#75d5eb" d="M881.7 111.3H679v221.4h202.7z"/></g><path fill="url(#h)" d="M426.3 187.7h85.4v136.6h-85.4z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#i)" d="M425.7 0H511v176h-85.3z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#j)" d="M433 148.3a12.7 12.7 0 1 1 25.3 0 12.7 12.7 0 0 1-25.3 0" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><g clip-path="url(#k)" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"><path fill="#a7a7a7" d="M349.8 796.2c-5.9 3.2-9.9 6.7-11.8 11.5-5.4 2.2-11 5.8-13.7 9.1-4.7 6 1.6 16.6 8 19.2 6.2 2.5 10.3.8 14.1-1.7 3 1.1 6.3.7 10-2.3v.7a53.2 53.2 0 0 0 2.8-3.3 49 49 0 0 0 11.1-26c.8-15.1-10.6-12.5-20.5-7.2M473.7 774c.6-3.8-1.1-6.8-5.4-8-9.5-2.7-20.7 5-30.5 5.2a84.1 84.1 0 0 0-32.8 7.3c-4.8 2-15.7.6-20 3.6-3.1 2.2-4.3 9.7-5.4 13.2-1.4 4.7-3.5 9.9-4 14.7-.5 5.6 1.3 11.2.6 16.6-7.7 2.3-9.6 9.3-.4 12.1-16 3.5-2.4 26 1.9 35.3 2.6 5.7 8.6 9.5 13.1 14.8 3 3.6 5.3 4.9 4.7 9-.4 2.9-4.2 4.1-3 8.8 3 .8 6 1.3 9 2.2.4 5.9 2 10.8 2 16.4 0 6.6-4 8.7-6.5 14.1l-1-.7c.3 1.3-.5 2.7-3.5 4.2-6.4 3.2-17-1.2-23-3.6a151.7 151.7 0 0 1-39.4-24.6c-9-7.4-16.5-15.5-27.8-19a422.5 422.5 0 0 1-78.7-34.6c-19.8-11.1-45-26.3-56.5-46.9 7.2-6 20.5-1.9 29.2-2.7 7.4-.8 24.7 3.2 30.7-2 3.2-2.9.3-9.8 4.1-12.6 4.5-3.2 9.3 3 11.8 6 2.8 3.7 3.6 10.4 8.1 11.9 2.6.8 5.3-1.5 8-1.4 2.3 0 5 1.7 7.3 2 11 1.6 14.8-8.7 24.7-9.3 5-.3 11 1 16 0 4.7-1 7.1-7.4 12.7-4.5 3.4 1.8 2.3 5.5 6.6 4.5 1.8-.4 3.4-3.4 4.6-4.7 2.8-3.3 4.9-6.7 8.3-9.8 4-3.6 8-5.1 12.5-6.8 2.7-1 3.5-2.2 7.3-2.7 2.2-.2 6.5 1 8 .5a31 31 0 0 0 10.1-7.7c4.3-4.8 2.9-8.6 2.6-14.8-.3-5.9.3-9.8.6-14.7.3-4.8-4.2-10.3-2.5-13.8 5-9.6 15.6 13.7 14.5 19.9-.7 4.3-6.4 9.2-4.7 14 2 5.6 6.8 1.8 10.8-.5 3.8-2.4 8.8-5.7 13.3-6.2 6-.8 10 2.3 16-.8 11.7-6.3 11.2-17.5 12.1-29.2 6.3 5.2 7.5 12.5 5.8 20.5-1.6 7.6-7.8 9.5-10.5 16 11 .5 20-5.5 30.6-4.5 3.8.3 11.8.8 12 6 0 2.7-2.2 4.9-4 7.3M198 452.4c-5 3.7-6.7 9.9.6 12.8 4.8 1.9 12.4.3 17.3-.2 11-1 26.4.6 36.2-5.2 1-.5 1-.5 1.8-1.5l1.3.7c-7.1-9.2-12.5-12.8-24.5-13.3-10.5-.5-24.2.6-32.7 6.7m236-66.2c-2 1.3-4.3.4-6 1.4-3.6 2.3-5.3 6.5-9.2 8.1-8.4 3.4-18.7-2.1-26.7-3.4-8.3-1.2-21.4-5.7-29.2-.5-3.2 2.1-4.2 6.3-8.2 8.4-4 2-8.4 2.1-13.2 2.3-4.2 9.6-14.7 11-24 13-4.7 1-10.1 4-14.9 4-4.6.1-9.2-1.7-13.8-2.6-10.8-2.3-20.2-8-31.4-.7-4.5 3-5.2 7.5-6.5 12.3-1.4 5.3-2.6 8.6 3.2 11.3 5.3 2.6 11.7.2 17.3 1.2 6.1 1 7.2 5.5 12.2 8.7 8.4 5.5 25 .3 29 11.2-8 .7-16 3.7-24.6 4.1-12 .6-24 2.1-35.9 2.7-21.6 1-45.3 3-65.3-2l-4.7-3.4c-2.2-10.3 13-14.8 20-17.3a90.8 90.8 0 0 0 25.5-15.9c7.6-6.4 15.9-15.1 25.2-20.1a32 32 0 0 1 28.1-2.1c8.8 2.8 19.7 6.8 28.4 2.6 8.3-4 17-7.8 26-10.7 4-1.2 9.7-1.4 13.5-3.6 5.7-3.3 3-9.2 7.4-12.8 6.3-5.1 25.5.5 31.9 2.6 7.7 2.6 18 4.1 26.7 3.3 7.8-.7 14.6-3.8 21.9-5.8-.6.7-2 3.2-2.7 3.7"/><path fill="#994343" d="M521 1048 .4 753.2l17.2-30.4 521 295z"/><path fill="#775553" d="M250.5 3c-2.2 3.8-2.5 9.4-5.8 12.2-7.3 6-22.2-2-30.7-2.2-12.4-.2-20.8 7.3-32.7 8.7-13.6 1.5-21.1 1.8-21.4 17.2-4.7-1.5-17-2.8-21.2 0-4.5 3-1.9 11-4.7 15.6-4.2 7-10.8 3.8-17.3 7.7-4.2 2.5-5.8 8.4-6 14-12-3-10.3 8-16.2 14.8-5 5.7-13.7 6.5-19.5 9.8V0h177.3a58.4 58.4 0 0 0-1.8 3"/><path fill="#7c4c40" d="M370.7 101.7h-228v244.6h228zm38 358.3h-228v244.7h228z"/></g><path fill="url(#l)" d="M74.8 0h48v15.3h-48z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#m)" d="M129.3 0H174v15.3h-44.7z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#n)" d="M74.8 22.3h29.4v15.4H74.8z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#o)" d="M74.8 44.5h12v15.3h-12z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><g clip-path="url(#p)" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"><path fill="#51c4de" d="M250.3 261.7h-96v72h96zm108-.4h-96v72h96zm0-148h-96V250h96zm-108-.3h-96v136.7h96z"/><path d="M288.3 619.7h-96v72h96z"/><path fill="#51c4de" d="M396.3 620.3h-96v72h96zm0-148h-96V609h96zm-108-.3h-96v136.7h96z"/></g><path fill="url(#q)" d="m226.8 15.3-5.5-1.4V0h30.2v1.4l-.8 1.3c-2.2 3.8-2.5 9.4-5.8 12.2a8.2 8.2 0 0 1-.6.4z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#r)" d="M179.3 15.3V0H216v13.4a18 18 0 0 0-2-.2c-4.4 0-8.4.9-12.1 2.1z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#s)" d="M156.4 38a39.1 39.1 0 0 0-15.4 0h-30.3V22.7h48V38z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#t)" d="M92 60V44.7h44.1c-.4 3.3-.2 7.2-1.8 10-2.6 4.2-5.9 4.7-9.6 5.3z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#u)" d="M74.8 79.8V64.5H103v12.3c-1.1.7-2 1.8-2.7 3z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><path fill="url(#v)" d="M75 100V84.7h23c-1 2.3-2 4.7-3.7 6.8-4.2 4.9-11 6.1-16.5 8.5z" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"/><g fill-rule="evenodd" clip-path="url(#w)" transform="matrix(.04427 0 0 -.04427 143.301 46.551)"><path fill="#51c4de" d="m246.7 679-3.1 11-1 .2-4.1-17.2h-.9l-3.5 18.7h27l-4-9.8-5.8 10z"/><path d="m305.7 135 6.2 26-29.4-2.2-.2 1 26.4 8v.8l-27.4 5.2.1 1 31.7 1.7-6.5 15 1.1.5 11.2-14.2 17.8 16.3.8-.6-10.7-24.2 21.6-13.4-.4-1.2c-5.4 1-10.9 1.4-16.1 2.9-5.7 1.5-9.5.5-12.6-5-3.5-6.3-8.2-12-12.4-18l-1.2.4"/></g><image xlink:href="data:image/png;base64,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" width="1" height="1" image-rendering="optimizeSpeed" mask="url(#x)" preserveAspectRatio="none" transform="matrix(22.8411 0 0 14.78474 166.364 .16)"/></svg> </a></div> </div> <div class="doc-backer doc-backer-release"> <div class="backer_logo"><a class="link stretched-link" href="https://jolicode.com" target="_blank" rel="noopener"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 395.505 91.806" class="backer-logo-jolicode"> <style> .backer-logo-jolicode path.jolicode-logo-letter { fill: #2b2b2a; } .dark-theme .backer-logo-jolicode path.jolicode-logo-letter { fill: #FFFFFF; } </style> <g transform="matrix(1.25 0 0 -1.25 -174.487 572.131)"> <path class="jolicode-logo-letter" d="M201.208 440.446v.063l-.007-.002a2.967 2.967 0 01-5.912-.48h-.002v-41.854c0-2.17-.776-4.033-2.331-5.587-1.554-1.555-3.368-2.332-5.44-2.332-2.393 0-4.366.777-5.921 2.332-1.53 1.505-2.32 3.403-2.368 5.7v17.417h-.01l.002.055a2.962 2.962 0 01-3.084 2.827 2.957 2.957 0 01-2.826-2.896h-.004v-17.516c0-3.797 1.358-7.079 4.07-9.843 2.666-2.714 5.97-4.07 9.919-4.07 3.849 0 7.13 1.356 9.844 4.07 2.713 2.715 4.07 5.994 4.07 9.843v41.873c.008.13.01.26 0 .391v.01M260.363 446.628c1.01 0 1.868.364 2.578 1.093.71.73 1.065 1.596 1.065 2.606 0 1.027-.355 1.896-1.065 2.605-.728.73-1.588 1.093-2.578 1.093-1.009 0-1.869-.364-2.578-1.093a3.591 3.591 0 01-1.065-2.605c0-1.029.353-1.9 1.065-2.62a3.487 3.487 0 012.578-1.079M198.173 454.025c-1.009 0-1.869-.364-2.579-1.093a3.598 3.598 0 01-1.064-2.605c0-1.029.354-1.9 1.064-2.62a3.49 3.49 0 012.58-1.079c1.008 0 1.867.364 2.577 1.093.711.73 1.065 1.596 1.065 2.606 0 1.027-.354 1.896-1.065 2.605-.728.73-1.588 1.093-2.578 1.093M226.212 413.086c-.05-2.294-.84-4.194-2.37-5.697-1.578-1.555-3.403-2.332-5.476-2.332-2.145 0-4.057.777-5.736 2.332-1.652 1.528-2.48 3.428-2.48 5.697v13.619c.025 2.122.803 3.947 2.333 5.478 1.554 1.553 3.367 2.33 5.439 2.33 2.369 0 4.342-.777 5.92-2.33 1.53-1.506 2.32-3.405 2.37-5.7v-13.397zm-8.067 27.423c-3.85 0-7.13-1.358-9.843-4.072-2.715-2.714-4.071-5.994-4.071-9.843v-13.618c0-3.85 1.356-7.131 4.07-9.845 2.714-2.714 5.995-4.07 9.844-4.07 3.847 0 7.14 1.356 9.88 4.07 2.738 2.714 4.108 5.996 4.108 9.845v13.618c0 3.849-1.37 7.129-4.108 9.843-2.74 2.714-6.033 4.072-9.88 4.072M373.107 419.822v6.771c0 2.171.777 4.035 2.332 5.59 1.553 1.553 3.367 2.33 5.438 2.33 2.371 0 4.343-.779 5.923-2.337 1.43-1.409 2.205-3.153 2.33-5.23l-16.023-7.124zm21.98 6.771c0 3.998-1.37 7.278-4.106 9.844-2.886 2.714-6.18 4.072-9.88 4.072-3.849 0-7.13-1.358-9.846-4.072-2.713-2.714-4.069-5.994-4.069-9.844v-13.618c0-3.848 1.356-7.13 4.07-9.844 2.714-2.714 5.996-4.07 9.844-4.07 3.847 0 7.031 1.333 9.55 3.997 2.957 3.158 4.437 6.464 4.437 9.917v2.32a2.972 2.972 0 01-2.97 2.941 2.974 2.974 0 01-2.938-2.524l-.012.003v-.096a2.98 2.98 0 01-.024-.355 3 3 0 01.024-.357v-1.82c-.05-2.295-.839-4.196-2.367-5.699-1.58-1.554-3.406-2.332-5.478-2.332-2.368 0-4.33.795-5.883 2.387-1.555 1.591-2.332 3.557-2.332 5.9l21.98 9.772v3.478zM358.912 413.086c-.05-2.294-.84-4.194-2.368-5.697-1.58-1.555-3.405-2.332-5.476-2.332-2.147 0-4.059.777-5.738 2.332-1.652 1.528-2.48 3.428-2.48 5.697v13.619c.026 2.122.803 3.947 2.333 5.478 1.555 1.553 3.368 2.33 5.44 2.33 2.368 0 4.341-.777 5.921-2.33 1.527-1.506 2.318-3.405 2.368-5.7v-13.397zm2.988 44.048a2.967 2.967 0 01-2.967-2.871l-.02-.001V437.99c-2.345 1.678-5.033 2.518-8.068 2.518-3.849 0-7.128-1.358-9.843-4.072-2.714-2.714-4.07-5.994-4.07-9.843v-13.618c0-3.85 1.356-7.131 4.07-9.845 2.715-2.714 5.994-4.07 9.843-4.07 3.848 0 7.143 1.356 9.88 4.07 2.74 2.714 4.11 5.996 4.11 9.845v40.732c.021.149.037.299.037.454a2.972 2.972 0 01-2.972 2.972"></path> <path class="jolicode-logo-letter" d="M328.538 413.086c-.05-2.294-.838-4.194-2.368-5.697-1.58-1.555-3.403-2.332-5.476-2.332-2.147 0-4.059.777-5.738 2.332-1.652 1.528-2.48 3.428-2.48 5.697v2.235c.003.07.012.138.012.208v3.072l-.012-.004v8.108c.026 2.122.803 3.947 2.333 5.478 1.555 1.553 3.368 2.33 5.44 2.33 2.37 0 4.341-.777 5.921-2.33 1.53-1.506 2.318-3.405 2.368-5.7v-13.397zm-8.067 27.423c-3.849 0-7.128-1.358-9.843-4.072-2.714-2.714-4.069-5.994-4.069-9.843v-11.365c-.046-2.877-1.099-5.333-3.174-7.36-2.122-2.098-4.65-3.144-7.587-3.144-2.985 0-5.527 1.046-7.624 3.145-1.91 1.91-2.94 4.174-3.11 6.784v1.282l-.034-.004v22.688c0 2.96 1.047 5.483 3.144 7.568 2.097 2.085 4.64 3.127 7.624 3.127 2.936 0 5.465-1.048 7.587-3.145.863-.855 1.786-2.264 2.541-3.608a2.893 2.893 0 015.138 2.644l.007.004c-.806 1.772-1.962 3.413-3.469 4.919-3.207 3.233-7.14 4.848-11.804 4.848-4.614 0-8.549-1.61-11.804-4.828-3.257-3.22-4.886-7.1-4.886-11.638v-22.982c0-.24.023-.467.032-.703-.027-3.936-.802-5.606-2.329-7.252-1.553-1.68-3.367-2.517-5.44-2.517-2.368 0-4.342.777-5.92 2.332-1.53 1.503-2.319 3.403-2.369 5.697v27.423l-.016-.002v.036a2.953 2.953 0 11-5.9-.25c0-.01.003-.02.003-.032h-.007v-26.904l-.025-.011c0-2.172-.777-4.095-2.332-5.772-1.554-1.68-3.368-2.517-5.44-2.517-2.369 0-4.34.777-5.92 2.332-1.53 1.503-2.32 3.403-2.368 5.697v41.468c.003.062.01.123.01.186a2.965 2.965 0 01-5.93 0v-.01h-.003v-41.754c0-3.85 1.37-7.131 4.11-9.845 2.738-2.714 6.031-4.07 9.88-4.07 3.847 0 7.128 1.356 9.843 4.07.413.414.785.848 1.135 1.286.355-.438.73-.872 1.147-1.286 2.738-2.714 6.032-4.07 9.881-4.07 3.85 0 7.13 1.356 9.843 4.07a14.8 14.8 0 011.758 2.11c.386-.467.795-.926 1.243-1.37 3.23-3.206 7.166-4.81 11.804-4.81 4.613 0 8.548 1.61 11.804 4.83.45.445.861.906 1.25 1.376a15.002 15.002 0 011.776-2.136c2.715-2.714 5.994-4.07 9.843-4.07 3.848 0 7.143 1.356 9.882 4.07 2.737 2.714 4.107 5.996 4.107 9.845v13.618c0 3.849-1.37 7.129-4.107 9.843-2.739 2.714-6.034 4.072-9.882 4.072"></path> <path d="M433.546 396.935c-.69 0-1.38.262-1.905.788a2.697 2.697 0 000 3.81l17.846 17.847-17.846 17.847a2.695 2.695 0 103.812 3.811l19.752-19.752a2.692 2.692 0 000-3.811l-19.752-19.752a2.687 2.687 0 00-1.907-.788M162.037 397.637c-.69 0-1.378.263-1.905.789l-19.753 19.752a2.695 2.695 0 000 3.811l19.752 19.752a2.694 2.694 0 003.81 0 2.694 2.694 0 000-3.811l-17.846-17.847 17.847-17.846a2.694 2.694 0 00-1.905-4.6M401.738 390.904a2.694 2.694 0 00-2.49 3.723l21.248 51.558a2.695 2.695 0 104.983-2.053l-21.248-51.557a2.695 2.695 0 00-2.493-1.67" fill="#e9ce37"></path> </g> </svg> </a></div> </div> <div class="doc-backer doc-backer-release"> <div class="backer_logo"><a class="link stretched-link" href="https://les-tilleuls.coop/" target="_blank" rel="noopener"><?xml version="1.0" encoding="utf-8"?> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1197.2 169.48" width="1197.2" height="169.48" style="enable-background:new 0 0 1197.2 169.48;" xml:space="preserve"> <style type="text/css"> .lestilleuls-logo-st0{fill:#EC4D28;} .dark-theme .lestilleuls-logo-wordmark-dark { fill: #fff; } </style> <g> <g> <g> <path class="lestilleuls-logo-wordmark-dark" d="M385.53,96.15h40v15h-40V96.15z"/> <path class="lestilleuls-logo-wordmark-dark" d="M505.53,139.48h-20v-22.26c0-11.99,8.31-21.77,20-24.41L505.53,139.48z"/> <path class="lestilleuls-logo-wordmark-dark" d="M745.53,137.09c-3.41,0.99-7.79,1.92-13.17,2.77c-5.37,0.85-11.02,1.28-16.93,1.28c-6,0-10-0.81-13.98-2.44 c-3.99-1.62-7.14-3.9-9.47-6.83c-2.33-2.93-3.99-6.43-4.97-10.49c-0.99-4.06-1.48-8.53-1.48-13.4V67.82h20v37.75 c0,6.49,0.85,11.19,2.56,14.07c1.7,2.89,3.89,4.33,8.56,4.33c1.43,0,2.96-0.07,4.58-0.2c1.62-0.13,3.05-0.29,4.31-0.47V67.82h20 V137.09z"/> <g> <path class="lestilleuls-logo-st0" d="M1054.11,136.58c-5.77-3.05-10.31-7.4-13.61-13.07c-3.3-5.66-4.96-12.28-4.96-19.86 c0-7.49,1.67-14.09,5.02-19.79c3.35-5.71,7.93-10.08,13.75-13.13c5.82-3.05,12.34-4.57,19.56-4.57c7.23,0,13.75,1.52,19.56,4.57 c5.82,3.05,10.4,7.43,13.75,13.13c3.35,5.71,5.02,12.3,5.02,19.79c0,7.49-1.7,14.09-5.09,19.79 c-3.39,5.71-8.02,10.08-13.88,13.13c-5.86,3.05-12.41,4.57-19.63,4.57C1066.38,141.15,1059.88,139.63,1054.11,136.58z M1084.64,117.11c3.04-3.13,4.56-7.62,4.56-13.46c0-5.84-1.48-10.32-4.43-13.46c-2.95-3.13-6.59-4.7-10.91-4.7 c-4.41,0-8.06,1.55-10.97,4.64c-2.91,3.1-4.36,7.6-4.36,13.53c0,5.84,1.43,10.32,4.3,13.46c2.86,3.14,6.45,4.7,10.77,4.7 C1077.92,121.81,1081.6,120.25,1084.64,117.11z"/> </g> <g> <path class="lestilleuls-logo-st0" d="M969.11,136.58c-5.77-3.05-10.31-7.4-13.61-13.07c-3.3-5.66-4.96-12.28-4.96-19.86 c0-7.49,1.67-14.09,5.02-19.79c3.35-5.71,7.93-10.08,13.75-13.13c5.82-3.05,12.34-4.57,19.56-4.57s13.75,1.52,19.56,4.57 c5.82,3.05,10.4,7.43,13.75,13.13c3.35,5.71,5.02,12.3,5.02,19.79c0,7.49-1.7,14.09-5.09,19.79 c-3.39,5.71-8.02,10.08-13.88,13.13c-5.86,3.05-12.41,4.57-19.63,4.57C981.38,141.15,974.88,139.63,969.11,136.58z M999.64,117.11c3.04-3.13,4.56-7.62,4.56-13.46c0-5.84-1.48-10.32-4.43-13.46c-2.95-3.13-6.59-4.7-10.91-4.7 c-4.41,0-8.06,1.55-10.97,4.64c-2.91,3.1-4.36,7.6-4.36,13.53c0,5.84,1.43,10.32,4.3,13.46c2.86,3.14,6.45,4.7,10.77,4.7 C992.92,121.81,996.6,120.25,999.64,117.11z"/> </g> <path class="lestilleuls-logo-st0" d="M945.13,129.56c-2.09-3.58-3.67-7.44-4.77-11.55c-2.85,2.53-6.21,3.81-10.09,3.81 c-4.32,0-7.91-1.57-10.77-4.7c-2.86-3.13-4.3-7.62-4.3-13.46c0-5.92,1.45-10.43,4.36-13.53c2.91-3.09,6.56-4.64,10.97-4.64 c3.84,0,7.13,1.24,9.89,3.72c1.11-4.05,2.7-7.87,4.79-11.43c1.48-2.52,3.16-4.84,5.02-6.98c-0.04-0.02-0.09-0.05-0.13-0.07 c-5.82-3.05-12.34-4.57-19.56-4.57s-13.75,1.52-19.56,4.57c-5.82,3.05-10.4,7.43-13.75,13.13c-3.35,5.71-5.02,12.3-5.02,19.79 c0,7.58,1.65,14.2,4.96,19.86c3.3,5.66,7.84,10.02,13.61,13.07c5.77,3.05,12.27,4.57,19.5,4.57c7.22,0,13.77-1.52,19.63-4.57 c0.06-0.03,0.11-0.07,0.17-0.1C948.25,134.35,946.58,132.05,945.13,129.56z"/> <path class="lestilleuls-logo-wordmark-dark" d="M233.87,119.48h-35v-100c-12.51,4.03-20,16.13-20,29.33v90.67h55V119.48z"/> <path class="lestilleuls-logo-wordmark-dark" d="M410.53,19.48v20h35v100h20v-100l18.33,0c11.05,0,20-8.95,20-20v0L410.53,19.48z"/> <path class="lestilleuls-logo-wordmark-dark" d="M668.01,136.65c-1.08,0.54-2.53,1.08-4.33,1.62c-1.81,0.54-3.81,1.02-6.02,1.42c-2.21,0.41-4.58,0.74-7.1,1.02 c-2.53,0.27-5.05,0.41-7.58,0.41c-6.41,0-11.98-0.95-16.71-2.84c-4.74-1.89-8.66-4.49-11.77-7.78c-3.11-3.29-5.41-7.19-6.9-11.7 c-1.49-4.51-2.23-9.38-2.23-14.61c0-6.31,0.97-11.84,2.91-16.58c1.94-4.74,4.49-8.68,7.64-11.84c3.16-3.16,6.79-5.55,10.89-7.17 c4.1-1.62,8.32-2.44,12.65-2.44c10.1,0,18.09,3.09,23.95,9.27c5.86,6.18,8.8,15.27,8.8,27.27c0,1.17-0.05,2.46-0.14,3.86 c-0.09,1.4-0.18,2.64-0.27,3.72h-45.74c0.45,4.15,2.39,7.44,5.82,9.88c3.43,2.44,8.03,3.65,13.8,3.65c3.7,0,7.33-0.34,10.89-1.02 c1.11-0.21,2.17-0.44,3.15-0.68L668.01,136.65z M652.72,96.26c-0.09-1.71-0.39-3.38-0.88-5.01c-0.5-1.63-1.26-3.07-2.3-4.33 c-1.04-1.26-2.35-2.3-3.92-3.11c-1.58-0.81-3.54-1.22-5.89-1.22c-2.26,0-4.19,0.38-5.82,1.15c-1.62,0.77-2.98,1.78-4.06,3.04 c-1.08,1.26-1.92,2.73-2.5,4.4c-0.59,1.67-1.02,3.36-1.29,5.07H652.72z"/> <path class="lestilleuls-logo-wordmark-dark" d="M371.13,105.81c-1.67-1.84-3.95-3.56-6.83-5.15c-2.89-1.59-6.54-3.21-10.96-4.85c-2.17-0.81-3.95-1.57-5.35-2.25 c-1.4-0.68-2.5-1.31-3.32-1.9c-0.81-0.59-1.35-1.2-1.62-1.83c-0.27-0.63-0.41-1.35-0.41-2.16c0-3.52,3.16-5.28,9.47-5.28 c3.43,0,6.52,0.32,9.27,0.95c2.56,0.59,4.93,1.26,7.15,2.01V68.54c-1.61-0.43-3.42-0.84-5.46-1.23 c-3.97-0.77-8.12-1.15-12.45-1.15c-8.66,0-15.47,1.94-20.43,5.82c-4.96,3.88-7.44,9.16-7.44,15.83c0,3.43,0.49,6.36,1.49,8.79 c0.99,2.44,2.39,4.53,4.2,6.29c1.8,1.76,3.99,3.27,6.56,4.53c2.57,1.26,5.43,2.48,8.59,3.65c4.06,1.54,7.08,2.91,9.07,4.13 c1.98,1.22,2.98,2.64,2.98,4.26c0,2.07-0.77,3.47-2.3,4.19c-1.54,0.72-4.15,1.08-7.85,1.08c-3.52,0-7.08-0.38-10.69-1.15 c-1.91-0.41-3.79-0.89-5.65-1.46l-8.29,14.65c1.62,0.72,4.53,1.62,8.73,2.71c4.19,1.08,9.45,1.62,15.76,1.62 c9.65,0,17.12-1.8,22.39-5.4c5.28-3.6,7.92-8.91,7.92-15.93c0-2.97-0.34-5.58-1.02-7.83C373.97,109.7,372.8,107.65,371.13,105.81 z"/> <path class="lestilleuls-logo-wordmark-dark" d="M852.67,105.84c-1.67-1.84-3.95-3.56-6.83-5.15c-2.89-1.59-6.54-3.21-10.96-4.85c-2.17-0.81-3.95-1.57-5.35-2.25 c-1.4-0.68-2.5-1.31-3.32-1.9c-0.81-0.59-1.35-1.2-1.62-1.83c-0.27-0.63-0.41-1.35-0.41-2.16c0-3.52,3.16-5.28,9.47-5.28 c3.43,0,6.52,0.32,9.27,0.95c2.56,0.59,4.93,1.26,7.15,2.01V68.57c-1.61-0.43-3.42-0.84-5.46-1.23 c-3.97-0.77-8.12-1.15-12.45-1.15c-8.66,0-15.47,1.94-20.43,5.82c-4.96,3.88-7.44,9.16-7.44,15.83c0,3.43,0.49,6.36,1.49,8.79 c0.99,2.44,2.39,4.53,4.2,6.29c1.8,1.76,3.99,3.27,6.56,4.53c2.57,1.26,5.43,2.48,8.59,3.65c4.06,1.54,7.08,2.91,9.07,4.13 c1.98,1.22,2.98,2.64,2.98,4.26c0,2.07-0.77,3.47-2.3,4.19c-1.54,0.72-4.15,1.08-7.85,1.08c-3.52,0-7.08-0.38-10.69-1.15 c-1.91-0.41-3.79-0.89-5.65-1.46l-8.29,14.65c1.62,0.72,4.53,1.62,8.73,2.71c4.19,1.08,9.45,1.62,15.76,1.62 c9.65,0,17.12-1.8,22.39-5.4c5.28-3.6,7.92-8.91,7.92-15.93c0-2.97-0.34-5.58-1.02-7.83 C855.51,109.74,854.34,107.69,852.67,105.84z"/> <path class="lestilleuls-logo-wordmark-dark" d="M553.72,141.15c-5.82-0.09-10.54-0.72-14.16-1.88c-3.62-1.16-6.49-2.79-8.59-4.9c-2.1-2.1-3.54-4.65-4.3-7.65 c-0.76-3-1.14-6.38-1.14-10.13v-77.1h20v73.08c0,1.79,0.13,3.4,0.4,4.83c0.27,1.43,0.78,2.64,1.54,3.62 c0.76,0.99,1.86,1.79,3.29,2.42c1.43,0.63,3.36,1.03,5.77,1.21L553.72,141.15z"/> <path class="lestilleuls-logo-wordmark-dark" d="M593.72,141.15c-5.82-0.09-10.54-0.72-14.16-1.88c-3.62-1.16-6.49-2.79-8.59-4.9c-2.1-2.1-3.54-4.65-4.3-7.65 c-0.76-3-1.14-6.38-1.14-10.13v-77.1h20v73.08c0,1.79,0.13,3.4,0.4,4.83c0.27,1.43,0.78,2.64,1.54,3.62 c0.76,0.99,1.86,1.79,3.29,2.42c1.43,0.63,3.36,1.03,5.77,1.21L593.72,141.15z"/> <path class="lestilleuls-logo-wordmark-dark" d="M793.72,141.15c-5.82-0.09-10.54-0.72-14.16-1.88c-3.62-1.16-6.49-2.79-8.59-4.9c-2.1-2.1-3.54-4.65-4.3-7.65 c-0.76-3-1.14-6.38-1.14-10.13v-77.1h20v73.08c0,1.79,0.13,3.4,0.4,4.83c0.27,1.43,0.78,2.64,1.54,3.62 c0.76,0.99,1.86,1.79,3.29,2.42c1.43,0.63,3.36,1.03,5.77,1.21L793.72,141.15z"/> <path class="lestilleuls-logo-st0" d="M507.2,72.82c0,3.8-1.19,6.7-3.58,8.69c-2.38,1.99-5.08,2.98-8.09,2.98s-5.71-0.99-8.09-2.98 c-2.38-1.99-3.58-4.88-3.58-8.69s1.19-6.7,3.58-8.69c2.38-1.99,5.08-2.98,8.09-2.98s5.71,0.99,8.09,2.98 C506.01,66.12,507.2,69.01,507.2,72.82z"/> <path class="lestilleuls-logo-st0" d="M887.2,129.48c0,3.8-1.19,6.7-3.58,8.69c-2.38,1.99-5.08,2.98-8.09,2.98c-3.01,0-5.71-0.99-8.09-2.98 c-2.38-1.99-3.58-4.88-3.58-8.69c0-3.8,1.19-6.7,3.58-8.69c2.38-1.99,5.08-2.98,8.09-2.98c3.01,0,5.71,0.99,8.09,2.98 C886.01,122.78,887.2,125.68,887.2,129.48z"/> <path class="lestilleuls-logo-st0" d="M1192.18,83.86c-3.35-5.71-7.93-10.08-13.75-13.13c-5.82-3.05-12.34-4.57-19.56-4.57s-13.75,1.52-19.56,4.57 c-5.82,3.05-10.4,7.43-13.75,13.13c-3.22,5.49-4.88,11.81-5,18.96h-0.02v66.67h20v-32.21c5.41,2.57,11.43,3.87,18.07,3.87 c7.22,0,13.77-1.52,19.63-4.57c5.86-3.05,10.49-7.43,13.88-13.13c3.39-5.7,5.09-12.3,5.09-19.79S1195.53,89.56,1192.18,83.86z M1169.64,117.11c-3.04,3.14-6.72,4.7-11.04,4.7c-4.32,0-7.91-1.57-10.77-4.7c-2.86-3.13-4.3-7.62-4.3-13.46 c0-5.92,1.45-10.43,4.36-13.53c2.91-3.09,6.56-4.64,10.97-4.64c4.32,0,7.95,1.57,10.91,4.7c2.95,3.14,4.43,7.62,4.43,13.46 C1174.2,109.49,1172.68,113.98,1169.64,117.11z"/> <path class="lestilleuls-logo-wordmark-dark" d="M307.26,136.87c-1.08,0.54-2.53,1.08-4.33,1.62c-1.81,0.54-3.81,1.02-6.02,1.42c-2.21,0.41-4.58,0.74-7.1,1.02 c-2.53,0.27-5.05,0.41-7.58,0.41c-6.41,0-11.98-0.95-16.71-2.84c-4.74-1.89-8.66-4.49-11.77-7.78c-3.11-3.29-5.41-7.19-6.9-11.7 c-1.49-4.51-2.23-9.38-2.23-14.61c0-6.31,0.97-11.84,2.91-16.58c1.94-4.74,4.49-8.68,7.64-11.84c3.16-3.16,6.79-5.55,10.89-7.17 c4.1-1.62,8.32-2.44,12.65-2.44c10.1,0,18.09,3.09,23.95,9.27c5.86,6.18,8.8,15.27,8.8,27.27c0,1.17-0.05,2.46-0.14,3.86 c-0.09,1.4-0.18,2.64-0.27,3.72h-45.74c0.45,4.15,2.39,7.44,5.82,9.88c3.43,2.44,8.03,3.65,13.8,3.65c3.7,0,7.33-0.34,10.89-1.02 c1.11-0.21,2.17-0.44,3.15-0.68L307.26,136.87z M291.97,96.48c-0.09-1.71-0.39-3.38-0.88-5.01c-0.5-1.63-1.26-3.07-2.3-4.33 c-1.04-1.26-2.35-2.3-3.92-3.11c-1.58-0.81-3.54-1.22-5.89-1.22c-2.26,0-4.19,0.38-5.82,1.15c-1.62,0.77-2.98,1.78-4.06,3.04 c-1.08,1.26-1.92,2.73-2.5,4.4c-0.59,1.67-1.02,3.36-1.29,5.07H291.97z"/> </g> <g> <path class="lestilleuls-logo-st0" d="M84.52,75.41C70.6,75.05,59.04,65.02,56.34,51.8c-0.93-0.26-1.82-0.61-2.66-1.06 c-2.08-1.1-3.71-2.66-4.9-4.7c-1.19-2.04-1.78-4.42-1.78-7.14c0-2.7,0.6-5.07,1.81-7.12c1.2-2.05,2.85-3.63,4.94-4.72 c2.09-1.1,4.44-1.65,7.04-1.65c2.6,0,4.94,0.55,7.04,1.65c2.09,1.1,3.74,2.67,4.94,4.72c1.2,2.05,1.81,4.42,1.81,7.12 c0,2.69-0.61,5.07-1.83,7.12c-1.22,2.05-2.88,3.63-4.99,4.72c-0.97,0.5-1.99,0.89-3.07,1.16c2.54,8.68,10.43,15.1,19.84,15.44 l0-30.84c-0.36-0.15-0.71-0.31-1.05-0.49c-2.08-1.1-3.71-2.66-4.9-4.7c-1.19-2.04-1.78-4.42-1.78-7.14c0-2.69,0.6-5.07,1.81-7.12 c1.2-2.05,2.85-3.63,4.94-4.72c2.09-1.1,4.44-1.65,7.04-1.65c2.6,0,4.94,0.55,7.04,1.65c2.09,1.1,3.74,2.67,4.94,4.72 c1.2,2.05,1.81,4.42,1.81,7.12c0,2.7-0.61,5.07-1.83,7.12c-1.22,2.05-2.88,3.63-4.99,4.72c-0.3,0.16-0.6,0.3-0.91,0.43v45 c9.96-3.92,17.42-12.85,19.24-23.68c-0.8-0.25-1.58-0.57-2.31-0.96c-2.08-1.1-3.71-2.66-4.9-4.7c-1.19-2.04-1.78-4.42-1.78-7.14 c0-2.7,0.6-5.07,1.81-7.12c1.2-2.05,2.85-3.63,4.94-4.72c2.09-1.1,4.44-1.65,7.04-1.65c2.6,0,4.94,0.55,7.04,1.65 c2.09,1.1,3.74,2.67,4.94,4.72c1.2,2.05,1.81,4.42,1.81,7.12c0,2.69-0.61,5.07-1.83,7.12c-1.22,2.05-2.88,3.63-4.99,4.72 c-1.14,0.59-2.35,1.02-3.64,1.29c-2.14,15.16-13.02,27.55-27.36,31.89v11.73c19.05-2.1,35.19-13.96,43.32-30.45V33.7 c0-18.61-15.09-33.7-33.7-33.7h-44.2C46.19,9.66,35.57,27.13,35.57,47.03c0,24.03,15.48,44.5,36.99,51.98v13.52 c-28.74-7.92-49.91-34.28-49.91-65.5c0-18.24,7.24-34.81,18.98-47.03H33.7C15.09,0,0,15.09,0,33.7v72.56 c0,18.61,15.09,33.7,33.7,33.7h50.83V75.41z"/> <path class="lestilleuls-logo-st0" d="M126.19,44.95c0-2.1-0.53-3.71-1.59-4.84c-1.06-1.13-2.37-1.69-3.92-1.69c-1.59,0-2.9,0.56-3.95,1.67 c-1.05,1.11-1.57,2.74-1.57,4.87c0,2.1,0.51,3.71,1.55,4.84c1.03,1.13,2.32,1.69,3.88,1.69c1.55,0,2.88-0.56,3.97-1.69 C125.64,48.66,126.19,47.05,126.19,44.95z"/> <path class="lestilleuls-logo-st0" d="M96.63,114.69l0,25.27h9.63c18.61,0,33.7-15.09,33.7-33.7V93.61C128.86,105.36,113.64,113.18,96.63,114.69z" /> <path class="lestilleuls-logo-st0" d="M60.78,32.36c-1.59,0-2.9,0.56-3.95,1.67c-1.05,1.11-1.57,2.73-1.57,4.87c0,2.1,0.51,3.71,1.55,4.84 c1.03,1.13,2.32,1.69,3.88,1.69c1.55,0,2.88-0.56,3.97-1.69c1.09-1.13,1.64-2.74,1.64-4.84c0-2.1-0.53-3.71-1.59-4.84 C63.64,32.92,62.34,32.36,60.78,32.36z"/> <path class="lestilleuls-logo-st0" d="M90.58,17.62c-1.59,0-2.9,0.56-3.95,1.67c-1.05,1.11-1.57,2.73-1.57,4.86c0,2.1,0.51,3.71,1.55,4.84 c1.03,1.13,2.32,1.69,3.88,1.69c1.55,0,2.88-0.56,3.97-1.69c1.09-1.13,1.64-2.74,1.64-4.84c0-2.1-0.53-3.71-1.59-4.84 C93.44,18.19,92.13,17.62,90.58,17.62z"/> </g> </g> </g> </svg> </a></div> </div> </div> <div class="doc-sidebar-highlight"> <div class="ui-highlights"> <div class="ui-highlight-item ui-highlight-hidden"> <div class="ui-highlight-carbon"> <script defer async type="text/javascript" src="//cdn.carbonads.com/carbon.js?serve=CKYILK3J&placement=symfonycom" id="_carbonads_js"></script> </div> </div> </div> </div> <div class="ui-highlights"> <div class="ui-highlight-item ui-highlight-visible"> <div class="ui-highlight-symfony"> <a href="https://www.blackfire.io/profiler?utm_source=symfony&utm_medium=ad_red_logo&utm_campaign=profiler"> <img loading="lazy" src="/images/network/blackfire_02.png" height="100" width="130" alt="Symfony Code Performance Profiling" /> </a> <p class="ui-highlight-symfony-text"> <a href="https://www.blackfire.io/profiler?utm_source=symfony&utm_medium=ad_red_logo&utm_campaign=profiler">Symfony Code Performance Profiling</a> </p> </div> </div> <div class="ui-highlight-item ui-highlight-hidden"> <div class="ui-highlight-symfony"> <a href="https://insight.symfony.com/?utm_source=ad&utm_medium=banner&utm_campaign=insight&utm_content=sink"> <img loading="lazy" src="/images/network/sfinsight_02.png" height="100" width="130" alt="Save your teams and projects before they sink" /> </a> <p class="ui-highlight-symfony-text"> <a href="https://insight.symfony.com/?utm_source=ad&utm_medium=banner&utm_campaign=insight&utm_content=sink">Save your teams and projects before they sink</a> </p> </div> </div> </div> </div> </aside> </div> </div> </main> <footer> <h2 class="visually-hidden">Symfony footer</h2> <div class="footer-content"> <section class="footer-top-wrapper"> <div class="ui-page-container ui-page-container-wide"> <div class="footer-top"> <div class="symfony-contributor"> <div class="d-flex align-items-start px-4 py-3 ui-contributor ui-contributor-horizontal"> <img loading="lazy" width="48" height="48" alt="Avatar of CarolienBEER, a Symfony contributor" src="https://www.gravatar.com/avatar/109758b2b1a32fc00bd660a12d20ec35?size=48&rating=g&default=retro" onerror="this.onerror=null; this.src='data:image/svg+xml;utf8,\ <svg xmlns=\'http://www.w3.org/2000/svg\' width=\'100%\' height=\'100%\'>\ <style>\ rect { fill: %23f3f4f6; }\ @media (prefers-color-scheme: dark) { rect { fill: %23374151; } }\ </style>\ <rect width=\'100%\' height=\'100%\'/>\ </svg>'" class="ui-avatar d-inline-block me-3"> <div> <p class="mb-1"> Thanks <strong> CarolienBEER </strong> for being a Symfony contributor </p> <p class="mb-1"> <span role="tooltip" aria-label="1 commit"> <strong>1</strong> commit</span> • <span role="tooltip" aria-label="2 lines of code/doc changed"><strong>2</strong> lines changed</span> </p> </div> </div> <p class="mt-3 mb-0"><a class="ui-link fw-semibold" href="/contributors">View all contributors</a> that help us make Symfony</p> </div> <div class="contribute-to-symfony"> <div class="ui-heading"> <h3 id="become-a-symfony-contributor" class="ui-heading-title ui-text-md"> Become a Symfony contributor </h3> </div> <p class="mb-3"> Be an active part of the community and contribute ideas, code and bug fixes. Both experts and newcomers are welcome. </p> <a class="ui-link fw-semibold" href="/doc/current/contributing/index.html">Learn how to contribute</a> </div> </div> </div> </section> <section class="footer-bottom-wrapper"> <div class="ui-page-container ui-page-container-wide"> <div class="footer-bottom"> <p class="mb-3"> <b>Symfony</b>™ is a trademark of Symfony SAS. <a href="/trademark">All rights reserved</a>. </p> <ul class="ui-sitemap "> <li> <p class="mb-2 fw-semibold"><a href="/what-is-symfony">What is Symfony?</a></p> <ul class="ui-sitemap-menu" role="menubar" aria-label="What is Symfony?"> <li class="" role="menuitem"> <a href="/what-is-symfony"> What is Symfony? </a> </li> <li class="" role="menuitem"> <a href="/at-a-glance"> Symfony at a Glance </a> </li> <li class="" role="menuitem"> <a href="/components"> Symfony Components </a> </li> <li class="" role="menuitem"> <a href="/releases"> Symfony Releases </a> </li> <li class="" role="menuitem"> <a href="/doc/current/contributing/code/security.html"> Security Policy </a> </li> <li class="" role="menuitem"> <a href="/logo"> Logo & Screenshots </a> </li> <li class="" role="menuitem"> <a href="/license"> Trademark & Licenses </a> </li> <li class="" role="menuitem"> <a href="/legacy"> symfony1 Legacy </a> </li> </ul> </li> <li> <p class="mb-2 fw-semibold"><a href="/doc/current/index.html">Learn Symfony</a></p> <ul class="ui-sitemap-menu" role="menubar" aria-label="Learn Symfony"> <li class="active" role="menuitem"> <a href="/doc/current/index.html"> Symfony Docs </a> </li> <li class="" role="menuitem"> <a href="/book"> Symfony Book </a> </li> <li class="" role="menuitem"> <a href="/doc/current/reference/index.html"> Reference </a> </li> <li class="" role="menuitem"> <a href="/bundles"> Bundles </a> </li> <li class="" role="menuitem"> <a href="/doc/current/best_practices.html"> Best Practices </a> </li> <li class="" role="menuitem"> <a href="https://sensiolabs.com/training?utm_source=symfony&utm_medium=symfony_footer&utm_campaign=permanent_referral"> Training </a> </li> <li class="" role="menuitem"> <a href="https://university.sensiolabs.com/e-learning-platform?utm_source=symfony&utm_medium=symfony_footer&utm_campaign=permanent_referral"> eLearning Platform </a> </li> <li class="" role="menuitem"> <a href="https://certification.symfony.com/"> Certification </a> </li> </ul> </li> <li> <p class="mb-2 fw-semibold"><a href="https://symfonycasts.com/">Screencasts</a></p> <ul class="ui-sitemap-menu" role="menubar" aria-label="Screencasts"> <li class="" role="menuitem"> <a href="https://symfonycasts.com/tracks/symfony"> Learn Symfony </a> </li> <li class="" role="menuitem"> <a href="https://symfonycasts.com/tracks/php"> Learn PHP </a> </li> <li class="" role="menuitem"> <a href="https://symfonycasts.com/tracks/javascript"> Learn JavaScript </a> </li> <li class="" role="menuitem"> <a href="https://symfonycasts.com/tracks/drupal"> Learn Drupal </a> </li> <li class="" role="menuitem"> <a href="https://symfonycasts.com/tracks/rest"> Learn RESTful APIs </a> </li> </ul> </li> <li> <p class="mb-2 fw-semibold"><a href="/community">Community</a></p> <ul class="ui-sitemap-menu" role="menubar" aria-label="Community"> <li class="" role="menuitem"> <a href="/community"> Symfony Community </a> </li> <li class="" role="menuitem"> <a href="https://connect.symfony.com/"> SymfonyConnect </a> </li> <li class="" role="menuitem"> <a href="/events/"> Events & Meetups </a> </li> <li class="" role="menuitem"> <a href="/projects"> Projects using Symfony </a> </li> <li class="" role="menuitem"> <a href="/contributors"> Contributors </a> </li> <li class="" role="menuitem"> <a href="/jobs"> Symfony Jobs </a> </li> <li class="" role="menuitem"> <a href="/backers"> Backers </a> </li> <li class="" role="menuitem"> <a href="/doc/current/contributing/code_of_conduct/code_of_conduct.html"> Code of Conduct </a> </li> <li class="" role="menuitem"> <a href="/stats/downloads"> Downloads Stats </a> </li> <li class="" role="menuitem"> <a href="/support"> Support </a> </li> </ul> </li> <li> <p class="mb-2 fw-semibold"><a href="/blog/">Blog</a></p> <ul class="ui-sitemap-menu" role="menubar" aria-label="Blog"> <li class="" role="menuitem"> <a href="/blog/"> All Blog Posts </a> </li> <li class="" role="menuitem"> <a href="/blog/category/a-week-of-symfony"> A Week of Symfony </a> </li> <li class="" role="menuitem"> <a href="/blog/category/case-studies"> Case Studies </a> </li> <li class="" role="menuitem"> <a href="/blog/category/cloud"> Cloud </a> </li> <li class="" role="menuitem"> <a href="/blog/category/community"> Community </a> </li> <li class="" role="menuitem"> <a href="/blog/category/conferences"> Conferences </a> </li> <li class="" role="menuitem"> <a href="/blog/category/diversity"> Diversity </a> </li> <li class="" role="menuitem"> <a href="/blog/category/living-on-the-edge"> Living on the edge </a> </li> <li class="" role="menuitem"> <a href="/blog/category/releases"> Releases </a> </li> <li class="" role="menuitem"> <a href="/blog/category/security-advisories"> Security Advisories </a> </li> <li class="" role="menuitem"> <a href="/blog/category/symfony-insight"> Symfony Insight </a> </li> <li class="" role="menuitem"> <a href="/blog/category/twig"> Twig </a> </li> <li class="" role="menuitem"> <a href="https://sensiolabs.com/blog?utm_source=symfony&utm_medium=symfony_footer&utm_campaign=permanent_referral"> SensioLabs Blog </a> </li> </ul> </li> <li> <p class="mb-2 fw-semibold"><a href="https://sensiolabs.com/?utm_source=symfony&utm_medium=symfony_footer&utm_campaign=permanent_referral">Services</a></p> <ul class="ui-sitemap-menu" role="menubar" aria-label="Services"> <li class="" role="menuitem"> <a href="https://sensiolabs.com/?utm_source=symfony&utm_medium=symfony_footer&utm_campaign=permanent_referral"> SensioLabs services </a> </li> <li class="" role="menuitem"> <a href="https://sensiolabs.com/training?utm_source=symfony&utm_medium=symfony_footer&utm_campaign=permanent_referral"> Train developers </a> </li> <li class="" role="menuitem"> <a href="https://insight.symfony.com/"> Manage your project quality </a> </li> <li class="" role="menuitem"> <a href="https://www.blackfire.io/?utm_source=symfony&utm_medium=symfonycom_footer&utm_campaign=profiler"> Improve your project performance </a> </li> <li class="" role="menuitem"> <a href="/cloud/"> Host Symfony projects </a> </li> </ul> <p class="mt-4 mb-2 fw-semibold"><a href="/cloud/">Powered by</a></p> <a href="/cloud/" class="block deploy-logo" title="Platform.sh, a Platform-as-a-Service optimized for Symfony developers" aria-label="Platform.sh"> <span aria-hidden="true"><svg viewBox="0 0 172.62 34.06" xmlns="http://www.w3.org/2000/svg"><g fill="currentColor"><path d="m144.07 0h28.55v11.35h-28.55z"/><path d="m144.07 24.69h28.55v3.86h-28.55z"/><path d="m144.07 15.02h28.55v5.82h-28.55z"/><path d="m0 13.85h3.61v2.15a5.45 5.45 0 0 1 1.9-1.79 5.25 5.25 0 0 1 2.66-.69 5.59 5.59 0 0 1 4.33 2 8.06 8.06 0 0 1 1.78 5.56 8.38 8.38 0 0 1 -1.79 5.71 5.6 5.6 0 0 1 -4.34 2 4.94 4.94 0 0 1 -2.15-.45 7.46 7.46 0 0 1 -2.08-1.66v7.38h-3.92zm3.83 7.07a5.66 5.66 0 0 0 1 3.65 3 3 0 0 0 2.37 1.17 2.78 2.78 0 0 0 2.24-1.08 5.55 5.55 0 0 0 .9-3.55 5.29 5.29 0 0 0 -.93-3.42 2.84 2.84 0 0 0 -2.28-1.11 3 3 0 0 0 -2.36 1.09 4.88 4.88 0 0 0 -.94 3.25z"/><path d="m16.07 28.49v-20.21h3.87v20.21z"/><path d="m25.5 18.32-3.5-.64a5.48 5.48 0 0 1 2-3.14 7.48 7.48 0 0 1 4.3-1 9.4 9.4 0 0 1 3.86.61 3.8 3.8 0 0 1 1.84 1.54 7.89 7.89 0 0 1 .52 3.47v4.52a15 15 0 0 0 .19 2.84 8 8 0 0 0 .69 2h-3.91c-.1-.26-.23-.64-.37-1.15-.07-.23-.11-.38-.14-.45a7 7 0 0 1 -2.12 1.45 6.15 6.15 0 0 1 -2.42.48 5 5 0 0 1 -3.56-1.23 4.05 4.05 0 0 1 -1.3-3.1 4.2 4.2 0 0 1 .59-2.21 3.87 3.87 0 0 1 1.66-1.49 13.49 13.49 0 0 1 3.08-.9 21.67 21.67 0 0 0 3.77-.95v-.39a2 2 0 0 0 -.56-1.58 3.26 3.26 0 0 0 -2.12-.52 2.8 2.8 0 0 0 -1.61.41 2.81 2.81 0 0 0 -.89 1.43zm5.18 3.14c-.5.16-1.29.36-2.36.59a7.55 7.55 0 0 0 -2.11.67 1.65 1.65 0 0 0 -.75 1.37 1.93 1.93 0 0 0 .6 1.41 2.13 2.13 0 0 0 1.54.59 3.34 3.34 0 0 0 2-.69 2.47 2.47 0 0 0 .93-1.28 7.73 7.73 0 0 0 .15-1.89z"/><path d="m43.81 13.85v3.09h-2.64v5.89a15.15 15.15 0 0 0 .07 2.09.82.82 0 0 0 .35.49 1 1 0 0 0 .65.2 5 5 0 0 0 1.56-.38l.33 3a7.63 7.63 0 0 1 -3.06.58 4.93 4.93 0 0 1 -1.89-.35 2.79 2.79 0 0 1 -1.18-.9 3.67 3.67 0 0 1 -.55-1.51 19.41 19.41 0 0 1 -.12-2.73v-6.38h-1.83v-3.09h1.78v-2.91l3.89-2.26v5.17z"/><path d="m44.94 13.85h2.15v-1.1a7.41 7.41 0 0 1 .39-2.75 3.18 3.18 0 0 1 1.45-1.48 5.56 5.56 0 0 1 2.67-.57 10.83 10.83 0 0 1 3.24.49l-.53 2.71a7.42 7.42 0 0 0 -1.77-.23 1.6 1.6 0 0 0 -1.21.4 2.28 2.28 0 0 0 -.33 1.5v1h2.9v3h-2.9v11.67h-3.91v-11.59h-2.15z"/><path d="m54.58 21a8 8 0 0 1 1-3.73 6.59 6.59 0 0 1 2.7-2.76 8 8 0 0 1 3.89-1 7.29 7.29 0 0 1 5.44 2.16 7.43 7.43 0 0 1 2.13 5.45 7.52 7.52 0 0 1 -2.14 5.5 7.24 7.24 0 0 1 -5.4 2.19 8.47 8.47 0 0 1 -3.84-.91 6.3 6.3 0 0 1 -2.78-2.67 8.91 8.91 0 0 1 -1-4.23zm4 .21a4.83 4.83 0 0 0 1 3.33 3.23 3.23 0 0 0 2.54 1.16 3.26 3.26 0 0 0 2.55-1.16 4.93 4.93 0 0 0 1-3.36 4.86 4.86 0 0 0 -1-3.31 3.29 3.29 0 0 0 -2.55-1.15 3.25 3.25 0 0 0 -2.54 1.15 4.86 4.86 0 0 0 -1.03 3.3z"/><path d="m75 28.49h-3.87v-14.64h3.6v2.08a6.06 6.06 0 0 1 1.66-1.93 3.07 3.07 0 0 1 1.67-.47 4.9 4.9 0 0 1 2.55.73l-1.2 3.38a3.32 3.32 0 0 0 -1.82-.64 2.11 2.11 0 0 0 -1.37.45 3 3 0 0 0 -.89 1.62 22.62 22.62 0 0 0 -.33 4.93z"/><path d="m81.77 13.85h3.57v2a5.75 5.75 0 0 1 4.56-2.33 4.87 4.87 0 0 1 2.44.58 4.39 4.39 0 0 1 1.66 1.75 6.73 6.73 0 0 1 2.09-1.75 5 5 0 0 1 2.38-.58 5.36 5.36 0 0 1 2.73.65 4.06 4.06 0 0 1 1.67 1.93 8.44 8.44 0 0 1 .4 3v9.36h-3.85v-8.34a6.16 6.16 0 0 0 -.4-2.81 1.83 1.83 0 0 0 -1.65-.83 2.66 2.66 0 0 0 -1.53.5 2.71 2.71 0 0 0 -1 1.45 10.52 10.52 0 0 0 -.32 3v7h-3.91v-8a11.17 11.17 0 0 0 -.2-2.76 1.76 1.76 0 0 0 -.64-.92 2 2 0 0 0 -1.18-.31 2.82 2.82 0 0 0 -1.59.56 2.7 2.7 0 0 0 -1 1.4 10.2 10.2 0 0 0 -.31 3v7.11h-3.92z"/><path d="m105.23 28.49v-3.88h3.87v3.88z"/><path d="m110.55 24.31 3.89-.59a2.84 2.84 0 0 0 1 1.72 3.4 3.4 0 0 0 2.12.58 3.86 3.86 0 0 0 2.27-.55 1.25 1.25 0 0 0 .5-1 1.05 1.05 0 0 0 -.27-.74 3.09 3.09 0 0 0 -1.3-.5q-4.68-1-5.94-1.89a3.79 3.79 0 0 1 -1.73-3.3 4.09 4.09 0 0 1 1.5-3.2 7 7 0 0 1 4.66-1.29 8 8 0 0 1 4.46 1 5 5 0 0 1 2 2.89l-3.66.68a2.21 2.21 0 0 0 -.89-1.31 3.18 3.18 0 0 0 -1.86-.45 4.33 4.33 0 0 0 -2.2.42.93.93 0 0 0 -.44.79.85.85 0 0 0 .39.7 14.37 14.37 0 0 0 3.62 1.09 10.82 10.82 0 0 1 4.33 1.64 3.58 3.58 0 0 1 1.21 2.88 4.4 4.4 0 0 1 -1.68 3.46 7.42 7.42 0 0 1 -5 1.45 8.07 8.07 0 0 1 -4.73-1.22 5.56 5.56 0 0 1 -2.25-3.26z"/><path d="m129.66 8.28v7.43a5.79 5.79 0 0 1 6.89-1.71 3.92 3.92 0 0 1 1.62 1.26 4.66 4.66 0 0 1 .74 1.71 15.64 15.64 0 0 1 .2 2.91v8.59h-3.87v-7.72a11.35 11.35 0 0 0 -.22-2.92 1.93 1.93 0 0 0 -.78-1 2.53 2.53 0 0 0 -1.4-.37 3.22 3.22 0 0 0 -1.72.47 2.64 2.64 0 0 0 -1.12 1.43 8.63 8.63 0 0 0 -.35 2.8v7.33h-3.87v-20.21z"/></g></svg> </span> </a> </li> </ul> <div class="my-4"> <h3><span>Follow Symfony</span></h3> <div class="d-flex align-items-center flex-wrap mt-3 row-gap-3 column-gap-4"> <a href="https://github.com/symfony" target="_blank" rel="me external noopener noreferrer" title="Symfony on GitHub"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg> </a> <a href="/slack" target="_blank" rel="external noopener noreferrer" title="Symfony on Slack"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="currentColor" d="M5.042 15.165a2.53 2.53 0 0 1-2.52 2.523A2.53 2.53 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52a2.527 2.527 0 0 1 2.521 2.52v6.313A2.53 2.53 0 0 1 8.834 24a2.53 2.53 0 0 1-2.521-2.522zM8.834 5.042a2.53 2.53 0 0 1-2.521-2.52A2.53 2.53 0 0 1 8.834 0a2.53 2.53 0 0 1 2.521 2.522v2.52zm0 1.271a2.53 2.53 0 0 1 2.521 2.521a2.53 2.53 0 0 1-2.521 2.521H2.522A2.53 2.53 0 0 1 0 8.834a2.53 2.53 0 0 1 2.522-2.521zm10.122 2.521a2.53 2.53 0 0 1 2.522-2.521A2.53 2.53 0 0 1 24 8.834a2.53 2.53 0 0 1-2.522 2.521h-2.522zm-1.268 0a2.53 2.53 0 0 1-2.523 2.521a2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.53 2.53 0 0 1 2.523 2.522zm-2.523 10.122a2.53 2.53 0 0 1 2.523 2.522A2.53 2.53 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522zm0-1.268a2.527 2.527 0 0 1-2.52-2.523a2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.53 2.53 0 0 1-2.522 2.523z"></path></svg> </a> <a href="https://twitter.com/symfony" target="_blank" rel="me external noopener noreferrer" title="Symfony on Twitter"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="currentColor" d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584l-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z"></path></svg> </a> <a href="https://mastodon.social/@symfony" target="_blank" rel="me external noopener noreferrer" title="Symfony on Mastodon"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="currentColor" d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127C.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611c.118 1.24.325 2.47.62 3.68c.55 2.237 2.777 4.098 4.96 4.857c2.336.792 4.849.923 7.256.38q.398-.092.786-.213c.585-.184 1.27-.39 1.774-.753a.06.06 0 0 0 .023-.043v-1.809a.05.05 0 0 0-.02-.041a.05.05 0 0 0-.046-.01a20.3 20.3 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.6 5.6 0 0 1-.319-1.433a.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546c.376 0 .75 0 1.125-.01c1.57-.044 3.224-.124 4.768-.422q.059-.011.11-.024c2.435-.464 4.753-1.92 4.989-5.604c.008-.145.03-1.52.03-1.67c.002-.512.167-3.63-.024-5.545m-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976c-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35c-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102q0-1.965 1.011-3.12c.696-.77 1.608-1.164 2.74-1.164c1.311 0 2.302.5 2.962 1.498l.638 1.06l.638-1.06c.66-.999 1.65-1.498 2.96-1.498c1.13 0 2.043.395 2.74 1.164q1.012 1.155 1.012 3.12z"></path></svg> </a> <a href="https://www.linkedin.com/company/symfony-sas/" target="_blank" rel="me external noopener noreferrer" title="Symfony on LinkedIn"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="currentColor" d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z"></path></svg> </a> <a href="https://www.facebook.com/SymfonyFramework" target="_blank" rel="me external noopener noreferrer" title="Symfony on Facebook"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="currentColor" d="M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978c.401 0 .955.042 1.468.103a9 9 0 0 1 1.141.195v3.325a9 9 0 0 0-.653-.036a27 27 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.7 1.7 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103l-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647"></path></svg> </a> <a href="https://www.youtube.com/symfonytv" target="_blank" rel="me external noopener noreferrer" title="Symfony on YouTube"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="currentColor" d="M23.498 6.186a3.02 3.02 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.02 3.02 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.02 3.02 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.02 3.02 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814M9.545 15.568V8.432L15.818 12z"></path></svg> </a> <a href="https://bsky.app/profile/symfony.bsky.social" target="_blank" rel="me external noopener noreferrer" title="Symfony on BlueSky"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="currentColor" d="M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565C.139 1.908 0 3.08 0 3.768c0 .69.378 5.65.624 6.479c.815 2.736 3.713 3.66 6.383 3.364q.204-.03.415-.056q-.207.033-.415.056c-3.912.58-7.387 2.005-2.83 7.078c5.013 5.19 6.87-1.113 7.823-4.308c.953 3.195 2.05 9.271 7.733 4.308c4.267-4.308 1.172-6.498-2.74-7.078a9 9 0 0 1-.415-.056q.21.026.415.056c2.67.297 5.568-.628 6.383-3.364c.246-.828.624-5.79.624-6.478c0-.69-.139-1.861-.902-2.206c-.659-.298-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8"></path></svg> </a> <a href="https://www.threads.net/@symfony" target="_blank" rel="me external noopener noreferrer" title="Symfony on Threads"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="currentColor" d="M12.186 24h-.007c-3.581-.024-6.334-1.205-8.184-3.509C2.35 18.44 1.5 15.586 1.472 12.01v-.017c.03-3.579.879-6.43 2.525-8.482C5.845 1.205 8.6.024 12.18 0h.014c2.746.02 5.043.725 6.826 2.098c1.677 1.29 2.858 3.13 3.509 5.467l-2.04.569c-1.104-3.96-3.898-5.984-8.304-6.015c-2.91.022-5.11.936-6.54 2.717C4.307 6.504 3.616 8.914 3.589 12c.027 3.086.718 5.496 2.057 7.164c1.43 1.783 3.631 2.698 6.54 2.717c2.623-.02 4.358-.631 5.8-2.045c1.647-1.613 1.618-3.593 1.09-4.798c-.31-.71-.873-1.3-1.634-1.75c-.192 1.352-.622 2.446-1.284 3.272c-.886 1.102-2.14 1.704-3.73 1.79c-1.202.065-2.361-.218-3.259-.801c-1.063-.689-1.685-1.74-1.752-2.964c-.065-1.19.408-2.285 1.33-3.082c.88-.76 2.119-1.207 3.583-1.291a14 14 0 0 1 3.02.142c-.126-.742-.375-1.332-.75-1.757c-.513-.586-1.308-.883-2.359-.89h-.029c-.844 0-1.992.232-2.721 1.32l-1.757-1.18c.98-1.454 2.568-2.256 4.478-2.256h.044c3.194.02 5.097 1.975 5.287 5.388q.163.07.321.142c1.49.7 2.58 1.761 3.154 3.07c.797 1.82.871 4.79-1.548 7.158c-1.85 1.81-4.094 2.628-7.277 2.65Zm1.003-11.69q-.362 0-.739.021c-1.836.103-2.98.946-2.916 2.143c.067 1.256 1.452 1.839 2.784 1.767c1.224-.065 2.818-.543 3.086-3.71a10.5 10.5 0 0 0-2.215-.221"></path></svg> </a> <a href="https://symfonycasts.com/" target="_blank" rel="me external noopener noreferrer" title="Symfony Screencasts"> <svg viewBox="0 0 300 300" space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421" width="32px" height="32px" fill="currentColor" aria-hidden="true"><g><path d="M300 30c0-16.557-13.443-30-30-30H30C13.443 0 0 13.443 0 30v240c0 16.557 13.443 30 30 30h240c16.557 0 30-13.443 30-30V30z" style="fill: currentColor"></path><path d="M94.679 204.481c-4.374-1.925-9.01-2.625-13.734-2.625-18.632 0-32.278 12.51-32.278 31.317 0 19.42 12.859 31.841 32.191 31.841 3.587 0 9.272-.262 13.909-2.187l-.257-4.156a3.1 3.1 0 0 0-3.988-2.776c-2.99.903-6.622 1.421-9.577 1.421-12.684 0-23.006-9.534-23.006-23.881 0-13.733 9.36-23.881 23.444-23.881 3.038 0 5.994.528 8.787 1.582a3.098 3.098 0 0 0 4.178-2.646l.331-4.009zm13.522 19.85a3.1 3.1 0 0 0 4.404 2.615c2.741-1.268 5.876-1.996 8.866-1.996 8.223 0 11.022 3.937 11.022 11.635-3.237-.175-5.511-.175-8.748-.175-8.485 0-20.732 3.499-20.732 14.696 0 9.709 6.736 13.908 16.358 13.908 7.523 0 11.897-4.111 13.822-6.823h.175v5.774h4.352a3.098 3.098 0 0 0 3.093-3.296 125.34 125.34 0 0 1-.097-5.452v-18.458c0-12.159-5.161-18.457-17.933-18.457-5.686 0-10.585 1.75-14.696 4.199l.114 1.83zm44.173 38.234c3.761 2.012 8.048 2.449 12.247 2.449 7.96 0 15.57-4.373 15.57-13.908 0-14.259-19.332-11.635-19.332-20.732 0-3.674 3.674-5.424 7.873-5.424 1.107 0 3.2.377 5.127.913a3.097 3.097 0 0 0 3.926-2.68l.307-3.131c-3.237-.963-6.386-1.75-10.235-1.75-8.835 0-15.746 4.461-15.746 13.734 0 12.509 19.333 11.809 19.333 19.944 0 4.812-4.637 6.386-8.398 6.386-1.512 0-3.954-.43-6.366-1.29a3.097 3.097 0 0 0-4.141 2.732l-.165 2.757zm71.142 0c3.761 2.012 8.048 2.449 12.247 2.449 7.96 0 15.57-4.373 15.57-13.908 0-14.259-19.332-11.635-19.332-20.732 0-3.674 3.674-5.424 7.873-5.424 1.107 0 3.2.377 5.127.913a3.097 3.097 0 0 0 3.926-2.68l.307-3.131c-3.237-.963-6.386-1.75-10.235-1.75-8.835 0-15.746 4.461-15.746 13.734 0 12.509 19.333 11.809 19.333 19.944 0 4.812-4.637 6.386-8.398 6.386-1.512 0-3.954-.43-6.366-1.29a3.097 3.097 0 0 0-4.141 2.732l-.165 2.757zm-29.36-43.213v-12.947h5.123a3.1 3.1 0 0 1 3.099 3.1v9.847h11.81v3.548a3.1 3.1 0 0 1-3.1 3.1h-8.71v24.406c0 5.161 3.15 7.96 6.911 7.96.702 0 1.351-.06 1.947-.167a3.101 3.101 0 0 1 3.652 3.05v2.541c-1.837.525-4.374 1.224-6.999 1.224-8.485 0-13.733-4.024-13.733-12.946V226h-5.052a3.1 3.1 0 0 1-3.099-3.1v-3.548h8.151zm-61.663 27.292c0 6.649-4.286 11.722-12.422 11.722-3.761 0-8.31-2.537-8.31-7.26 0-7.873 11.022-8.573 15.483-8.573 1.75 0 3.499.175 5.249.175v3.936zm136.934-67.652H30.577c-.355-.024-.449-.012-.794-.109-1.164-.326-2.062-1.423-2.145-2.636a3.007 3.007 0 0 1 1.409-2.719c.344-.209.73-.346 1.129-.401.133-.019.268-.019.401-.028H53c-7.987-7.798-9.293-17.234-7.409-23.363 2.511-8.144 8.984-9.683 15.314-7.741 6.779 2.096 9.432 10.333 7.493 16.657-.216.677-.562 1.805-1.274 3.324-.787 1.738-2.245 3.272-2.869 5.31-.693 2.253.33 4.211 2.099 5.813h27.289c1.97-1.871 3.447-4.169 4.233-6.74 2.444-7.89-2.548-13.398-4.615-15.512l-10.054-10.762c-4.598-5.12-14.713-19.398-9.779-35.432 1.904-6.184 5.91-12.742 11.724-17.083 12.275-9.147 25.621-10.648 38.327-6.995 16.448 4.729 24.347 15.602 34.59 24.005 5.735-16.818 13.683-33.283 25.635-47.176 10.794-12.652 25.297-21.822 41.908-22.39 16.596-.548 29.142 6.974 29.556 18.882.167 5.068-2.74 14.92-12.864 15.261-7.572.262-12.8-4.263-13.036-11.135-.085-2.519.566-4.724 2.292-7.301 1.688-3.304 2.049-3.683 2.006-5.12-.152-4.333-6.692-4.493-8.482-4.409-24.548.811-31.018 33.939-36.263 60.875l-2.569 14.205c14.136 2.067 24.172-.481 29.77-4.102 7.881-5.117-2.205-10.374-.933-16.191 1.288-5.931 6.683-8.794 10.969-8.914 6-.148 10.283 6.077 10.144 12.395-.216 10.444-14.069 24.793-41.783 24.207a96.847 96.847 0 0 1-9.38-.665l-5.228 28.86c-1.387 6.478-2.91 13.66-4.945 21.237h94.561l.401.028c.132.027.265.045.394.082a3.005 3.005 0 0 1 2.09 2.237c.272 1.308-.46 2.759-1.711 3.302-.246.107-.506.18-.773.217-.132.018-.267.018-.401.027zm-127.085-5.893c.469-2.383.942-4.832 1.422-7.35l1.674-10.152c2.723-13.608 5.741-28.784 10.342-43.905-11.162-8.404-17.847-18.821-32.86-22.892-10.29-2.793-16.562-.423-20.973 5.155-5.222 6.604-3.488 15.2 1.557 20.241l8.336 9.223c10.222 11.808 15.809 20.999 13.707 33.359-1.024 6.057-3.949 11.682-8.315 16.321h25.11z" style="fill: var(--footer-bottom-background)"></path></g></svg> </a> <a href="https://feeds.feedburner.com/symfony/blog" target="_blank" rel="external noopener noreferrer" title="Symfony Blog RSS"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="32px"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 19a1 1 0 1 0 2 0a1 1 0 1 0-2 0M4 4a16 16 0 0 1 16 16M4 11a9 9 0 0 1 9 9"></path></svg> </a> </div> </div> <div class="theme"> <form class="d-flex align-items-center"> <label for="color-scheme-switcher"> <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" font-size="21px" class="me-1 ui-text-muted"><path fill="currentColor" d="M17 3.34A10 10 0 1 1 2 12l.005-.324A10 10 0 0 1 17 3.34M8 5.072A8 8 0 0 0 12.001 20L12 4a8 8 0 0 0-4 1.072"></path></svg> <span class="visually-hidden">Site appearance:</span> </label> <select id="color-scheme-switcher" autocomplete="off"> <option value="light">Light mode</option> <option value="dark">Dark mode</option> <option value="sync" selected>Sync with system</option> </select> </form> </div> <script async> const colorSchemeSwitcher = document.getElementById('color-scheme-switcher'); const currentScheme = localStorage.getItem('colorScheme'); colorSchemeSwitcher.value = currentScheme; colorSchemeSwitcher.addEventListener('change', function () { const selectedColorScheme = colorSchemeSwitcher.value; let resolvedColorScheme = selectedColorScheme; if ('sync' === resolvedColorScheme) { resolvedColorScheme = matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; } document.body.classList.remove('light-theme', 'dark-theme'); document.body.classList.add('light' === resolvedColorScheme ? 'light-theme' : 'dark-theme'); localStorage.setItem('colorScheme', selectedColorScheme); document.body.style.colorScheme = resolvedColorScheme; }); </script> </div> </div> </section> </div> </footer> <div id="search-modal-backdrop" class="search-container" style="display: none"> <div role="dialog" aria-modal="true" id="search-modal-content" tabindex="-1"> <button aria-label="Close modal" id="search-modal-close-button">CLOSE</button> <div class="search-container" data-controller="live" data-live-name-value="Search" data-live-url-value="/_components/Search" id="live-2308103015-0" data-live-props-value="{"query":null,"@attributes":{"id":"live-2308103015-0"},"@checksum":"T8w3JMMlYNTMVShvf\/H5DoH+tLNjpWjA5vhKHU9v+GQ="}"> <form id="form-search"> <div class="form-group form-search-input"> <label for="form-search-input" class="visually-hidden">Search Symfony Docs</label> <input type="search" name="q" data-model="query" value="" class="mousetrap form-control ui-form-control-rounded ui-form-control-search-icon form-search-input" placeholder="Search Symfony Docs" aria-label="Search in Symfony documentation" autocapitalize="off" autocomplete="off" autocorrect="off" spellcheck="false"> </div> <button type="submit" class="visually-hidden">Search</button> </form> </div> </div> </div> </body> </html>