slam4:php:phalcon:first

Premier projet Phalcon

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).

Créer l'arborescence suivante :

firstPhalcon/
  app/
    controllers/
    models/
    views/
  public/
    css/
    img/
    js/

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)

<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.

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>

Créer le fichier index.php dans public :

<?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).

Dans app/controllers, créer le fichier IndexController.php :

<?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

Créer la vue app/views/index/index.phtml, qui sera appelée automatiquement par le contrôleur IndexController :

<?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 :

Ajouter le code pour éviter cette erreur

Créer le contrôleur manquant : app/controllers/InscriptionController.php :

<?php
class InscriptionController extends \Phalcon\Mvc\Controller
{

	public function indexAction()
	{

	}
}

Créer le formulaire app/views/inscription/index.phtml :

<?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'

-- Création de la base

Créer la base de données Mysql firstPhalconDb.

Créer la table users :

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

<?php
class Users extends \Phalcon\Mvc\Model{

}

-- Connexion à la base

...
    $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"
        ));
    });
...

Ajouter la méthode suivante dans InscriptionController, correspondant à l'url : inscription/enregistrement

<?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();
	}
}

Tester le formulaire d'ajout, et vérifier l'insertion du nouvel utilisateur dans la base de données.

En utilisant la méthode find() de la classe Model :

Afficher la liste des utilisateurs à partir de l'action index

  • slam4/php/phalcon/first.txt
  • Dernière modification : il y a 5 ans
  • de 127.0.0.1