Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1572 connectés 

 


 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  27  28  29  ..  62  63  64  65  66  67
Auteur Sujet :

Model View Controller (MVC) - Architecture des applications PHP

n°1587974
AlphaZone
Posté le 18-07-2007 à 10:14:17  profilanswer
 

Reprise du message précédent :
Une chose qui serait bien est que vous postiez des exemples car j'ai un peu de mal à concevoir tout ce dont vous racontez :D Je ne pense pas être le seul ;)
 
MERCI


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
mood
Publicité
Posté le 18-07-2007 à 10:14:17  profilanswer
 

n°1587979
skeye
Posté le 18-07-2007 à 10:16:47  profilanswer
 

Shinuza a écrit :

Ca peut aussi (même si ça se rapproche assez de la partie controlleur) proposer une structure conditionelle


En lien avec l'affichage, alors.
Genre le controleur passe la langue à la vue, et les fonctions de celle-ci vont retourner des choses différentes en fonction de la valeur du paramètre.:o


---------------
Can't buy what I want because it's free -
n°1588021
Dj YeLL
$question = $to_be || !$to_be;
Posté le 18-07-2007 à 10:53:53  profilanswer
 


 
Ce que j'utilise pour les images internes
 

Code :
  1. function image($path, $file, $alt = null, $title = null) {
  2.    $alt   = is_null($alt)   ? $file : $alt;
  3.    $title = is_null($title) ? ''    : 'title="' . $title . '"';
  4.    return '<img src="' . IMG_ROOT . $path . '/' . $file . '" alt="' . $alt . '" ' . $title . ' />';
  5. }


 

Code :
  1. image('avatars', 'mon_image.jpg');


 
qui me sort un :
 

Code :
  1. <img src="public/img/avatars/mon_image.jpg" alt="mon_image.jpg" />


---------------
Gamertag: CoteBlack YeLL
n°1588135
FlorentG
Posté le 18-07-2007 à 12:30:11  profilanswer
 

Dj YeLL a écrit :

 

Ce que j'utilise pour les images internes

 
Code :
  1. function image($path, $file, $alt = null, $title = null) {
  2.    $alt   = is_null($alt)   ? $file : $alt;
  3.    $title = is_null($title) ? ''    : 'title="' . $title . '"';
  4.    return '<img src="' . IMG_ROOT . $path . '/' . $file . '" alt="' . $alt . '" ' . $title . ' />';
  5. }




T'as pas plus naze que de mettre le fichier dans le alt en cas de alt vide ? :o :o :o Si pas de alt, alors alt vide, mais surtout pas mettre le fichier

Message cité 1 fois
Message édité par FlorentG le 18-07-2007 à 12:30:42
n°1588137
Dj YeLL
$question = $to_be || !$to_be;
Posté le 18-07-2007 à 12:33:20  profilanswer
 

FlorentG a écrit :


T'as pas plus naze que de mettre le fichier dans le alt en cas de alt vide ? :o :o :o Si pas de alt, alors alt vide, mais surtout pas mettre le fichier

 

Ben en fait c'est surtout mon exemple qu'est pourri :o

 

Alors après c'est sûr que c'est pas forcément le mieux, mais j'ai justement fait ça parce que mes noms d'images sont pour la plupart explicite [:figti]

 

Edit : Tu mettrais quoi ? "image" ? :D

 

Edit 2 : j'avais pas vu que tu disais un alt vide ... mais je croyais que le alt était obligatoire ? :??:


Message édité par Dj YeLL le 18-07-2007 à 12:34:18

---------------
Gamertag: CoteBlack YeLL
n°1588142
FlorentG
Posté le 18-07-2007 à 12:40:02  profilanswer
 

Alt est obligatoire, mais ça veut pas dire qu'il ne peut pas être vide, justement...

n°1588148
Dj YeLL
$question = $to_be || !$to_be;
Posté le 18-07-2007 à 12:43:51  profilanswer
 

Moué ... je vois pas l'intérêt qu'il soit obligatoire s'il peut rester vide dans ce cas [:spamafote]


---------------
Gamertag: CoteBlack YeLL
n°1588150
FlorentG
Posté le 18-07-2007 à 12:45:42  profilanswer
 

Genre pour une barre d'outils, tu met une image et un texte, style :

Code :
  1. <a href="edit.html"><img src="edit.png" alt=""> Modifier</a>


Ceux sans CSS verront le bel icône, mais en même temps comme ça sert à rien on fait pas chier les aveugles avec un texte dupliqué ou un fichier image...

n°1588178
vanadium
N° Atomique : 23
Posté le 18-07-2007 à 13:06:45  profilanswer
 

Un exemple de helper pour une image quelconque :

Code :
  1. /**
  2. * Simple helper to display an image HTML tag.
  3. *
  4. * @param String $src (Ex: 'www.website.com/image.png')
  5. * @param String $alt (Ex: 'My favorite image')
  6. * @param Array $extras (Ex: array('border' => 0))
  7. */
  8. function image($src,$alt='',$extras=null) {
  9. $img = '';
  10. if(is_string($src) && !empty($src)) {
  11.  $img = '<img src="'.$src.'" alt="'.$alt.'"';
  12.  if($extras != null && is_array($extras)) {
  13.   foreach ($extras as $name => $value) {
  14.    $img .= ' '.trim($name).'="'.trim($value).'"';
  15.   }
  16.  }
  17.  $img .= ' />';
  18. }
  19. return $img;
  20. }


 
J'ai fait le choix de faire un "$extras" qui permet rapidement d'ajouter ce qui est nécessaire, plutot que de vouloir compliquer le helper. Quelques exemples d'utilisation dans la vue :

Code :
  1. <?php echo image('images/test.png') ?>
  2. <?php echo image('images/test.png','My test image',array('border' => 0)) ?>


 
On peut ensuite faire des helpers plus spécifiques, qui viendront se servir de ce helper générique :

Code :
  1. /**
  2. * Application image HTML tag.
  3. * Images must be store into /view/images in your
  4. * application folder.
  5. *
  6. * @param String $src (Ex: 'image.png')
  7. * @param String $alt (Ex: 'My favorite image')
  8. * @param Array $extras (Ex: array('border' => 0))
  9. * @return String
  10. */
  11. function app_image($src,$alt='',$extras=null) {
  12. $img = '';
  13. if(is_string($src) && !empty($src)) {
  14.  $src =  Config::get('site_url')
  15.    .'/'.APPS_FOLDER.'/'
  16.    .APP_NAME.'/view/images/'.$src;
  17.  $img = image($src,$alt,$extras);
  18. }
  19. return $img;
  20. }


 
Celui-ci permet d'afficher une image se trouvant dans le dossier "view/images" de l'application par exemple.


Message édité par vanadium le 18-07-2007 à 13:16:30
n°1588194
AlphaZone
Posté le 18-07-2007 à 13:21:20  profilanswer
 

Merci pour les exemples :D


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
mood
Publicité
Posté le 18-07-2007 à 13:21:20  profilanswer
 

n°1588196
vanadium
N° Atomique : 23
Posté le 18-07-2007 à 13:33:15  profilanswer
 

Et pour utiliser les helpers, plutot que de tous les charger, c'est dans la vue qu'on charge les helpers au besoin avec une petite classe dédiée.  
 
Exemple de vue utilisant des helpers :

Code :
  1. <?php Helper::load(array('url','header')) ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  4. <head>
  5.  <title><?php echo $this->title ?></title>
  6.  <?php echo app_stylesheet('style.css') ?>
  7. </head>
  8. <body>
  9.                  ....
  10.         </body>
  11. </html>


 
On remarque le code suivant au debut de la vue :

Code :
  1. <?php Helper::load(array('url','header')) ?>


 
Les helpers sont regroupés par fichiers dans un dossier /helpers, et suivant leur fonction : url.php, header.php etc...
Helper::load se charge d'inclure le fichier php s'il n'a pas été déjà inclut en allant le chercher dans le dossier des helpers.
 
Les fonctions du helper 'header' par exemple chargées sont ensuite directement utilisable :

Code :
  1. <?php echo app_stylesheet('style.css') ?>


Ce helper app_stylesheet(...) permet d'afficher très simplement la balise  d'inclusion du css, en allant chercher le css à l'endroit qui va bien.
 
L'avantage, c'est qu'on ne charge un helper que si l'on en a besoin.


Message édité par vanadium le 18-07-2007 à 13:35:11
n°1588283
AlphaZone
Posté le 18-07-2007 à 15:25:17  profilanswer
 

C'est foutrement bien foutu! J'en apprend tous les jours ;)


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
n°1588298
FlorentG
Posté le 18-07-2007 à 15:44:03  profilanswer
 

Moi pour l'instant j'ai pas de helpers. J'en ai pas eu encore besoin. Dès que le problème se posera je m'y pencherais

n°1588324
Shinuza
This is unexecpected
Posté le 18-07-2007 à 16:21:31  profilanswer
 

skeye a écrit :


En lien avec l'affichage, alors.
Genre le controleur passe la langue à la vue, et les fonctions de celle-ci vont retourner des choses différentes en fonction de la valeur du paramètre.:o


'xactly  :o


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
n°1588495
vanadium
N° Atomique : 23
Posté le 18-07-2007 à 21:59:50  profilanswer
 

La langue je la gère très simplement grâce à une seul fonction. :)
Dans la vue, ça se présente comme ceci :

Code :
  1. <p><?php echo __('Hello world !') ?></p>


 
Le fichier de traduction : (en php, très simple)

Code :
  1. $GLOBAL['__l10n'] = array(
  2.      'Hello World !' => 'Bonjour le monde !',
  3.      ....
  4. );


 
La fonction __($string) permet d'en obtenir la traduction :

Code :
  1. /**
  2. * Translates a string if translation is available.
  3. *
  4. * @param String $toTranslate
  5. * @return String translated, string toTranslate  
  6. *    if no translation available
  7. */
  8. function __($toTranslate) {
  9. return l10n::i18n($toTranslate);
  10. }


 
La classe l10n possède donc une méthode statique i18n($toTranslate) qui charge les fichiers de langue à la première demande de traduction puis qui retourne la traduction de la chaine. (si aucune traduction n'est dispo, alors elle renvoie la chaine à traduire telle quelle)
 
Il s'agit d'une sorte de "super helper" puisque cette fonction est accessible depuis n'importe quelle partie du code (controlleur et vue). Le fait d'avoir une fonction très simple comme celle-ci permet d'eviter d'allourdir l'ecriture.
 
Un petit plus c'est aussi que les chaines à traduire soient des chaines deja lisibles (ici "Hello World !" ), plutot que des index de tableau peu clair ('hello_world') qui ne feraient à la longue que compliquer la compréhension.
 
Voila, je vous apporte un peu de ce que je fais habituellement, si ça peut aider quelqu'un ça sera toujours ça de gagné :)

Message cité 2 fois
Message édité par vanadium le 18-07-2007 à 22:00:45
n°1588502
Dj YeLL
$question = $to_be || !$to_be;
Posté le 18-07-2007 à 22:12:12  profilanswer
 

vanadium a écrit :

La langue je la gère très simplement grâce à une seul fonction. :)
Dans la vue, ça se présente comme ceci :

Code :
  1. <p><?php echo __('Hello world !') ?></p>


 
Le fichier de traduction : (en php, très simple)

Code :
  1. $GLOBAL['__l10n'] = array(
  2.      'Hello World !' => 'Bonjour le monde !',
  3.      ....
  4. );


 
La fonction __($string) permet d'en obtenir la traduction :

Code :
  1. /**
  2. * Translates a string if translation is available.
  3. *
  4. * @param String $toTranslate
  5. * @return String translated, string toTranslate  
  6. *    if no translation available
  7. */
  8. function __($toTranslate) {
  9. return l10n::i18n($toTranslate);
  10. }


 
La classe l10n possède donc une méthode statique i18n($toTranslate) qui charge les fichiers de langue à la première demande de traduction puis qui retourne la traduction de la chaine. (si aucune traduction n'est dispo, alors elle renvoie la chaine à traduire telle quelle)
 
Il s'agit d'une sorte de "super helper" puisque cette fonction est accessible depuis n'importe quelle partie du code (controlleur et vue). Le fait d'avoir une fonction très simple comme celle-ci permet d'eviter d'allourdir l'ecriture.
 
Un petit plus c'est aussi que les chaines à traduire soient des chaines deja lisibles (ici "Hello World !" ), plutot que des index de tableau peu clair ('hello_world') qui ne feraient à la longue que compliquer la compréhension.
 
Voila, je vous apporte un peu de ce que je fais habituellement, si ça peut aider quelqu'un ça sera toujours ça de gagné :)


 
 
Justement tiens, comme tu parles de ça, je me suis toujours demandé avec ce genre de fonction comment ça se passe pour traduire un long texte ?
 
Genre tout ce que je suis en train d'ecrire en ce moment sur ce post ... ?


---------------
Gamertag: CoteBlack YeLL
n°1588508
multani
Dépressionnisé
Posté le 18-07-2007 à 22:19:27  profilanswer
 

vanadium a écrit :

La langue je la gère très simplement grâce à une seul fonction. :)
Dans la vue, ça se présente comme ceci :

Code :
  1. <p><?php echo __('Hello world !') ?></p>


[...]


pourquoi ne pas utiliser gettext, qui fais déjà ça ? (surement en mieux en plus)

n°1588509
Dj YeLL
$question = $to_be || !$to_be;
Posté le 18-07-2007 à 22:22:16  profilanswer
 

multani a écrit :


pourquoi ne pas utiliser gettext, qui fais déjà ça ? (surement en mieux en plus)


 
En ce qui me concerne j'ai déjà essayé ... j'ai même cherché des tutos etc... jamais réussi :/ J'ai trouvé ça horrible à mettre en place :/


---------------
Gamertag: CoteBlack YeLL
n°1588510
multani
Dépressionnisé
Posté le 18-07-2007 à 22:25:02  profilanswer
 

C'est vrai que c'est un peu particulier à utiliser (faire les fichiers de trad., les compiler, initialiser l'environnement, toussa).

n°1588511
ratibus
Posté le 18-07-2007 à 22:29:45  profilanswer
 

multani a écrit :


pourquoi ne pas utiliser gettext, qui fais déjà ça ? (surement en mieux en plus)


+1 pour gettext

n°1588581
vanadium
N° Atomique : 23
Posté le 19-07-2007 à 08:53:21  profilanswer
 

Dj YeLL > Il n'y a aucun problème pour traduire des phrases longues :

Code :
  1. <?php
  2. echo __('Justement tiens, comme tu parles de ça, je me suis toujours demandé avec ce genre de fonction comment ça se passe pour traduire un long texte')
  3. ?>


Ca fonctionne très bien et le contraire m'aurait étonné puisque je me suis inspiré du framework Symfony :)
 
multani > J'ai également essayé getext, et si en pratique ça offre quelques plus, gettext est globalement moins performant et moins pratique à utiliser que de simples tableaux php sur de petites applications.
L'objectif pour moi c'est de choisir des solutions adaptées à la taille de mes projets, et ne pas sombrer dans "l'overkill" en optant pour des solutions comme gettext ou encore XLIFF. De toute façon, il ne faut pas oublier que si ces solutions proposent chacunes leur format d'écriture, au final, on construit un tableau php clef => valeur des textes à traduire et leur traduction.

Message cité 1 fois
Message édité par vanadium le 19-07-2007 à 08:54:54
n°1588587
ratibus
Posté le 19-07-2007 à 08:56:29  profilanswer
 

vanadium a écrit :


Ca fonctionne très bien et le contraire m'aurait étonné puisque je me suis inspiré du framework Symfony :)


Il me semblait en effet voir une ressemblance assez forte ;)
 
D'ailleurs pourquoi ne pas utiliser symfony ?

n°1588592
vanadium
N° Atomique : 23
Posté le 19-07-2007 à 09:07:13  profilanswer
 

J'utilise Symfony mais aussi mon propre framework, plus léger et plus adapté à certains de mes sites. Tout dépend du projet :)
J'aime apprendre en développement mes propres solutions : certes je réinvente la roue, mais le but est pédagogique et je suis un passionné de développement.
C'est un peu comme la conduite, j'aime conduire mais aussi comprendre comment mon véhicule fonctionne (sans aller jusqu'à en monter un moi-meme lol)


Message édité par vanadium le 19-07-2007 à 09:08:41
n°1588735
omega2
Posté le 19-07-2007 à 12:22:18  profilanswer
 

vanadium > Principal problème que je vois à ton système : a chaque fois que tu modifies une phrase de la langue principale, tu es obligé de modifier tous les fichiers de traductions.
Second problème : t'es coincé si tu te retrouves avec deux phrases identiques dans la langue principale mais que tu as besoin de les traduire différemment à cause du contexte ou pour de simple raison de conjuguaison ou de grammaire.
 
Par contre, c'est vrai qu'un "Your name is " est plus parlant qu'un "phrase_nom_1" ou qu'un nombre.

n°1588758
vanadium
N° Atomique : 23
Posté le 19-07-2007 à 13:19:31  profilanswer
 

Certes, si je modifie la phrase de la langue principale, je dois modifier les fichiers de traduction. Mais il est impossible de faire autrement. (ou alors tu me montre pke je suis curieux de voir comment tu arriverais à découpler ça :D)
Pour une phrase donnée il n'y a qu'une traduction possible :D. Mais ma gestion des fichiers de langue permet plusieurs définitions possible : chaque controleur a son propre fichier de langue. Il est ainsi aisé de mettre des définitions différentes pour chaque controleur.
De meme, l'application (qui est un ensemble de controleurs, modeles et vues) a un fichier de langue dont le controleur peut sans aucun problème surcharger les définitions.

n°1588962
omega2
Posté le 19-07-2007 à 17:10:28  profilanswer
 

vanadium > On peut l'éviter tout simplement en utilisant des clés numériques ou textuelle (genre le fameux "hello_world" ) à la place de la phrase finale. Ton système à ses avantages et ses inconvénients, l'autre système à les avantages et inconvénients inverse.

n°1589067
vanadium
N° Atomique : 23
Posté le 19-07-2007 à 22:15:27  profilanswer
 

Tu ne résoud absolument pas le problème : si tu changes ta clef, qu'elle soit numérique ou une phrase, il faut répercuter la modification partout.
Et il vaut mieux avoir des phrases parlantes plutot que des index, pour la relecture et la maintenabilité du code.  
Tu perdras plus de temps à essayer de retrouver la définition de tes clefs à chaque fois que tu voudras savoir ce qu'elle cache, que moi de faire en quelques secondes un rechercher+remplacer sous Eclipse :D

n°1589174
omega2
Posté le 20-07-2007 à 10:22:21  profilanswer
 

vanadium > Si tu fais un système de clé, c'est justement par ce qu'on a jamais besoin de changer leur nom quelque que soit la langue qu'on décide de modifier. Il faudrait être taré pour mettre en place un système de clé et décider tout à coup que la clé "hello_word" va désormais s'appeler "bonjour".

n°1589529
vanadium
N° Atomique : 23
Posté le 20-07-2007 à 17:01:23  profilanswer
 

omega2 a écrit :

vanadium > Principal problème que je vois à ton système : a chaque fois que tu modifies une phrase de la langue principale (la clé), tu es obligé de modifier tous les fichiers de traductions.


 

omega2 a écrit :

vanadium > Si tu fais un système de clé, c'est justement par ce qu'on a jamais besoin de changer leur nom quelque que soit la langue qu'on décide de modifier. Il faudrait être taré pour mettre en place un système de clé et décider tout à coup que la clé "hello_word" va désormais s'appeler "bonjour".


 
Deux raisonnements totalement contradictoires.  :jap:

Message cité 1 fois
Message édité par vanadium le 20-07-2007 à 17:02:05
n°1589530
Dj YeLL
$question = $to_be || !$to_be;
Posté le 20-07-2007 à 17:04:07  profilanswer
 

vanadium a écrit :


 
 :jap: Merci d'avoir montré par toi-même la contradiction dans ton raisonnement.


 
Nan mais toi pas comprendre
 
Si tu fais un truc du genre
 
$lng['hello'] = 'Bonjour à vous les gros cons !';
 
Et que 3 mois après t'as envie de changer pour  
 
'Bonjour à vous les amis !';
 
Bah tu changes ton fichier de langue.
 
Si tu as un truc du genre
 
$lng['Bonjour à vous les gros cons !'] = 'Bonjour à vous les gros cons !'
 
Ben le jour où tu veux changer c'est plus chiant déjà, il faut changer la clé + l'appel dans la vue, + le contenu de la variable....


---------------
Gamertag: CoteBlack YeLL
n°1589600
vanadium
N° Atomique : 23
Posté le 20-07-2007 à 20:16:21  profilanswer
 

CTRL + H tu connais pas ? :D
Je perd du temps une fois à faire la modif si nécessaire.
 
Dans ton cas, on perd à chaque fois du temps à comprendre quel traduction se cache derrière l'index en étant obligé d'aller dans le fichier de langue.
 
En fait, je me dis tout simplement : "Make the common case faster."
Accélérons les taches les plus courantes, quitte à ralentir celles qui sont executées le plus rarement.

n°1589701
FlorentG
Posté le 21-07-2007 à 13:36:15  profilanswer
 

vanadium a écrit :

En fait, je me dis tout simplement : "Make the common case faster."
Accélérons les taches les plus courantes, quitte à ralentir celles qui sont executées le plus rarement.


Principe essentiel :jap:

n°1589709
vanadium
N° Atomique : 23
Posté le 21-07-2007 à 15:21:22  profilanswer
 

Au fait florentG, ou en est ton framework perso ? J'aimerais bien tester ça ;)

n°1589711
FlorentG
Posté le 21-07-2007 à 16:29:51  profilanswer
 

Personne ne taiste, c'est closed-source :o
 
Sinon là je suis en plein interface d'admin pour des choses diverses et variées (catalogue, news, etc.). J'ai un max de trucs à implémenter, parce que là j'ai pas mal de choses redondantes...
 
Sinon la structure MVC est à peu-près figée, et fonctionne plutôt bien, c'est pas trop relou de développer avec. Car c'est une règle essentielle, ça sert à rien de développer un framework si on l'utilise pas (ou peu), la plupart des trucs que j'ai implémenté ont été implémentés après avoir rencontré des cas concrets.
 
 
Au niveau de la structure d'un controller, j'ai découpé en méthodes http. Genre je balance à la racine un fichier pouet.controller.php, et dedans je mets :

Code :
  1. class pouet extends MFW_Controller
  2. {
  3.  
  4.  public function get($machin, $truc)
  5.  {
  6.     // ...
  7.  }
  8.  
  9.  public function post()
  10.  {
  11.     // ...
  12.   }
  13. }


 
Si j'accède par l'url /pouet/valeur1/valeur2.html, je retrouve valeur1 dans $machin et valeur2 dans $truc. URL Rewriting pour zéro dollars. J'peux aussi déclarer un paramètre en optionnel, ou lui filer une valeur par défaut. Pour la méthode post(), elle est exécutée en cas d'http post. Embrace HTTP, do not avoid it. Je déteste les frameworks event-driven où t'as des trucs genre :

Code :
  1. function buttonBiduleClick() {
  2. }


Rien de pire que ça. En web, on clique pas un bouton : on POST des informations à une URL...
 
 
Sinon les controllers peuvent être regroupés en modules. Genre j'ai un module catalogue, avec un sous-dossier catalogue\controller, et dedans plein de controllers style liste, ajoutcat, ajoutprod, etc. On accède par catalogue/ajoutcat.html par exemple.
 
Les modules peuvent être hébergés au sein du framework, et être appellés dans le site. Pour ça dans le style je fait un :

Code :
  1. class produits extends module_catalogue {
  2. }


Et j'hérite automatiquement de toutes les fonctionnalités du module catalogue, comme s'il était dans le site.
 
 
Aussi, on peut mettre dans les controllers une méthode beforeRequest, j'ai pu voir qu'il y avait souvent des choses redondantes entre la méthode get et post. Elle sera donc systématiquement exécutée quelque soit la méthode HTTP.
 
 
La semaine prochaine, les view...
 
 
 

n°1589730
masklinn
í dag viðrar vel til loftárása
Posté le 21-07-2007 à 18:22:48  profilanswer
 

FlorentG a écrit :

Au niveau de la structure d'un controller, j'ai découpé en méthodes http. Genre je balance à la racine un fichier pouet.controller.php, et dedans je mets :


Comme dans web.py [:klem3i1]

FlorentG a écrit :

Si j'accède par l'url /pouet/valeur1/valeur2.html, je retrouve valeur1 dans $machin et valeur2 dans $truc.


Et si on appelle l'URL /pouet/valeur1/valeur2/valeur3 sur la même fonction ça nous pète à la gueule [:petrus dei]

 

Et si on se retrouve avec $machin = "valeur1" et $truc = "valeur2/valeur3", il y a moyen de demander à récupérer $machin = "valeur1/valeur2" et $truc = "valeur3"? Ou l'inverse? [:klem3i1]

FlorentG a écrit :

J'peux aussi déclarer un paramètre en optionnel, ou lui filer une valeur par défaut.


En PHP [:petrus dei]

 

D'un côté j'ai envie de voir ce que ça donne, de l'autre j'ai trai trai peur [:totoz]

FlorentG a écrit :

Pour la méthode post(), elle est exécutée en cas d'http post.


DELETE, PUT et HEAD sont gérés aussi, ou pas [:petrus dei]

 

Message cité 1 fois
Message édité par masklinn le 21-07-2007 à 18:23:13

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1589733
vanadium
N° Atomique : 23
Posté le 21-07-2007 à 18:51:51  profilanswer
 

J'ai également commencé mon propre framework MVC. Et je deteste également les framework par événement :D
 
Mon controller se présente de cette manière :

Code :
  1. class CategoryController extends Controller {
  2. /**
  3.  * Actions to perform before loading controller.
  4.  */
  5. public function preExecute() {
  6.  Load::model('category');
  7.  $this->categoryTable = $this->con->getTable('Category');
  8. }
  9. /**
  10.  * Default action
  11.  */
  12. public function index() {
  13.  $categories = $this->categoryTable->findAll();
  14.  if(is_object($categories)) {
  15.   $this->tpl->assign('categories',$categories);
  16.  }
  17.  $this->tpl->assign('template','category_index.php');
  18. }
  19. }


 
Les méthodes du controleur (index()...) sont des "action" pour moi.
Aucune méthode du controleur n'a besoin de paramètres. On remarque la méthode preExecute(), qui est executée juste avant l'action du controleur (ici index() par exemple). Il existe également une méthode postExecute().
 
Mais alors comme je récupère mes paramètres d'urls ? Grace à des règles de routage, spécifiques à chaque Application (une application est un ensemble de controleurs et vues) :

Code :
  1. $router->addRoute(
  2. 'default', new Route('([a-z|A-Z|0-9]*)/([a-z|A-Z|0-9]*)/?([0-9]*)?',
  3.     null,
  4.     array(1 => 'controller', 2 => 'action', 3 => 'id'),
  5.     '%s/%s/%s')
  6. );


 
La route ci-dessus définit les urls de type /controller/action/id.
Pourquoi des routes ? Tout simplement pour permettre d'avoir des urls totalement configurables (aussi bien en nombres de parametres, qu'en url rewrite). Par exemple, on pourra /category/21 ou animaux-21.html pour aller sur la meme page de la catégorie avec l'id 21.
 
On tape une url dans le navigateur. Elle arrive au Front Controller. Celui-ci demande au Routeur de parser l'url et, suivant les routes définies d'extraire les paramètres de la requête. une fois l'url parsée, le routeur  crée un objet HttpRequest en assignant les paramètres suivant la route qui correspond à l'url.
Le Front Controller va ensuite consulter la requete Http (HttpRequest) et essayer d'invoquer le controleur et l'action qui correspondent. bien sur les cas d'erreur divers possibles ont été traités. (controleur non trouvé, action non trouvée...
 
Dans le controleur invoqué, on a accès à diverses méthodes qui facilitent la vie :

Code :
  1. public function index() {
  2.   $this->httpRequest->getParameter('id',0); // retourne le paramètre soit extrait de l'url suivant une route, soit recupéré par formulaire (GET, POST etc...)
  3.   if($this->httpRequest->getMethod() == HttpRequest::POST) {
  4.     ... // Ici, j'ai simplement controlé que mon formulaire était en POST, et utilisé la meme méthode ci-dessus, sans me soucier de GET, POST etc...
  5.      if($this->httpRequest->hasParameter('id')) {
  6.         ... // Très simple de tester la présence ou non d'un parametre de formulaire; raccourci : $this->hasParameter('id')
  7.      }
  8.   }
  9.  
  10.   // Envie de lever une erreur 404 ? (utile pour désindexer des pages mais les afficher au visiteur)
  11.   // Les headers Http de la réponse enverront maintenant 404 not found
  12.   $this->httpResponse->setStatusCode(404); // 301, 301 etc...
  13.   // Besoin de rediriger vers une autre action ? exemple : ajout d'une categorie puis redirection
  14.   $this->forward('default',array('category','index')); // On forwarde en utilisant la route "default", et les paramètres de la route sont 'category' et 'index'
  15.    // NONE: J'ai envie de ne pas invoquer le moteur de templates, car par exemple j'affiche un flux RSS directement depuis le controller
  16.    return View::NONE; // HEAD : envoyer juste headers HTTP: utile pour les redirections; TPL : afficher le contenu en utilisant la vue
  17. }


 
Les exemples ci-dessus sont une petite partie de ce qu'il est possible de faire dans le controleur.
 
Voyons la vue qui affiche les catégories :

Code :
  1. <?php if (is_object($this->categories)): ?>
  2. <div id="categories">
  3.  <?php foreach ($this->categories as $category): ?>
  4.   <p>
  5.    <?php echo $category->id ?> - <?php echo $category->name ?>
  6.     -
  7.    <?php echo routed_link_to( 'Delete', 'default',
  8.           array('category','delete',$category->id),
  9.           array('onclick' => "if(confirm('".__('Really delete ?')."')) {return true;} else {return false;}" )) ?>
  10.     -
  11.    <?php echo routed_link_to( 'Edit','default',
  12.           array( 'category', 'edit', $category->id)) ?>
  13.   </p>
  14.  <?php endforeach; ?>
  15. </div>
  16. <?php endif; ?>


Elle affiche les catégories :

Citation :


1 - humour - editer - effacer
2 - divertissements - editer - effacer


 
On remarque le helper :

Code :
  1. <?php echo routed_link_to('Edit','default', array('category', 'edit', $category->id)) ?>


il permet de construire directement le lien d'après la route qu'on lui donne:  
- Edit : texte du lien (et il suffit de spécifier la traduction dans le fichier de langue, et c'est automatiquement traduit)
- 'default' : la route à utiliser
- array(...) : les paramètres de la route
 
Ainsi, le parsing et la reconstruction des urls se font via les routes : il suffit de modifier les routes pour que les urls changent dans toute l'application.
 
Pour le modèle, plutôt que d'utiliser un ORM (Object Relational Mapper) maison, j'ai préféré opter pour PHPDoctrine (http://www.phpdoctrine.net/trac/), un ORM extremement complet et facile à utiliser.
 

Code :
  1. class Category extends Doctrine_Record {
  2. public function setTableDefinition() {
  3.      $this->setTableName(Config::get('db_prefix').'_category');
  4.         $this->hasColumn('id', 'integer', 4, array('notnull' => true,
  5.                                                    'primary' => true,
  6.                                                    'autoincrement' => true));
  7.         $this->hasColumn('name', 'string', 80, array('notnull' => true));
  8.     }
  9.    
  10.    
  11.     public function setUp() {
  12.     }
  13. }


 
L'avantage de PHPDoctrine, c'est qu'il sait gérer moultes choses de lui meme, comme les jointures par exemple.
 
Voila, mon petit framework de tous les jours pour mes petits besoins. :)

n°1589734
masklinn
í dag viðrar vel til loftárása
Posté le 21-07-2007 à 18:57:40  profilanswer
 

Tu ne penses pas qu'il serait plus simple d'utiliser Rails? Non parce que là tout ce que je vois c'est une réimplémentation en PHP de Rails [:pingouino]
 
(pour la partie controller et les templates, en tout cas)


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1589735
vanadium
N° Atomique : 23
Posté le 21-07-2007 à 19:02:11  profilanswer
 

Pourquoi pas, je n'ais jamais touché à Ruby on Rails mais je m'y interresse depuis un moment. Le plus dur c'est de se lancer :D
 
Dans tous les cas, c'est pour le plaisir que je fais ça :)

n°1589779
FlorentG
Posté le 22-07-2007 à 01:10:28  profilanswer
 

masklinn a écrit :


Et si on appelle l'URL /pouet/valeur1/valeur2/valeur3 sur la même fonction ça nous pète à la gueule [:petrus dei]


Nanan, ça retourne valeur1 dans le premier, et valeur2/valeur3 dans le deuxième :)
 

masklinn a écrit :


Et si on se retrouve avec $machin = "valeur1" et $truc = "valeur2/valeur3", il y a moyen de demander à récupérer $machin = "valeur1/valeur2" et $truc = "valeur3"? Ou l'inverse? [:klem3i1]


J'en ai pas encore eu besoin, je le ferais le jour où le cas se présentera. YAGNI YAGNI YAGNI
 
Au pire, on peut toujours utiliser la méthode traditionnelle style pouet.html?valeur1=truc&valeur2=machin. On peut mixer les deux aussi : pouet/bidule.html?valeur2=truc. La valeur dans la query string prenant le pas sur celle extraite de l'url.
 
 


Oui oui ;)
 
Style :

Code :
  1. public function get($valeur1, $valeur2 = 'pouet')
  2. {
  3.     // ...
  4. }


 

masklinn a écrit :


DELETE, PUT et HEAD sont gérés aussi, ou pas [:petrus dei]


Normalement oui, toutes les méthodes HTTP peuvent être implémentées :)

n°1589780
masklinn
í dag viðrar vel til loftárása
Posté le 22-07-2007 à 01:18:47  profilanswer
 

FlorentG a écrit :

Au pire, on peut toujours utiliser la méthode traditionnelle style pouet.html?valeur1=truc&valeur2=machin. On peut mixer les deux aussi : pouet/bidule.html?valeur2=truc. La valeur dans la query string prenant le pas sur celle extraite de l'url.


[:vomi]

FlorentG a écrit :


Oui oui ;)
 
Style :

Code :
  1. public function get($valeur1, $valeur2 = 'pouet')
  2. {
  3.     // ...
  4. }



J'apprend des trucs là [:pingouino]
 
Et imaginons qu'on ait

Code :
  1. function foo($bar = "baz", $qux = "quux", $corge = "grault" ) { /* etc */}


il y a un moyen de ne fournir de valeur "pas par défaut" que pour $corge [:petrus dei]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  27  28  29  ..  62  63  64  65  66  67

Aller à :
Ajouter une réponse
 

Sujets relatifs
Comment créer une architecture propre et fonctionelle...[Débutant] Webdesigner a besoin d'aide pour PHP
script PHP style explorateur windowsPHP et MS SQL
[PHP] envoi d'images qui se dimentionne et s'ajoute direct sur 1pageAfficher le temps utilisé pour générer une page PHP
[PHP] connexion bdd différente selon page locale ou sur serveur ?Afficher une image générée par un script PHP dans un PDF ?
Utilisation d'une variable en Flash depuis PHPErreur de forum PHP
Plus de sujets relatifs à : Model View Controller (MVC) - Architecture des applications PHP


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)