{"id":314,"date":"2018-04-02T12:10:53","date_gmt":"2018-04-02T10:10:53","guid":{"rendered":"https:\/\/numa-bord.com\/miniblog\/?p=314"},"modified":"2018-06-08T16:19:35","modified_gmt":"2018-06-08T14:19:35","slug":"symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces","status":"publish","type":"post","link":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/","title":{"rendered":"Symfony 4 : Les base d&rsquo;une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s)"},"content":{"rendered":"<p>Quand on d\u00e9marre le d\u00e9veloppement d&rsquo;une site sous <a href=\"http:\/\/symfony.com\/\">Symfony<\/a>, l&rsquo;une des premi\u00e8re chose \u00e0 faire concerne la gestion des utilisateurs. En effet dans la plupart des cas notre application devra permettre \u00e0 des utilisateurs de s&rsquo;inscrire puis de se connecter au site afin d&rsquo;avoir acc\u00e8s \u00e0 des sections particuli\u00e8res (espace membre, espace administrateur). Je reprends dans cet article les diff\u00e9rents \u00e9l\u00e9ments \u00e0 mettre en place pour avoir une base de travail fonctionnelle.<\/p>\n<p>On va rendre possible une inscription (email \/ mot de passe), puis une connexion (idem). Une fois connect\u00e9 on aura acc\u00e8s a un espace membre.<\/p>\n<p>Nous partirons d&rsquo;une installation \u00ab\u00a0website\u00a0\u00bb de symfony 4 lanc\u00e9 avec la commande<\/p>\n<p><div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"bash codecolorer\">composer create-project symfony<span class=\"sy0\">\/<\/span>website-skeleton my-project<\/div><\/div>\n<p>La premi\u00e8re chose \u00e0 faire sera de cr\u00e9er la base de donn\u00e9es, et de la configurer dans le fichier \u00ab\u00a0\/.env\u00a0\u00bb, par exemple : <\/p>\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"bash codecolorer\"><span class=\"re2\">DATABASE_URL<\/span>=mysql:<span class=\"sy0\">\/\/<\/span>root:<span class=\"sy0\">@<\/span>localhost<span class=\"sy0\">\/<\/span>ma_base<\/div><\/div>\n<p>Entrons dans le vif du sujet, avec la cr\u00e9ation de l&rsquo;entit\u00e9 \u00ab\u00a0User\u00a0\u00bb, dans \u00ab\u00a0\/src\/Entity\/User.php\u00a0\u00bb. Elle contiendra les champs email, password, isActive, roles et \u00e9tendra la classe \u00ab\u00a0UserInterface\u00a0\u00bb de symfony. Ce qui nous donne avec les getters\/setters et les m\u00e9thodes obligatoires \u00e0 impl\u00e9menter, le code suivant : <\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">namespace<\/span> App\\Entity<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">use<\/span> Doctrine\\ORM\\Mapping <span class=\"kw1\">as<\/span> ORM<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Security\\Core\\User\\UserInterface<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Validator\\Constraints <span class=\"kw1\">as<\/span> <a href=\"http:\/\/www.php.net\/assert\"><span class=\"kw3\">Assert<\/span><\/a><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Bridge\\Doctrine\\Validator\\Constraints\\UniqueEntity<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co4\">\/**<br \/>\n&nbsp;* @ORM\\Table(name=&quot;user&quot;)<br \/>\n&nbsp;* @UniqueEntity(fields=&quot;email&quot;)<br \/>\n&nbsp;* @ORM\\Entity()<br \/>\n&nbsp;*\/<\/span><br \/>\n<span class=\"kw2\">class<\/span> User <span class=\"kw2\">implements<\/span> UserInterface<span class=\"sy0\">,<\/span> \\Serializable <span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @ORM\\Id<br \/>\n&nbsp; &nbsp; &nbsp;* @ORM\\Column(type=&quot;integer&quot;)<br \/>\n&nbsp; &nbsp; &nbsp;* @ORM\\GeneratedValue(strategy=&quot;AUTO&quot;)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$id<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @ORM\\Column(type=&quot;string&quot;, length=255, unique=true)<br \/>\n&nbsp; &nbsp; &nbsp;* @Assert\\NotBlank()<br \/>\n&nbsp; &nbsp; &nbsp;* @Assert\\Email()<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$email<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @Assert\\NotBlank()<br \/>\n&nbsp; &nbsp; &nbsp;* @Assert\\Length(max=250)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$plainPassword<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* The below length depends on the &quot;algorithm&quot; you use for encoding<br \/>\n&nbsp; &nbsp; &nbsp;* the password, but this works well with bcrypt.<br \/>\n&nbsp; &nbsp; &nbsp;*<br \/>\n&nbsp; &nbsp; &nbsp;* @ORM\\Column(type=&quot;string&quot;, length=64)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$password<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @ORM\\Column(name=&quot;is_active&quot;, type=&quot;boolean&quot;)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$isActive<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @ORM\\Column(name=&quot;roles&quot;, type=&quot;array&quot;)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$roles<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> __construct<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isActive<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ may not be needed, see section on salt below<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ $this-&gt;salt = md5(uniqid('', true));<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> getUsername<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">email<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> getSalt<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ you *may* need a real salt depending on your encoder<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ see section on salt below<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw4\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> getPassword<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">password<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> setPassword<span class=\"br0\">&#40;<\/span><span class=\"re0\">$password<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">password<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$password<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> getRoles<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/empty\"><span class=\"kw3\">empty<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">roles<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'ROLE_USER'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">roles<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> addRole<span class=\"br0\">&#40;<\/span><span class=\"re0\">$role<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">roles<\/span><span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$role<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> eraseCredentials<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/** @see \\Serializable::serialize() *\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> <a href=\"http:\/\/www.php.net\/serialize\"><span class=\"kw3\">serialize<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <a href=\"http:\/\/www.php.net\/serialize\"><span class=\"kw3\">serialize<\/span><\/a><span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">id<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">email<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">password<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isActive<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ see section on salt below<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ $this-&gt;salt,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/** @see \\Serializable::unserialize() *\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> <a href=\"http:\/\/www.php.net\/unserialize\"><span class=\"kw3\">unserialize<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$serialized<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/list\"><span class=\"kw3\">list<\/span><\/a> <span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">id<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">email<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">password<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isActive<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ see section on salt below<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ $this-&gt;salt<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/unserialize\"><span class=\"kw3\">unserialize<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$serialized<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> getId<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">id<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> getEmail<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">email<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> getPlainPassword<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">plainPassword<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> getIsActive<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isActive<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> setId<span class=\"br0\">&#40;<\/span><span class=\"re0\">$id<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">id<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$id<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> setEmail<span class=\"br0\">&#40;<\/span><span class=\"re0\">$email<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">email<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$email<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> setPlainPassword<span class=\"br0\">&#40;<\/span><span class=\"re0\">$plainPassword<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">plainPassword<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$plainPassword<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> setIsActive<span class=\"br0\">&#40;<\/span><span class=\"re0\">$isActive<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isActive<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$isActive<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Une fois ce fichier enregistr\u00e9, on peux mettre \u00e0 jour notre base de donn\u00e9es afin d&rsquo;y cr\u00e9er la table \u00ab\u00a0User\u00a0\u00bb. Pour cela on lance les 2 commandes suivantes :<\/p>\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"bash codecolorer\">php bin<span class=\"sy0\">\/<\/span>console doctrine:migration:diff<br \/>\nphp bin<span class=\"sy0\">\/<\/span>console doctrine:migration:migrate<\/div><\/div>\n<p>Il est temps de passer \u00e0 la configuration. Rendons nous dans le fichier \u00ab\u00a0\/config\/packages\/security.yaml\u00a0\u00bb et remplissons le de la fa\u00e7on suivante : <\/p>\n<div class=\"codecolorer-container yaml default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"yaml codecolorer\"><span class=\"co4\">security<\/span><span class=\"sy2\">:<br \/>\n<\/span> &nbsp; &nbsp;<span class=\"co1\"># encoder<\/span><span class=\"co4\"><br \/>\n&nbsp; &nbsp; encoders<\/span>:<span class=\"co4\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; App\\Entity\\User<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; algorithm<\/span><span class=\"sy2\">: <\/span>bcrypt<br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"co1\"># https:\/\/symfony.com\/doc\/current\/security.html#where-do-users-come-from-user-providers<\/span><span class=\"co4\"><br \/>\n&nbsp; &nbsp; providers<\/span>:<span class=\"co4\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; our_db_provider<\/span>:<span class=\"co4\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; entity<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; class<\/span><span class=\"sy2\">: <\/span>App\\Entity\\User<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; property<\/span><span class=\"sy2\">: <\/span>email<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co4\"><br \/>\n&nbsp; &nbsp; firewalls<\/span>:<span class=\"co4\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; main<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pattern<\/span><span class=\"sy2\">: <\/span> &nbsp; ^\/<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; http_basic<\/span><span class=\"sy2\">: <\/span>~<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; provider<\/span><span class=\"sy2\">: <\/span>our_db_provider<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; anonymous<\/span><span class=\"sy2\">: <\/span>~<span class=\"co4\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; form_login<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; login_path<\/span><span class=\"sy2\">: <\/span>login<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; check_path<\/span><span class=\"sy2\">: <\/span>login<span class=\"co4\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logout<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; path<\/span><span class=\"sy2\">: <\/span> &nbsp;\/logout<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; target<\/span><span class=\"sy2\">: <\/span>\/<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co4\"><br \/>\n&nbsp; &nbsp; role_hierarchy<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; ROLE_ADMIN<\/span><span class=\"sy2\">: <\/span> &nbsp; &nbsp; &nbsp;ROLE_USER<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">#ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co1\"># Easy way to control access for large sections of your site<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\"># Note: Only the *first* access control that matches will be used<\/span><span class=\"co4\"><br \/>\n&nbsp; &nbsp; access_control<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; - { path<\/span><span class=\"sy2\">: <\/span>^\/admin, roles<span class=\"sy2\">: <\/span>ROLE_ADMIN <span class=\"br0\">&#125;<\/span><span class=\"co3\"><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; - { path<\/span><span class=\"sy2\">: <\/span>^\/member, roles<span class=\"sy2\">: <\/span>ROLE_USER <span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Comme on peux le comprendre on a mis en place la configuration pour l&rsquo;encodage du mot de passe, on indique que nos utilisateurs passe par l&rsquo;entit\u00e9 \u00ab\u00a0App\\Entity\\User\u00a0\u00bb et que le login est le champ \u00ab\u00a0email\u00a0\u00bb. On configure aussi les liens \/login et \/logout \u00e0 utiliser, les diff\u00e9rents roles possible (ROLE_USER, ROLE_ADMIN) et bien sur les droits d\u2019acc\u00e8s en fonctions des r\u00f4les. Ici toutes les routes commen\u00e7ant par \u00ab\u00a0\/member\u00a0\u00bb ne seront accessible que pour les membres connect\u00e9s, et celle commen\u00e7ant par \u00ab\u00a0\/admin\u00a0\u00bb pour les membres connect\u00e9 ayant le r\u00f4le \u00ab\u00a0ROLE_ADMIN\u00a0\u00bb.<\/p>\n<p>Pour faire fonctionner la d\u00e9connexion \u00ab\u00a0logout\u00a0\u00bb, il faut simplement cr\u00e9er la route. On se rend donc dans le fichier \u00ab\u00a0\/config\/routes.yaml\u00a0\u00bb pour y mettre ce code : <\/p>\n<div class=\"codecolorer-container yaml default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"yaml codecolorer\"><span class=\"co4\">logout<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; path<\/span><span class=\"sy2\">: <\/span>\/logout<\/div><\/div>\n<p>Il nous reste \u00e0 cr\u00e9er la page contenant le formulaire d&rsquo;inscription, celle contenant le formulaire de connexion et tout sera fonctionnel.<\/p>\n<p>Pour l&rsquo;inscription, on va d&rsquo;abord cr\u00e9er le formulaire dans un fichier \u00e0 part qui sera \u00ab\u00a0\/src\/Form\/UserType.php\u00a0\u00bb. J&rsquo;ai ajout\u00e9s des classes css de bootstrap pour le bouton submit, car on verra plus bas que je propose d&rsquo;utiliser bootstrap 4 pour l&rsquo;affichage, mais il s&rsquo;agit bien sur uniquement d&rsquo;un exemple.<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">namespace<\/span> App\\Form<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Form\\AbstractType<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Form\\FormBuilderInterface<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Form\\Extension\\Core\\Type\\EmailType<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Form\\Extension\\Core\\Type\\RepeatedType<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Form\\Extension\\Core\\Type\\PasswordType<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Form\\Extension\\Core\\Type\\SubmitType<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">class<\/span> UserType <span class=\"kw2\">extends<\/span> AbstractType <span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> buildForm<span class=\"br0\">&#40;<\/span>FormBuilderInterface <span class=\"re0\">$builder<\/span><span class=\"sy0\">,<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a> <span class=\"re0\">$options<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$builder<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">-&gt;<\/span><span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'email'<\/span><span class=\"sy0\">,<\/span> EmailType<span class=\"sy0\">::<\/span><span class=\"kw2\">class<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">-&gt;<\/span><span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'plainPassword'<\/span><span class=\"sy0\">,<\/span> RepeatedType<span class=\"sy0\">::<\/span><span class=\"kw2\">class<\/span><span class=\"sy0\">,<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">'type'<\/span> <span class=\"sy0\">=&gt;<\/span> PasswordType<span class=\"sy0\">::<\/span><span class=\"kw2\">class<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">'first_options'<\/span> <span class=\"sy0\">=&gt;<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'label'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'Mot de passe'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">'second_options'<\/span> <span class=\"sy0\">=&gt;<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'label'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'Confirmation du mot de passe'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">-&gt;<\/span><span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'submit'<\/span><span class=\"sy0\">,<\/span> SubmitType<span class=\"sy0\">::<\/span><span class=\"kw2\">class<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'label'<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'Envoyer'<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'attr'<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"br0\">&#91;<\/span><span class=\"st_h\">'class'<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'btn-primary btn-block'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Nous allons utiliser ce formulaire dans le controller \u00ab\u00a0\/src\/Controller\/RegistrationController.php\u00a0\u00bb. La page permettant l&rsquo;inscription sera accessible sur l&rsquo;url \u00ab\u00a0\/register\u00a0\u00bb, ici on enregistre et on valide directement le compte, on peut aussi attribuer le r\u00f4le utilisateur dans ce controlleur. C&rsquo;est une base qui pourras \u00eatre am\u00e9lior\u00e9 (envoie d&rsquo;un email de confirmation&#8230;etc)<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">namespace<\/span> App\\Controller<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">use<\/span> App\\Form\\UserType<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> App\\Entity\\User<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\HttpFoundation\\Request<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Routing\\Annotation\\Route<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Security\\Core\\Encoder\\UserPasswordEncoderInterface<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">class<\/span> RegistrationController <span class=\"kw2\">extends<\/span> Controller <span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @Route(&quot;\/register&quot;)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> registerAction<span class=\"br0\">&#40;<\/span>Request <span class=\"re0\">$request<\/span><span class=\"sy0\">,<\/span> UserPasswordEncoderInterface <span class=\"re0\">$passwordEncoder<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ 1) build the form<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> User<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$form<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">createForm<\/span><span class=\"br0\">&#40;<\/span>UserType<span class=\"sy0\">::<\/span><span class=\"kw2\">class<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$user<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ 2) handle the submit (will only happen on POST)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$form<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">handleRequest<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$form<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isSubmitted<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"re0\">$form<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isValid<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ 3) Encode the password (you could also do this via Doctrine listener)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$password<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$passwordEncoder<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">encodePassword<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getPlainPassword<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">setPassword<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$password<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/on active par d\u00e9faut<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">setIsActive<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">true<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/$user-&gt;addRole(&quot;ROLE_ADMIN&quot;);<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ 4) save the User!<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$entityManager<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getDoctrine<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getManager<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$entityManager<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">persist<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$entityManager<\/span><span class=\"sy0\">-&gt;<\/span><a href=\"http:\/\/www.php.net\/flush\"><span class=\"kw3\">flush<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ ... do any other work - like sending them an email, etc<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ maybe set a &quot;flash&quot; success message for the user<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">addFlash<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'success'<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'Votre compte \u00e0 bien \u00e9t\u00e9 enregistr\u00e9.'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/return $this-&gt;redirectToRoute('login');<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">render<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'registration\/register.html.twig'<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'form'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$form<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">createView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'mainNavRegistration'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'title'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'Inscription'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Dans la foul\u00e9e, on enchaine sur le controller \u00ab\u00a0\/src\/Controller\/SecurityController.php\u00a0\u00bb avec la page \u00ab\u00a0\/login\u00a0\u00bb qui permettra la connexion, cette fois on cr\u00e9er directement le formulaire dans le controller, cela permet de voir une autre mani\u00e8re de faire que pour l&rsquo;enregistrement.<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">namespace<\/span> App\\Controller<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\HttpFoundation\\Request<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Routing\\Annotation\\Route<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Security\\Http\\Authentication\\AuthenticationUtils<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">class<\/span> SecurityController <span class=\"kw2\">extends<\/span> Controller <span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @Route(&quot;\/login&quot;, name=&quot;login&quot;)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> login<span class=\"br0\">&#40;<\/span>Request <span class=\"re0\">$request<\/span><span class=\"sy0\">,<\/span> AuthenticationUtils <span class=\"re0\">$authenticationUtils<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ get the login error if there is one<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$error<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$authenticationUtils<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getLastAuthenticationError<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ last username entered by the user<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$lastUsername<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$authenticationUtils<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getLastUsername<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$form<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'form.factory'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">-&gt;<\/span><span class=\"me1\">createNamedBuilder<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">null<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">-&gt;<\/span><span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'_username'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw4\">null<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'label'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'Email'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">-&gt;<\/span><span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'_password'<\/span><span class=\"sy0\">,<\/span> \\Symfony\\Component\\Form\\Extension\\Core\\Type\\PasswordType<span class=\"sy0\">::<\/span><span class=\"kw2\">class<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'label'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'Mot de passe'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">-&gt;<\/span><span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'ok'<\/span><span class=\"sy0\">,<\/span> \\Symfony\\Component\\Form\\Extension\\Core\\Type\\SubmitType<span class=\"sy0\">::<\/span><span class=\"kw2\">class<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'label'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'Ok'<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'attr'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'class'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'btn-primary btn-block'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getForm<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">render<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'security\/login.html.twig'<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">'mainNavLogin'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'title'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'Connexion'<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">'form'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$form<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">createView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">'last_username'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$lastUsername<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">'error'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$error<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Tout ce qui concerne la partie \u00ab\u00a0technique\u00a0\u00bb et maintenant en place et fonctionnel. Pour aller jusqu&rsquo;au bout on va aussi voir la mise en place des templates pour pouvoir tester le tout (avec un joli affichage \u00e0 l&rsquo;aide de bootstrap 4). Pour avoir acc\u00e8s \u00e0 nos route \u00ab\u00a0\/register\u00a0\u00bb et \u00ab\u00a0\/login\u00a0\u00bb de nos controllers il nous faut cr\u00e9er les 2 templates appel\u00e9s par ceux-ci. Les 2 sont tr\u00e8s simples et assez proches.<\/p>\n<p>\u00ab\u00a0\/templates\/registration\/register.html.twig\u00a0\u00bb<\/p>\n<div class=\"codecolorer-container twig default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"twig codecolorer\"><span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/extends.html\"><span class=\"kw1\">extends<\/span><\/a> <span class=\"st0\">'base.html.twig'<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <span class=\"re0\">body<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span>form<span class=\"br0\">&#40;<\/span>form<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>\u00ab\u00a0\/templates\/security\/login.html.twig\u00a0\u00bb<\/p>\n<div class=\"codecolorer-container twig default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"twig codecolorer\"><span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/extends.html\"><span class=\"kw1\">extends<\/span><\/a> <span class=\"st0\">'base.html.twig'<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <span class=\"re0\">body<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/if.html\"><span class=\"kw1\">if<\/span><\/a> <span class=\"re0\">error<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;alert alert-danger&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>ul <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;list-unstyled mb-0&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>li<span class=\"sy0\">&gt;&lt;<\/span>span <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;initialism form-error-icon badge badge-danger&quot;<\/span><span class=\"sy0\">&gt;<\/span>Error<span class=\"sy0\">&lt;\/<\/span>span<span class=\"sy0\">&gt;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>span <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;form-error-message&quot;<\/span><span class=\"sy0\">&gt;<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span> <span class=\"re0\">error<\/span><span class=\"re1\">.messageKey<\/span><span class=\"sy0\">|<\/span><a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/trans.html\"><span class=\"kw1\">trans<\/span><\/a><span class=\"br0\">&#40;<\/span>error<span class=\"re1\">.messageData<\/span>, <span class=\"st0\">'security'<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">&lt;\/<\/span>span<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>li<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>ul<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endif.html\"><span class=\"kw1\">endif<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span>form<span class=\"br0\">&#40;<\/span>form<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Ces 2 templates d\u00e9pendent de \u00ab\u00a0base.html.twig\u00a0\u00bb, c&rsquo;est \u00e0 dire le fichier \u00ab\u00a0\/templates\/base.html.twig\u00a0\u00bb, ci dessous je vous en met un exemple. comme vu pr\u00e9c\u00e9demment il utilise bootstrap 4. Pour aller jusqu&rsquo;au bout j&rsquo;ai inclus ici un menu vers diff\u00e9rente page de l&rsquo;application : les page d&rsquo;inscription\/connnexion ou de d\u00e9connexion si on est connect\u00e9. Ainsi qu&rsquo;une page d&rsquo;accueil, et un espace membre et\/ou espace admin en fonction du r\u00f4le de l&rsquo;utilisateur connect\u00e9. Pour que tout fonctionne il faudra donc cr\u00e9er les controllers pour ces 3 pages ainsi que leur vues, on voit \u00e7a juste apr\u00e8s, \u00e0 la fin de l&rsquo;article.<\/p>\n<div class=\"codecolorer-container twig default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"twig codecolorer\"><span class=\"sy0\">&lt;<\/span>!DOCTYPE <span class=\"re0\">html<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"sy0\">&lt;<\/span>html <span class=\"re0\">lang<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{{ app.request.locale }}&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>head<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>meta <span class=\"re0\">charset<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;UTF-8&quot;<\/span> <span class=\"sy0\">\/&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>meta <span class=\"re0\">name<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;viewport&quot;<\/span> <span class=\"re0\">content<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;width=device-width, initial-scale=1&quot;<\/span><span class=\"sy0\">\/&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>title<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <a href=\"http:\/\/twig.sensiolabs.org\/doc\/filters\/title.html\"><span class=\"kw2\">title<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/if.html\"><span class=\"kw1\">if<\/span><\/a> <a href=\"http:\/\/twig.sensiolabs.org\/doc\/filters\/title.html\"><span class=\"kw2\">title<\/span><\/a> <span class=\"kw5\">is<\/span> <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tests\/defined.html\"><span class=\"kw4\">defined<\/span><\/a> %<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span><a href=\"http:\/\/twig.sensiolabs.org\/doc\/filters\/title.html\"><span class=\"kw2\">title<\/span><\/a><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/else.html\"><span class=\"kw1\">else<\/span><\/a> %<span class=\"br0\">&#125;<\/span>Title<span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endif.html\"><span class=\"kw1\">endif<\/span><\/a> %<span class=\"br0\">&#125;<\/span> <span class=\"sy0\">|<\/span> <span class=\"re0\">Nom<\/span> <span class=\"re0\">du<\/span> <span class=\"re0\">site<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>title<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <span class=\"re0\">stylesheets<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"coMULTI\">{# bootstrap #}<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>link <span class=\"re0\">rel<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;stylesheet&quot;<\/span> <span class=\"re0\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;https:\/\/maxcdn.bootstrapcdn.com\/bootstrap\/4.0.0\/css\/bootstrap.min.css&quot;<\/span> <span class=\"re0\">integrity<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW\/dAiS6JXm&quot;<\/span> <span class=\"re0\">crossorigin<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;anonymous&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"coMULTI\">{# custom #}<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>link <span class=\"re0\">rel<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;stylesheet&quot;<\/span> <span class=\"re0\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{{ asset('assets\/css\/styles.css') }}&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>link <span class=\"re0\">rel<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;icon&quot;<\/span> <span class=\"re0\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;image\/x-icon&quot;<\/span> <span class=\"re0\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{{ asset('favicon.ico') }}&quot;<\/span> <span class=\"sy0\">\/&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>head<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>body<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>body <span class=\"re0\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{% block body_id %}{% endblock %}&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <span class=\"re0\">header<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>header <span class=\"re0\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;header&quot;<\/span> <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;bck1 border-bottom&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;container&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>h1<span class=\"sy0\">&gt;<\/span><span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/if.html\"><span class=\"kw1\">if<\/span><\/a> <a href=\"http:\/\/twig.sensiolabs.org\/doc\/filters\/title.html\"><span class=\"kw2\">title<\/span><\/a> <span class=\"kw5\">is<\/span> <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tests\/defined.html\"><span class=\"kw4\">defined<\/span><\/a> %<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span><a href=\"http:\/\/twig.sensiolabs.org\/doc\/filters\/title.html\"><span class=\"kw2\">title<\/span><\/a><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/else.html\"><span class=\"kw1\">else<\/span><\/a> %<span class=\"br0\">&#125;<\/span>Header<span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endif.html\"><span class=\"kw1\">endif<\/span><\/a> %<span class=\"br0\">&#125;<\/span><span class=\"sy0\">&lt;\/<\/span>h1<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>header<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <span class=\"re0\">nav<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>nav <span class=\"re0\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;main-nav&quot;<\/span> <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;container navbar navbar-expand-lg navbar-light bg-light border rounded mb-3&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>ul <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;navbar-nav&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>li <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-item {% if mainNavHome is defined %}active{% endif %}&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>a <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-link&quot;<\/span> <span class=\"re0\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{{path('app_homepage_index')}}&quot;<\/span><span class=\"sy0\">&gt;<\/span>Accueil<span class=\"sy0\">&lt;\/<\/span>a<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>li<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/if.html\"><span class=\"kw1\">if<\/span><\/a> <span class=\"re0\">is_granted<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'ROLE_USER'<\/span><span class=\"br0\">&#41;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>li <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-item {% if mainNavMember is defined %}active{% endif %}&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>a <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-link&quot;<\/span> <span class=\"re0\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{{path('app_member_index')}}&quot;<\/span><span class=\"sy0\">&gt;<\/span>Espace <span class=\"re0\">membre<\/span><span class=\"sy0\">&lt;\/<\/span>a<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>li<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endif.html\"><span class=\"kw1\">endif<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/if.html\"><span class=\"kw1\">if<\/span><\/a> <span class=\"re0\">is_granted<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'ROLE_ADMIN'<\/span><span class=\"br0\">&#41;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>li <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-item {% if mainNavAdmin is defined %}active{% endif %}&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>a <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-link&quot;<\/span> <span class=\"re0\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{{path('app_admin_homepage_index')}}&quot;<\/span><span class=\"sy0\">&gt;<\/span>Espace <span class=\"re0\">admin<\/span><span class=\"sy0\">&lt;\/<\/span>a<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>li<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endif.html\"><span class=\"kw1\">endif<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>ul<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>ul <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;navbar-nav ml-auto&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/if.html\"><span class=\"kw1\">if<\/span><\/a> <span class=\"re0\">is_granted<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'ROLE_USER'<\/span><span class=\"br0\">&#41;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>li <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-item&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>a <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-link&quot;<\/span> <span class=\"re0\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{{path('logout')}}&quot;<\/span><span class=\"sy0\">&gt;<\/span>D\u00e9connexion<span class=\"sy0\">&lt;\/<\/span>a<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>li<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/else.html\"><span class=\"kw1\">else<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>li <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-item {% if mainNavLogin is defined %}active{% endif %}&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>a <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-link&quot;<\/span> <span class=\"re0\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{{path('login')}}&quot;<\/span><span class=\"sy0\">&gt;<\/span>Connexion<span class=\"sy0\">&lt;\/<\/span>a<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>li<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>li <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-item {% if mainNavRegistration is defined %}active{% endif %}&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>a <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;nav-link&quot;<\/span> <span class=\"re0\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;{{path('app_registration_register')}}&quot;<\/span><span class=\"sy0\">&gt;<\/span>Inscription<span class=\"sy0\">&lt;\/<\/span>a<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>li<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endif.html\"><span class=\"kw1\">endif<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>ul<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>nav<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <span class=\"re0\">flash<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/for.html\"><span class=\"kw1\">for<\/span><\/a> <span class=\"re0\">flash_message<\/span> <span class=\"kw5\">in<\/span> <span class=\"re0\">app<\/span><span class=\"re1\">.session<\/span><span class=\"re1\">.flashbag<\/span><span class=\"re1\">.get<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'success'<\/span><span class=\"br0\">&#41;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;container alert alert-success&quot;<\/span> <span class=\"re0\">role<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;alert&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span> <span class=\"re0\">flash_message<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endfor.html\"><span class=\"kw1\">endfor<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/for.html\"><span class=\"kw1\">for<\/span><\/a> <span class=\"re0\">flash_message<\/span> <span class=\"kw5\">in<\/span> <span class=\"re0\">app<\/span><span class=\"re1\">.session<\/span><span class=\"re1\">.flashbag<\/span><span class=\"re1\">.get<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'info'<\/span><span class=\"br0\">&#41;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;container alert alert-info&quot;<\/span> <span class=\"re0\">role<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;alert&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span> <span class=\"re0\">flash_message<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endfor.html\"><span class=\"kw1\">endfor<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/for.html\"><span class=\"kw1\">for<\/span><\/a> <span class=\"re0\">flash_message<\/span> <span class=\"kw5\">in<\/span> <span class=\"re0\">app<\/span><span class=\"re1\">.session<\/span><span class=\"re1\">.flashbag<\/span><span class=\"re1\">.get<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'warning'<\/span><span class=\"br0\">&#41;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;container alert alert-warning&quot;<\/span> <span class=\"re0\">role<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;alert&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span> <span class=\"re0\">flash_message<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endfor.html\"><span class=\"kw1\">endfor<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/for.html\"><span class=\"kw1\">for<\/span><\/a> <span class=\"re0\">flash_message<\/span> <span class=\"kw5\">in<\/span> <span class=\"re0\">app<\/span><span class=\"re1\">.session<\/span><span class=\"re1\">.flashbag<\/span><span class=\"re1\">.get<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'danger'<\/span><span class=\"br0\">&#41;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;container alert alert-danger&quot;<\/span> <span class=\"re0\">role<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;alert&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span> <span class=\"re0\">flash_message<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endfor.html\"><span class=\"kw1\">endfor<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;container bck1 padded&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <span class=\"re0\">body<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <span class=\"re0\">footer<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>footer <span class=\"re0\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;footer&quot;<\/span> <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;bck1 border-top&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"re0\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;container&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>h4<span class=\"sy0\">&gt;<\/span>Footer<span class=\"sy0\">&lt;\/<\/span>h4<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>footer<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/block.html\"><span class=\"kw1\">block<\/span><\/a> <span class=\"re0\">javascripts<\/span> %<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#123;<\/span>% <a href=\"http:\/\/twig.sensiolabs.org\/doc\/tags\/endblock.html\"><span class=\"kw1\">endblock<\/span><\/a> %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>body<span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"sy0\">&lt;\/<\/span>html<span class=\"sy0\">&gt;<\/span><\/div><\/div>\n<p>Le layout pr\u00e9sent\u00e9 ci-dessus inclus en plus de bootstrap un fichier css custom permettant d&rsquo;ajouter nos propres classe de pr\u00e9sentation. Voici les quelques lignes ajout\u00e9 pour ma part dans \u00ab\u00a0\/public\/assets\/css\/styles.css\u00a0\u00bb<\/p>\n<div class=\"codecolorer-container css default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"css codecolorer\"><span class=\"coMULTI\">\/*base*\/<\/span><br \/>\nbody<span class=\"br0\">&#123;<\/span><span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span> <span class=\"re0\">#ebeff2<\/span><span class=\"sy0\">;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"re1\">.bck1<\/span><span class=\"br0\">&#123;<\/span><span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span> <span class=\"re0\">#fff<\/span><span class=\"sy0\">;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"coMULTI\">\/*generique*\/<\/span><br \/>\n<span class=\"re1\">.padded<\/span><span class=\"br0\">&#123;<\/span><span class=\"kw1\">padding<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">15px<\/span><span class=\"sy0\">;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"coMULTI\">\/*header*\/<\/span><br \/>\nheader<span class=\"re0\">#header<\/span> <span class=\"br0\">&#123;<\/span><span class=\"kw1\">margin-bottom<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">20px<\/span><span class=\"sy0\">;<\/span><span class=\"kw1\">padding<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">10px<\/span><span class=\"sy0\">;<\/span><span class=\"br0\">&#125;<\/span><br \/>\nheader<span class=\"re0\">#header<\/span> h1 <span class=\"br0\">&#123;<\/span><span class=\"kw1\">text-align<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">center<\/span><span class=\"sy0\">;<\/span><span class=\"kw1\">color<\/span><span class=\"sy0\">:<\/span> <span class=\"re0\">#5cb85c<\/span><span class=\"sy0\">;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"coMULTI\">\/*footer*\/<\/span><br \/>\nfooter<span class=\"re0\">#footer<\/span><span class=\"br0\">&#123;<\/span><span class=\"kw1\">margin-top<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">20px<\/span><span class=\"sy0\">;<\/span><span class=\"kw1\">padding<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">10px<\/span><span class=\"sy0\">;<\/span><span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Et pour que nos formulaires s&rsquo;affichent en suivant les conventions de bootstrap 4 on remercie symfony et sa communaut\u00e9, une seule ligne de configuration suffit ! Dans \u00ab\u00a0\/config\/packages\/twig.yaml\u00a0\u00bb :<\/p>\n<div class=\"codecolorer-container yaml default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"yaml codecolorer\"><span class=\"co4\">twig<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; form_themes<\/span><span class=\"sy2\">: <\/span><span class=\"br0\">&#91;<\/span>'bootstrap_4_layout.html.twig'<span class=\"br0\">&#93;<\/span><\/div><\/div>\n<p>Pour la page d&rsquo;accueil le simple controller \u00ab\u00a0\/src\/Controller\/HomepageController.php\u00a0\u00bb suffira : <\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">namespace<\/span> App\\Controller<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Routing\\Annotation\\Route<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">class<\/span> HomepageController <span class=\"kw2\">extends<\/span> Controller <span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @Route(&quot;\/&quot;)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> index<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">render<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'homepage\/index.html.twig'<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'mainNavHome'<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'title'<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'Accueil'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Rien de sp\u00e9cial pour la vue il suffit de cr\u00e9er le fichier correspandant \u00ab\u00a0\/templates\/homepage\/index.html.twig\u00a0\u00bb de la m\u00eame fa\u00e7on qu&rsquo;on l&rsquo;a fait pour \u00ab\u00a0inscription\u00a0\u00bb et \u00ab\u00a0login\u00a0\u00bb, avec le contenu que l&rsquo;on souhaite.<\/p>\n<p>Le dernier points \u00e0 voir, c&rsquo;est la cr\u00e9ation des \u00ab\u00a0espace membre\u00a0\u00bb et \u00ab\u00a0espace administrateur\u00a0\u00bb limit\u00e9 selon les r\u00f4les de l&rsquo;utilisateur. Il suffit pour cela, en accord avec la configuration faite dans \u00ab\u00a0\/config\/packages\/security.yaml\u00a0\u00bb de faire commencer les routes par \u00ab\u00a0\/member\u00a0\u00bb ou \u00ab\u00a0\/admin\u00a0\u00bb selon ce que l&rsquo;on souhaite. Voici pour l&rsquo;espace utilisateur (fichier \u00ab\u00a0\/src\/Controller\/MemberController.php\u00a0\u00bb) :<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">namespace<\/span> App\\Controller<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Routing\\Annotation\\Route<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co4\">\/** @Route(&quot;\/member&quot;) *\/<\/span><br \/>\n<span class=\"kw2\">class<\/span> MemberController <span class=\"kw2\">extends<\/span> Controller <span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @Route(&quot;\/&quot;)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> index<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">render<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'member\/index.html.twig'<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'mainNavMember'<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'title'<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'Espace Membre'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Exactement pareil pour l&rsquo;admin, sauf que dans un soucis d&rsquo;organisation je place le fichier dans un dossier admin, ce qui donne \u00ab\u00a0src\/Controller\/Admin\/HomepageController.php : \u00ab\u00a0<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">namespace<\/span> App\\Controller\\Admin<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Routing\\Annotation\\Route<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co4\">\/** @Route(&quot;\/admin&quot;) *\/<\/span><br \/>\n<span class=\"kw2\">class<\/span> HomepageController <span class=\"kw2\">extends<\/span> Controller <span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co4\">\/**<br \/>\n&nbsp; &nbsp; &nbsp;* @Route(&quot;\/&quot;)<br \/>\n&nbsp; &nbsp; &nbsp;*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> index<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">render<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'admin\/homepage\/index.html.twig'<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st_h\">'mainNavAdmin'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'title'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'Espace Admin'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Je ne rajoute pas le code des \u00ab\u00a0views\u00a0\u00bb car rien de particulier et donc m\u00eame processus que pour la page d&rsquo;accueil.<\/p>\n<p>C&rsquo;est termin\u00e9 pour ce long article \u00e0 r\u00e9utiliser \u00e0 souhait lors du d\u00e9marrage d&rsquo;un projet symfony 4<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quand on d\u00e9marre le d\u00e9veloppement d&rsquo;une site sous Symfony, l&rsquo;une des premi\u00e8re chose \u00e0 faire concerne la gestion des utilisateurs. En effet dans la plupart des cas notre application devra permettre \u00e0 des utilisateurs de s&rsquo;inscrire puis de se connecter au site afin d&rsquo;avoir acc\u00e8s \u00e0 des sections particuli\u00e8res (espace membre, espace administrateur). Je reprends [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2,3],"tags":[],"class_list":["post-314","post","type-post","status-publish","format-standard","hentry","category-developpement","category-symfony"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Symfony 4 : Les base d&#039;une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s) - Pense b\u00eate d&#039;un d\u00e9veloppeur web<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Symfony 4 : Les base d&#039;une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s) - Pense b\u00eate d&#039;un d\u00e9veloppeur web\" \/>\n<meta property=\"og:description\" content=\"Quand on d\u00e9marre le d\u00e9veloppement d&rsquo;une site sous Symfony, l&rsquo;une des premi\u00e8re chose \u00e0 faire concerne la gestion des utilisateurs. En effet dans la plupart des cas notre application devra permettre \u00e0 des utilisateurs de s&rsquo;inscrire puis de se connecter au site afin d&rsquo;avoir acc\u00e8s \u00e0 des sections particuli\u00e8res (espace membre, espace administrateur). Je reprends [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/\" \/>\n<meta property=\"og:site_name\" content=\"Pense b\u00eate d&#039;un d\u00e9veloppeur web\" \/>\n<meta property=\"article:published_time\" content=\"2018-04-02T10:10:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-06-08T14:19:35+00:00\" \/>\n<meta name=\"author\" content=\"Numa\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Numa\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/\"},\"author\":{\"name\":\"Numa\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e\"},\"headline\":\"Symfony 4 : Les base d&rsquo;une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s)\",\"datePublished\":\"2018-04-02T10:10:53+00:00\",\"dateModified\":\"2018-06-08T14:19:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/\"},\"wordCount\":2210,\"commentCount\":35,\"articleSection\":[\"D\u00e9veloppement\",\"Symfony\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/\",\"url\":\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/\",\"name\":\"Symfony 4 : Les base d'une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s) - Pense b\u00eate d&#039;un d\u00e9veloppeur web\",\"isPartOf\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#website\"},\"datePublished\":\"2018-04-02T10:10:53+00:00\",\"dateModified\":\"2018-06-08T14:19:35+00:00\",\"author\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e\"},\"breadcrumb\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/numa-bord.com\/miniblog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Symfony 4 : Les base d&rsquo;une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#website\",\"url\":\"https:\/\/numa-bord.com\/miniblog\/\",\"name\":\"Pense b\u00eate d&#039;un d\u00e9veloppeur web\",\"description\":\"(php, javascript, Symfony, Wordpress....)\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/numa-bord.com\/miniblog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e\",\"name\":\"Numa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g\",\"caption\":\"Numa\"},\"url\":\"https:\/\/numa-bord.com\/miniblog\/author\/negonner\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Symfony 4 : Les base d'une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s) - Pense b\u00eate d&#039;un d\u00e9veloppeur web","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/","og_locale":"fr_FR","og_type":"article","og_title":"Symfony 4 : Les base d'une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s) - Pense b\u00eate d&#039;un d\u00e9veloppeur web","og_description":"Quand on d\u00e9marre le d\u00e9veloppement d&rsquo;une site sous Symfony, l&rsquo;une des premi\u00e8re chose \u00e0 faire concerne la gestion des utilisateurs. En effet dans la plupart des cas notre application devra permettre \u00e0 des utilisateurs de s&rsquo;inscrire puis de se connecter au site afin d&rsquo;avoir acc\u00e8s \u00e0 des sections particuli\u00e8res (espace membre, espace administrateur). Je reprends [&hellip;]","og_url":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/","og_site_name":"Pense b\u00eate d&#039;un d\u00e9veloppeur web","article_published_time":"2018-04-02T10:10:53+00:00","article_modified_time":"2018-06-08T14:19:35+00:00","author":"Numa","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Numa","Dur\u00e9e de lecture estim\u00e9e":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/#article","isPartOf":{"@id":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/"},"author":{"name":"Numa","@id":"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e"},"headline":"Symfony 4 : Les base d&rsquo;une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s)","datePublished":"2018-04-02T10:10:53+00:00","dateModified":"2018-06-08T14:19:35+00:00","mainEntityOfPage":{"@id":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/"},"wordCount":2210,"commentCount":35,"articleSection":["D\u00e9veloppement","Symfony"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/","url":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/","name":"Symfony 4 : Les base d'une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s) - Pense b\u00eate d&#039;un d\u00e9veloppeur web","isPartOf":{"@id":"https:\/\/numa-bord.com\/miniblog\/#website"},"datePublished":"2018-04-02T10:10:53+00:00","dateModified":"2018-06-08T14:19:35+00:00","author":{"@id":"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e"},"breadcrumb":{"@id":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/numa-bord.com\/miniblog\/symfony-4-les-base-dune-gestion-des-utilisateurs-inscription-connexion-droits-dacces\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/numa-bord.com\/miniblog\/"},{"@type":"ListItem","position":2,"name":"Symfony 4 : Les base d&rsquo;une gestion des utilisateurs (inscription, connexion, droits d\u2019acc\u00e8s)"}]},{"@type":"WebSite","@id":"https:\/\/numa-bord.com\/miniblog\/#website","url":"https:\/\/numa-bord.com\/miniblog\/","name":"Pense b\u00eate d&#039;un d\u00e9veloppeur web","description":"(php, javascript, Symfony, Wordpress....)","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/numa-bord.com\/miniblog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e","name":"Numa","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g","caption":"Numa"},"url":"https:\/\/numa-bord.com\/miniblog\/author\/negonner\/"}]}},"_links":{"self":[{"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/posts\/314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/comments?post=314"}],"version-history":[{"count":30,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/posts\/314\/revisions"}],"predecessor-version":[{"id":376,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/posts\/314\/revisions\/376"}],"wp:attachment":[{"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/media?parent=314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/categories?post=314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/tags?post=314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}