Un formulaire de création de compte avec Symfony et sfGuard
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.
![]()
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.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')
);
/* ...est que les données sont valides */
if ($this->form->isValid()) {
/* On crée l'utilisateur */
$sf_guard_user = $this->form->save();
$this->setFlash('message',
array('Vous êtes enregistrez,
<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, ….).
6 plugins Symfony indispensables
Écrit en PHP, orienté objet, implémentant le design pattern Moèle-Vue-Controlleur, doté de nombreuses fonctionnalités et soutenu par Yahoo! : Symfony, le framework web développé par Sensio Labs, à tout pour plaire.
L’une des forces de ce framework est la disponibilité de nombreux plugins qui permettent d’étendre ses fonctionnalités. On y trouve du bon et du moins bon, de l’utile comme du futile. Pour vous aider à bien démarré vos projets Symfony et vous faire gagner du temps lors de vos développement, j’ai sélectionné pour vous quelques plugins indispensables, que vous devriez installé dès les prémices du développement.

sfGuard
C’est le plus connu de tous les plugins Symfony. Il permet une gestion fine des utilisateurs ainsi leur authentification. Son utilisation est quasi-indispensable à tout déploiement de Symfony. De plus, c’est une dépendance d’autres plugins populaires tel que sfSimpleCMSPlugin ou sfSimpleForumPlugin.
sfThumbnailPlugin
Ce plugin permet tout simplement de générer des miniatures d’images uploadées. Indispensable !
A voir aussi, ce bout de code qui permet d’utiliser sfThumbnailPlugin avec le générateur d’admin.
sfFeed2Plugin
Avec sfFeed2Plugin générés des flux RSS et Atom à partir de vos modèle. Rapide à mettre en œuvre, il offre un service utile à vos visiteurs et qui ravie les robots des moteurs de recherche qui indexent votre site.
sfPropelActAsSluggableBehaviorPlugin
Ce plugin est destiné à l’ORM Propel qui est fourni par défaut avec Symfony. Il permet la génération automatique de slugs, c’est à dire d’identifiants descriptifs. Ces slugs sont très utiles au référencement car ajoutent à vos URLs des mots clefs pertinents. Autre avantage : ils masquent les IDs numériques de vos éléments et rend plus difficile à un pirate de découvrir l’architecture interne de votre application.
sfYzAjaxValidationPlugin
sfYzAjaxValidationPlugin ajoute une validation des formulaires côté client via AJAX. Il utilise les fichiers YAML définis côté serveur. Pas de code à écrire pour vous mais un gain de temps appréciable pour le visiteur (aucun rechargement de la page pour valider le formulaire) et une charge serveur réduite.
sfPropelSqlDiffPlugin
Avec Ruby On Rails et Django lorsque vous modifiez votre modèle, les changements sont répercutés sur la base de données. Ce n’est pas le cas par défaut avec Symfony, il faut effectuer les modifications à la main sur la base de données ou perde toutes nos données de test et ça devient vite très agaçant. Heureusement sfPropelSqlDiffPlugin est la ! Ce plugin ajoute quelques options à l’utilitaire en ligne de commande de Symfony et permet de répercuter uniquement les changements effectués dans le modèle sur la base de données.
