@@ -1768,7 +1768,7 @@ To enable logging out, activate the ``logout`` config parameter under your fire
17681768 main :
17691769 # ...
17701770 logout :
1771- path : app_logout
1771+ path : /logout
17721772
17731773 # where to redirect after logout
17741774 # target: app_any_route
@@ -1789,11 +1789,10 @@ To enable logging out, activate the ``logout`` config parameter under your fire
17891789 <!-- ... -->
17901790
17911791 <firewall name =" main" >
1792- <!-- ... -->
1793- <logout path =" app_logout" />
1792+ <logout path =" /logout" />
17941793
17951794 <!-- use "target" to configure where to redirect after logout
1796- <logout path="app_logout " target="app_any_route"/>
1795+ <logout path="/logout " target="app_any_route"/>
17971796 -->
17981797 </firewall >
17991798 </config >
@@ -1810,68 +1809,58 @@ To enable logging out, activate the ``logout`` config parameter under your fire
18101809 $mainFirewall = $security->firewall('main');
18111810 // ...
18121811 $mainFirewall->logout()
1813- // the argument can be either a route name or a path
1814- ->path('app_logout')
1812+ ->path('/logout')
18151813
18161814 // where to redirect after logout
18171815 // ->target('app_any_route')
18181816 ;
18191817 };
18201818
1821- Next, you need to create a route for this URL (but not a controller):
1819+ Symfony will then un-authenticate users navigating to the configured ``path ``,
1820+ and redirect them to the configured ``target ``.
18221821
1823- .. configuration-block ::
1824-
1825- .. code-block :: php-attributes
1822+ .. tip ::
18261823
1827- // src/Controller/SecurityController.php
1828- namespace App\Controller;
1824+ If you need to reference the logout path, you can use the `` _logout_<firewallname> ``
1825+ route name (e.g. `` _logout_main ``).
18291826
1830- use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1831- use Symfony\Component\Routing\Annotation\Route;
1827+ If your project does not use :ref: ` Symfony Flex < symfony-flex >`, make sure
1828+ you have imported the logout route loader in your routes:
18321829
1833- class SecurityController extends AbstractController
1834- {
1835- #[Route('/logout', name: 'app_logout', methods: ['GET'])]
1836- public function logout(): never
1837- {
1838- // controller can be blank: it will never be called!
1839- throw new \Exception('Don\'t forget to activate logout in security.yaml');
1840- }
1841- }
1830+ .. configuration-block ::
18421831
18431832 .. code-block :: yaml
18441833
1845- # config/routes.yaml
1846- app_logout :
1847- path : / logout
1848- methods : GET
1834+ # config/routes/security .yaml
1835+ _symfony_logout :
1836+ resource : security.route_loader. logout
1837+ type : service
18491838
18501839 .. code-block :: xml
18511840
1852- <!-- config/routes.xml -->
1841+ <!-- config/routes/security .xml -->
18531842 <?xml version =" 1.0" encoding =" UTF-8" ?>
18541843 <routes xmlns =" http://symfony.com/schema/routing"
18551844 xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
18561845 xsi : schemaLocation =" http://symfony.com/schema/routing
18571846 https://symfony.com/schema/routing/routing-1.0.xsd" >
18581847
1859- <route id = " app_logout " path = " / logout" methods = " GET " />
1848+ <import resource = " security.route_loader. logout" type = " service " />
18601849 </routes >
18611850
18621851 .. code-block :: php
18631852
1864- // config/routes.php
1853+ // config/routes/security .php
18651854 use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
18661855
1867- return function (RoutingConfigurator $routes): void {
1868- $routes->add('app_logout', '/logout')
1869- ->methods(['GET'])
1870- ;
1856+ return static function (RoutingConfigurator $routes): void {
1857+ $routes->import('security.route_loader.logout', 'service');
18711858 };
18721859
1873- That's it! By sending a user to the ``app_logout `` route (i.e. to ``/logout ``)
1874- Symfony will un-authenticate the current user and redirect them.
1860+ .. versionadded :: 6.4
1861+
1862+ The :class: `Symfony\\ Bundle\\ SecurityBundle\\ Routing\\ LogoutRouteLoader ` was
1863+ introduced in Symfony 6.4.
18751864
18761865Logout programmatically
18771866~~~~~~~~~~~~~~~~~~~~~~~
@@ -1950,6 +1939,105 @@ to execute custom logic::
19501939 }
19511940 }
19521941
1942+ Customizing Logout Path
1943+ ~~~~~~~~~~~~~~~~~~~~~~~
1944+
1945+ Another option is to configure ``path `` as a route name. This can be useful
1946+ if you want logout URIs to be dynamic (e.g. translated according to the
1947+ current locale). In that case, you have to create this route yourself:
1948+
1949+ .. configuration-block ::
1950+
1951+ .. code-block :: yaml
1952+
1953+ # config/routes.yaml
1954+ app_logout :
1955+ path :
1956+ en : /logout
1957+ fr : /deconnexion
1958+ methods : GET
1959+
1960+ .. code-block :: xml
1961+
1962+ <!-- config/routes.xml -->
1963+ <?xml version =" 1.0" encoding =" UTF-8" ?>
1964+ <routes xmlns =" http://symfony.com/schema/routing"
1965+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
1966+ xsi : schemaLocation =" http://symfony.com/schema/routing
1967+ https://symfony.com/schema/routing/routing-1.0.xsd" >
1968+
1969+ <route id =" app_logout" path =" /logout" methods =" GET" >
1970+ <path locale =" en" >/logout</path >
1971+ <path locale =" fr" >/deconnexion</path >
1972+ </route >
1973+ </routes >
1974+
1975+ .. code-block :: php
1976+
1977+ // config/routes.php
1978+ use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
1979+
1980+ return function (RoutingConfigurator $routes): void {
1981+ $routes->add('app_logout', [
1982+ 'en' => '/logout',
1983+ 'fr' => '/deconnexion',
1984+ ])
1985+ ->methods(['GET'])
1986+ ;
1987+ };
1988+
1989+ Then, pass the route name to the ``path `` option:
1990+
1991+ .. configuration-block ::
1992+
1993+ .. code-block :: yaml
1994+
1995+ # config/packages/security.yaml
1996+ security :
1997+ # ...
1998+
1999+ firewalls :
2000+ main :
2001+ # ...
2002+ logout :
2003+ path : app_logout
2004+
2005+ .. code-block :: xml
2006+
2007+ <!-- config/packages/security.xml -->
2008+ <?xml version =" 1.0" encoding =" UTF-8" ?>
2009+ <srv : container xmlns =" http://symfony.com/schema/dic/security"
2010+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
2011+ xmlns : srv =" http://symfony.com/schema/dic/services"
2012+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
2013+ https://symfony.com/schema/dic/services/services-1.0.xsd
2014+ http://symfony.com/schema/dic/security
2015+ https://symfony.com/schema/dic/security/security-1.0.xsd" >
2016+
2017+ <config >
2018+ <!-- ... -->
2019+
2020+ <firewall name =" main" >
2021+ <logout path =" app_logout" />
2022+ </firewall >
2023+ </config >
2024+ </srv : container >
2025+
2026+ .. code-block :: php
2027+
2028+ // config/packages/security.php
2029+ use Symfony\Config\SecurityConfig;
2030+
2031+ return static function (SecurityConfig $security): void {
2032+ // ...
2033+
2034+ $mainFirewall = $security->firewall('main');
2035+ // ...
2036+ $mainFirewall->logout()
2037+ ->path('app_logout')
2038+ ;
2039+ };
2040+
19532041 .. _retrieving-the-user-object :
19542042
19552043Fetching the User Object
0 commit comments