Flash/PHP/Mysql - Partie 1: Introduction

Tagged:

Bon j'essaye de me remettre un peu la motivation pour le développement ... :) Et justement Flash me lance plein de nouveaux défis ...

Mon projet : Comment faire une appli Flash liée avec MySQL en passant par PHP (avec mes sabots ...)

Mes choix de techno :

  • Comme j'aime bien les framework et tout (PEAR était excellent en son temps, largement dépassé maintenant...) je vais utiliser ZendFramework qui est grosso modo un repository de composants et d'outils comme PEAR l'était, avec la couche PHP5 en plus ... On peut utiliser un MVC a la manière de RubyOnRails même si je trouve qu'on en est très loin, l'esprit est la ...
  • Les relations avec la base de données se font grace a PDO. On garde la souplesse de PEAR::DB, on ajoue la flexibilité et surtout la rapidité ... c'est natif dans php5 (quand on le compile avec ...) et c'est écrit en C donc ... c'est mieux ...
  • Le templating se fera avec un langage ultra high level qui s'appelle : PHP ... Et oui je rappelle que PHP est développé pour ça au départ et utiliser de Smarty, PHPTal et autre c'est bien beau mais ça n'apporte rien de plus ... si ce n'est la lourdeur d'un interpréteur écrit lui même en php !
  • En flash j'utiliserai ActionScript 2.0 parce que c'est object c'est vachement bien et tout ...

Comme tous les framework, le développement est moins straightforward, mais on y gagne par la suite (enfin c'est le but du framework sinon il sert a rien ...)

Alors mettre en place la structure des répertoires ... C'est libre mais j'indique la mienne (sous www/projetFlash):

Détailons un peu

  • Dans _/app/ j'ai bien les composantes du MVC (model vue et controlleur ...)
    1. les controlleurs sont les pages en fait ... http://localhost/projetFlash/Index/ ou http://localhost/projetFlash/Movie/HighQuality
    2. les models seront la représentation logique des données, pour l'instant j'en ai pas besoin je fait rien encore ...
    3. les vues sont coupées en 2
      1. Helpers qui désignent des classes utilitaires permettant la facilitation du développement dans les vues ...
      2. Pages qui contiendront toutes les pages (que j'ai découpé en fonction des controlleurs pour être plus clair ...)
  • Dans lib je fourre toutes les librairies externe et Zend (qui en fait partie du coup)
  • Dans files il y aura les images, les css, les swf enin toutes les choses annexes ...
  • Et finalement index.php qui est le moteur de tout ça

Le index.php va se découper en plusieurs partie pour l'instant ... le but étant simplement de faire fonctionner le framework !

  • Un gros try/catch avec des ini_set pour paramétrer les rapports d'erreur avec dedan :
    • Include path (il faut tout ajuster correctement pour faire fonctionner tout ça !)
    • View (paramétrer en disant ou il doit tout trouver ...
    • Controller (pareil que view)
    • un dispatch qui va lancer le framework !

Commençons par le try/catch

ini_set('display_errors', true);
ini_set('error_reporting', E_ALL);
 
try {
 
    //ici le code
 
} catch (Exception $e) {
    echo '<pre style="text-align:left;padding:10px;background:#ffea50;border:4px double red;">';
    echo $e->getMessage();
    echo '<div style="text-align:left;background:white;border:1px solid black;margin:30px;">';
    echo '<b>Trace :</b>';
    foreach ($e->getTrace() as $line) {
        echo '<div style="text-align:left;background:white;border-top:1px dotted black;margin:5px 0 15px 0;">';
        echo 'file :'.$line['file'].' ';
        echo $line['line'] .': '. $line['class'] . $line['type'] . $line['function'] . '<br />';
        //if (isset($line['args'])) {
          //  echo 'args : ';
            //print_r($line['args']);
        //}
        echo '</div>';
    }
    echo '<div>';
    echo '</pre>';
}

Voila dans tout le site, tout ce qui n'est pas catché tombe la dedan ... au moins on a une gestion (entendre affichage simplement) de l'erreur ...

Ajustements du include path

    $includePath = array('.', './_/app/models/');
    
    $libDir = './_/lib/';
    foreach(new DirectoryIterator($libDir) as $value) {
        $path = $libDir . $value;
        if (is_dir($path) && (!in_array((string)$value,array('.','..')))) {
            $includePath[] = $path;
        }
    }
    set_include_path(implode(PATH_SEPARATOR, $includePath));
    
    require_once('Zend.php');
    require_once('Zend/Loader.php');
    Zend_Loader::loadClass('Zend_Registry');

De cette manière on a un includepath qui nous permette d'accéder a tout ce dont on a besoin ! Et on le prouve en utilisant notre première classe Zend qui va nous permettre de loader les autres: Zend_Loader

On en met plein la vue

En ce qui concerne le paramétrage de la vue c'est très simple ... mais il faut le faire alors hop :

    Zend_Loader::loadClass('Zend_View');
    $view = new Zend_View();
 
    # views param    
    $view->setScriptPath('./_/app/views/Pages/');
    $view->setHelperPath('./_/app/views/Helpers/');
 
    # defaults variables
    $view->title = 'ProjetFlash';
    $view->stylesheets = array('files/css/styles.css');
    
    Zend_Registry::set('view', $view);

On load la vue, on lui file les bons répertoires, quelques variables de base et on le met dans le Registry de façon a pouvoir le récupérer de partout sans avoir a le passer en paramètre ... Le DesignPattern Registry est maintenant assez connu je m'étales pas ...

Et le controlleur

Pour le controlleur c'est encore plus simple depuis les dernière version ... Avant il fallait faire son propre routeur (voir les docs pour comprendre ce qu'est le routeur ...) et maintenant le routeur par défaut détecte si on est dans un sous répertoire et pas directement a la racine de www... C'était indispensable à mon gout...

    Zend_Loader::loadClass('Zend_Controller_Front');
    
    $controller = Zend_Controller_Front::getInstance();
    $controller->setControllerDirectory('./_/app/controllers/');

Ensuite il faut lancer le tout ...

    $controller->throwExceptions(true);
    $controller->dispatch();

Ca y est ou peu lancer le site patatrack ça fonctionne ??? ... heuuu il faut faire encore les vues et le controlleur mais bon ... la base est la il reste plus que le cosmétique ...

Un peu de templating

Bon commençons par les templates je trouve ça plus sympa... On va créer header.php, footer.php et Index/Index.php dans views/Pages.

header.php

<html>
    <head>
        <title><?= $this->title ?></title>
        
        <? foreach ($this->stylesheets as $stylesheet) { ?>
            <link href="<?= $stylesheet ?>" rel="stylesheet" type="text/css" />
        <? } ?>
    </head>
    
    <body>

footer.php

    </body>
</html>

Trop balaise ...

Index.php

<?= Zend_Registry::get('view')->render('header.php') ?>
 
<p>Ici on va faire plein de trucs</p>
 
<?= Zend_Registry::get('view')->render('footer.php') ?>

Violent non ?

404 pour la forme

<?= Zend::registry('view')->render('header.php') ?>
 
404 not found
 
<?= Zend::registry('view')->render('footer.php') ?>

Premier et principal controlleur

Faisons le controlleur qui va appeler ces vues app/controllers/IndexController.php :

Zend_Loader::loadClass('Zend_Controller_Action');
 
class IndexController extends Zend_Controller_Action {
 
    public function indexAction() {
        $view = Zend_Registry::get('view');
        echo $view->render('Index/index.php');
    }
 
    public function noRouteAction() {
        header('HTTP/1.1 404 Not found');
        $view = Zend_Registry::get('view');
        echo $view->render('Services/404.php');
    }
 
    public function __call($action, $arguments) {
        $this->noRouteAction();
    }
 
}

Test

Et voila ... maintenant quand on fait http://localhost/projetFlash/ on a un super truc :

<html>
    <head>
        <title>ProjetFlash</title>
        
                    <link href="files/css/styles.css" rel="stylesheet" type="text/css" />
            </head>
    
    <body>
<p>Ici on va faire plein de trucs</p>

    </body>

</html>

Chose qui s'obtient en 3 secondes avec un seul echo ... mais la vrai force réside dans la maitrise du framework ... après ça on fait des truc très poussé sans ajouter de complexité, alors qu'avec notre echo on serait bien vite paumé ...

Si je dois apporter des modifs sur ce billets je le ferai dans la semaine ... Sinon je prépare le prochain :)

[Edit du landemain]
Rajout de l'appelle a throwExceptions pour le controller ... sinon il les catch par défaut !

Comments

Tu devrais regarder aussi du côté d'Amfphp : http://www.amfphp.org/

Ça te permet de faire une sorte de RMI depuis Flash vers tes classes PHP.

Ah ouais ... pas mal ... tu lui file un restulset cash et tu le traite en ActionScript ...

Dans l'autre sens je suppose que c'est grosso modo la même chose ... Je regarderai plus en détail ce soir, et j'essayerai de voir si c'est util dans mon cas ...

Je pensais faire des LoadVars avec JSON et m'en sortir comme en AJAX ... On verra bien !