Skip to content

Kévin Dunglas

Founder of Les-Tilleuls.coop (worker-owned cooperative). Creator of API Platform, FrankenPHP, Mercure.rocks, Vulcain.rocks and of some Symfony components.

Menu
  • Talks
  • Resume
  • Sponsor me
  • Contact
Menu

Un formulaire de création de compte avec Symfony et sfGuard

Posted on October 14, 2008January 5, 2009 by Kévin Dunglas

sfGuard fait parti des plugins Symfony les plus utiles. Il ajoute à notre framework un système de gestion avancé des utilisateurs, groupes et permissions. Il inclut en standard un back office complet ainsi qu’un formulaire de connexion mais pas pour de la création de compte en front.

Symfony

Alors qu’il fût assez fastidieux de le réaliser avec la version 1.0 de Symfony, le nouveau système de création de formulaires introduit dans la version 1.1 nous facilite bien la tache.

Je ne reviendrais pas sur l’installation du plugin qui est très bien détaillée dans sa documentation.

Commençons par générer les formulaires associés à nos tables grâce à Propel : php symfony propel:build-forms. Attaquons-nous maintenant à la classe de notre formulaire d’enregistrement. Créez un fichier nommé sfGuardRegisterForm.class.php dans le répertoire lib/form/ qui contient ce code :

<?php
class sfGuardRegisterForm extends sfGuardUserForm
{
  public function configure()
  {
    parent::configure();

    /* Ici on ajoute une validation
        pour le mot de passe afin qu'il soit long
        d'au moins 6 caractères et d'au plus 128. */
    $this->validatorSchema['password'] = new sfValidatorString(
      array('min_length' => 6, 'max_length' => 128)
    );
  }
}

Comme vous pouvez le lire, on se contente de créer une classe qui hérite de sfGuardUserForm fournie avec le plugin et d’y ajouter une validation supplémentaire pour le mot de passe (par défaut il peut être vide). C’est également dans cette méthode configure que se déroulera la validation de vos champs personnalisés sur lesquels nous reviendrons plus bas.

Effacez la cache avec la commande php symfony cc. C’est déjà presque fini !

Créons un répertoire sfGuardAuth dans le répertoire modules de votre application puis deux sous répertoires dans sfGuardAuth nommés actions et templates. Ce pseudo-module nous permettre de surcharger le module sfGuardAuth du plugin afin de lui ajouter une action et une vue qui permettront à vos visiteurs de s’enregistrer sur votre site.

Créez un fichier actions.class.php dans le répertoire actions qui contient :

<?php
/* On doit inclure manuellement
l'action du plugin car l'autoloading ne fonctionne pas dans ce cas. */
require_once(sfConfig::get('sf_plugins_dir').
'/sfGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php');

/* Notre action dérive de celle fournie par le module
    afin d'hériter de ses actions propres. */
class sfGuardAuthActions extends BasesfGuardAuthActions
{
  public function executeRegister($request) {
    /* Passe le formulaire à la vue. */
    $this->form = new sfGuardRegisterForm();

    /* Si l'action est appelé via la méthode POST... */
    if ($request->isMethod('post')) {
      $this->form->bind(
        $request->getParameter('sf_guard_user')
      );

      /* ...et que les données sont valides */
      if ($this->form->isValid()) {

        /* On crée l'utilisateur */
        $sf_guard_user = $this->form->save();

        $this->getUser()->setFlash('message',
          'Vous êtes enregistré,
            <a href="/login">connectez-vous</a> !');
        $this->redirect('@homepage');
      }
      /* Sinon le formulaire ainsi que l'erreur sera ré-affiché */
    }
  }
}

Quand l’utilisateur est créé on redirige le visiteur vers la page d’accueil et on l’avertit grâce à un attribut flash.

Passons à la vue qui se nommera registerSuccess.php et qui se trouvera dans le répertoire templates :

<form action="<?php echo url_for('sfGuardAuth/register') ?>" method="POST">
  <table>
    <?php echo $form ?>
    <tr>
      <td colspan="2">
        <input type="submit" />
      </td>
    </tr>
  </table>
</form>

Très bien, notre formulaire fonctionne. Mais le plus fort arrive !

Vous avez ajouter des champs personnalisés au profil de votre utilisateur dans la table sf_guard_user_profile (cf. la documentation de sfGuard) ? Régénérez les formulaires associés à vos tables avec la commande php symfony propel:build-forms, effacez la cache à grand coup de php symfony cc, rechargez la page /sfGuardAuth/register et admirez : nos champs sont automatiquement reconnus et affichés. Vous pourrez leur ajouter des étapes de validation dans notre première classe sfGuardRegisterForm ou dans sfGuardUserProfileForm si vous voulez qu’elles s’appliquent à tous les formulaires héritant de cette classe (page de modification du profil, ….).

Related posts:

  1. Tag Suggestion for symfony
  2. Add reCAPTCHA widgets to Symfony forms
  3. jquery.confirmExit : où comment ne plus perdre les données d’un formulaire complété
  4. 6 plugins Symfony indispensables

8 thoughts on “Un formulaire de création de compte avec Symfony et sfGuard”

  1. Pingback: Anonymous
  2. Pingback: www.fuzz.fr
  3. Hugo says:
    October 15, 2008 at 6:47 pm

    On attend avec impatience la sortie officielle de la release 1.2 🙂

    Reply
  4. Php Redirect Parent says:
    December 2, 2008 at 9:49 am

    found your site on del.icio.us today and really liked it.. i bookmarked it and will be back to check it out some more later ..

    Reply
  5. Bruno says:
    February 11, 2009 at 7:23 am

    Bravo et merci pour ce post éclairant.

    J'ai 2 questions :
    1/ Comment paramétrer la route de ce formulaire dans mon module et importer la class sfGuardAuth ?
    en mettant options: { model: sfGuardAuth, type: object }
    j'ai l'erreur suivante : Class 'sfGuardAuth' not found

    2/ Est-il possible de surcharger également les class form du plugin ?
    J'ai essayé avec sfGuardLoginForm.class.php SANS SUCCES en recopiant/personnalisant le fichier sfGuardLoginForm.class.php dans le répertoire libform . J'ai donc été obligé de travailler dans le répertoire du plugin pluginssfGuardPluginlibform . Modifié le code à l'intérieur d'un plugin sachant que son code est susceptible d'évoluer avec les releases ne me semple pas la bonne solution, il doit y avoir une astuce…

    Reply
  6. Jerem says:
    June 15, 2009 at 10:16 am

    J'ai pas réussit à afficher les colones de ma table profil avec cette méthode.
    Une autre solution : dans le configure de votre profilForm.class.php mettre ceci :
    $userForm = new sfGuardUserForm($this->object->getsfGuardUser());
    $this->embedForm('User', $userForm);

    Là ça nous affiche bien les champs de 2 tableq.

    Reply
  7. max says:
    December 5, 2009 at 8:03 am

    ptit pb : auncune classe sfGuardRegisterForm n'existe

    Reply
  8. max says:
    December 5, 2009 at 8:16 am

    Tres simple en fait, suffit de surcharger dans le plugin et non au dehors :

    class sfGuardUserForm extends PluginsfGuardUserForm
    {
    public function configure()
    {
    unset(
    $this['algorithm'],
    $this['salt'],
    $this['is_active'],
    $this['is_super_admin'],
    $this['last_login'],
    $this['created_at'] ,
    $this['updated_at']
    );
    }
    }
    Le reste comme dhab..

    Reply

Leave a ReplyCancel reply

Social

  • Bluesky
  • GitHub
  • LinkedIn
  • Mastodon
  • X
  • YouTube

Links

  • API Platform
  • FrankenPHP
  • Les-Tilleuls.coop
  • Mercure.rocks
  • Vulcain.rocks

Subscribe to this blog

Top Posts & Pages

  • JSON Columns and Doctrine DBAL 3 Upgrade
  • Securely Access Private Git Repositories and Composer Packages in Docker Builds
  • Preventing CORS Preflight Requests Using Content Negotiation
  • FrankenPHP: The Modern Php App Server, written in Go
  • Symfony's New Native Docker Support (Symfony World)
  • Develop Faster With FrankenPHP
  • PHP and Symfony Apps As Standalone Binaries
  • How to debug Xdebug... or any other weird bug in PHP
  • HTTP compression in PHP (new Symfony AssetMapper feature)
  • Generate a Symfony password hash from the command line

Tags

Apache API API Platform Buzz Caddy Docker Doctrine FrankenPHP Go Google GraphQL HTTP/2 Hydra hypermedia Hébergement Javascript JSON-LD Kubernetes La Coopérative des Tilleuls Les-Tilleuls.coop Lille Linux Mac Mercure Mercure.rocks Messagerie Instantanée MySQL performance PHP Punk Rock Python React REST Rock'n'Roll Schema.org Security SEO SEO Symfony Symfony Live Sécurité Ubuntu Web 2.0 webperf XML

Archives

Categories

  • DevOps (84)
    • Ubuntu (68)
  • Go (17)
  • JavaScript (46)
  • Mercure (7)
  • Opinions (91)
  • PHP (170)
    • API Platform (77)
    • FrankenPHP (9)
    • Laravel (1)
    • Symfony (97)
    • Wordpress (6)
  • Python (14)
  • Security (15)
  • SEO (25)
  • Talks (46)
© 2025 Kévin Dunglas | Powered by Minimalist Blog WordPress Theme