Premier projet Phalcon
-- Création
A partir de votre IDE, créer un nouveau projet PHP, en prenant soin de spécifier un dossier appartenant à la racine du serveur web (htdocs ou www).
-- Structure des fichiers
Créer l'arborescence suivante :
1 2 3 4 5 6 7 8 9 |
firstPhalcon/ app/ controllers/ models/ views/ public/ css/ img/ js/ |
-- URLs et sécurité
L’accès direct aux dossiers différents de public sera interdit. On utilise le mod-rewrite de apache (qu'il faut éventuellement activer dans http.conf), et on établit la réécriture d'url via les fichiers htaccess suivants :
Toutes les URLs sont redirigées vers le dossier public (les autres dossiers sont inaccessibles, donc public est le root de l'application)
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] < /IfModule > |
Le second fichier htaccess indique que pour les fichiers existants de public, il n'y a pas de réécriture. Pour tous les autres, c'est le fichier index.php qui gère est qui est le point d'entrée de l'application.
1 2 3 4 5 6 7 8 |
AddDefaultCharset UTF-8 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] < /IfModule > |
-- Mise en place de MVC
Créer le fichier index.php dans public :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php try { //Enregistrement d'un autoloader pour premettre l'inclusion auto des fichiers de classe $loader = new \Phalcon\Loader(); $loader ->registerDirs( array ( '../app/controllers/' , '../app/models/' ))->register(); //DI est le service responsable de l'injection de dépendance des services Phalcon utilisés $di = new Phalcon\DI\FactoryDefault(); //Configuration des vues $di ->set( 'view' , function (){ $view = new \Phalcon\Mvc\View(); $view ->setViewsDir( '../app/views/' ); return $view ; }); //Configuration de l'URL de base $di ->set( 'url' , function (){ $url = new \Phalcon\Mvc\Url(); $url ->setBaseUri( '/firstPhalcon/' ); return $url ; }); //Interception de la requête pour routage et dispatching $application = new \Phalcon\Mvc\Application( $di ); echo $application ->handle()->getContent(); } catch (\Phalcon\Exception $e ) { echo "PhalconException: " , $e ->getMessage(); } |
L'architecture MVC est déjà mise en place et prête à fonctionner (en quelques 10 lignes).
-- Premier contrôleur
Dans app/controllers, créer le fichier IndexController.php :
1 2 3 4 5 6 7 8 9 10 |
<?php class IndexController extends \Phalcon\Mvc\Controller{ public function indexAction() { echo "<h1>Hello world !</h1>" ; } } |
Ce contrôleur devient le contrôleur par défaut pour les requêtes vers les URLs:
- /
- /index
-- Première vue
Créer la vue app/views/index/index.phtml, qui sera appelée automatiquement par le contrôleur IndexController :
1 2 3 |
<?php echo "<h1>Hello world !</h1>" ; echo Phalcon\Tag::linkTo( "inscription" , "Inscrivez-vous..." ); |
L'appel de la méthode linkTo sur la classe Tag insère un lien hypertexte pointant vers le contrôleur InscriptionController qui n'existe pas encore.
Tester la page, et cliquer sur le lien :
Résultat du click sur Inscrivez-vous :
-- Premier formulaire
Créer le contrôleur manquant : app/controllers/InscriptionController.php :
1 2 3 4 5 6 7 8 9 |
<?php class InscriptionController extends \Phalcon\Mvc\Controller { public function indexAction() { } } |
Créer le formulaire app/views/inscription/index.phtml :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php use Phalcon\Tag; ?> <h2>Inscription</h2> <?php echo Tag::form( "inscription/enregistrement" ); ?> <p> <label for = "nom" >Nom : </label> <?php echo Tag::textField( array ( "nom" , "required" )) ?> </p> <p> <label for = "email" >Email : </label> <?php echo Tag::emailField( "email" ) ?> </p> <p> <?php echo Tag::submitButton( "Enregistrement" ) ?> </p> </form> |
La validation HTML par défaut est bien présente :
Mais la validation du formulaire correctement renseigné signale l'absence de l'action enregistrement du contrôleur InscriptionController.
PhalconException: Action 'enregistrement' was not found on handler 'inscription'
-- Premier modèle
-- Création de la base
Créer la base de données Mysql firstPhalconDb.
Créer la table users :
1 2 3 4 5 6 |
CREATE TABLE `users` ( `id` int (10) unsigned NOT NULL AUTO_INCREMENT, `nom` varchar (70) NOT NULL , `email` varchar (70) NOT NULL , PRIMARY KEY (`id`) ); |
-- Création d'un modèle
1 2 3 4 |
<?php class Users extends \Phalcon\Mvc\Model{ } |
-- Connexion à la base
1 2 3 4 5 6 7 8 9 10 11 12 13 |
... $di = new Phalcon\DI\FactoryDefault(); //Configuration du service database $di ->set( 'db' , function (){ return new \Phalcon\Db\Adapter\Pdo\Mysql( array ( "host" => "localhost" , "username" => "root" , "password" => "" , "dbname" => "firstPhalconDb" )); }); ... |
-- Validation du formulaire et enregistrement
Ajouter la méthode suivante dans InscriptionController, correspondant à l'url : inscription/enregistrement
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php class InscriptionController extends \Phalcon\Mvc\Controller { public function indexAction(){ } public function enregistrementAction(){ $user = new Users(); //Enregistrement et vérification des erreurs $success = $user ->save( $this ->request->getPost(), array ( 'nom' , 'email' )); if ( $success ) { echo "Merci de votre enregistrement !" ; } else { echo "Erreurs lors de l'enregistrement : " ; foreach ( $user ->getMessages() as $message ) { echo $message ->getMessage(), "<br/>" ; } } $this ->view->disable(); } } |
Liste des utilisateurs
En utilisant la méthode find() de la classe Model :