Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 16-08-2007 18:16:00

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

[Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

Bonjour à tous
Après 2 mois, je reviens à la charge sur le RewriteRouter. En effet, mis à part l'usage du routage par défaut [Pour lequel il n'y a rien à faire], je n'arrive à bien comprendre comment on l'utilise efficacement.

En effet, l'utilisation dans le frontController de la méthode setControllerDirectory comme expliqué ici, http://framework.zend.com/manual/fr/zen … dular.html , semble me donner un plein contrôle de ma structure de répertoire. Donc je crois faire ce que je veux, sans utiliser le rewrite. Ce qui est dommage.

Je n'arrive pas à comprendre le lien physique réel entre une structure de répertoires données et des règles de reroutage telles que pratiquées dans Zend.

Inutile de me renvoyer vers la DOC, dans n'importe quelle langue je l'ai lu et relu et vu, tenter d'implanter les exemples, ça ne m'aide pas, je perds mon temps. Sauf un tutoriel miracle expliquant cela, mais beaucoup de tutoriel se contente de recopier l'aide en ligne.

Comme je suis idiot, quelqu'un aurait-il l'amabilité de me faire un petit schéma donnant pour une structure de répertoire donnée les règles de routage à implanter.

Actuellement j'ai l'implantation suivante :

<Racine-application>
    <applications>
            <controllers>
            <models>
            <views>
            <app1>
                 <controllers>
                 <models>
                  <views>

Dans le bootsrap [index.php] j'ai :
.....
$frontController->setControllerDirectory(array('default' => './applications/controllers',
                                                                     'app1' => './applications/app1/controllers'));
$router = new Zend_Controller_Router_Rewrite();
.......
Pour le nommage des méthodes des contrôleurs app1 et des redirections , je respecte les règles données dans le lien ci-après : http://framework.zend.com/manual/fr/zen … dular.html

Maintenant je veux implanter l'exemple suivant dans la racine (avec du reroutage dynamique :username étant une variable), donc je modifie index.php [le bootstrap] en ajoutant les lignes ci-dessous  (extrait de
http://framework.zend.com/manual/fr/zen … outer.html  § 7-5-2 ):

$router->addRoute(
    'routeUser',
    new Zend_Controller_Router_Route('user/:username', array('controller' => 'user', 'action' => 'info'))
);

Quelqu'un serait-il assez aimable de me dire comment je dois modifier ma structure ci-dessous, pour faire apparaître le répertoire du user <toto> en respect de la règle de routage ci-devant et est-ce-que je dois aussi en parallèle donner les nouveaux répertoires . :

<Racine-application>
    <applications>
            <controllers>
            <models>
            <views>
            <app1>
                 <controllers>
                 <models>
                  <views>

C'est sans doute simple, mais pour moi ce serait d'une grande aide .

Merci d'avance à tous.

Marcel

Hors ligne

 

#2 17-08-2007 01:17:14

Grummfy
Membre
Lieu: Belgique
Date d'inscription: 01-08-2007
Messages: 232
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

je voix pas pk tu veux un répertoire toto,
d'après ce que j'ai compris
si on fait user/toto
cela fait la même chose que default/user/info/username/toto ou que user/info/username/tata (puisque default qu'il apparaissent ou pas cela ne change rien) en motif standart

donc il te faut un controller user =>
Racine-application/applications/controllers/User.php

si tu veux utiliser le module app1 tu dois faire ceci :

$router->addRoute(
    'routeUser',
    new Zend_Controller_Router_Route('user/:username', array('controller' => 'user', 'action' => 'info', 'module' => 'app1'))
);


Engagez-moi! : Cherche job en Belgique autour de Namur (1 heure de route autour)
blog - ZF Planet

Hors ligne

 

#3 17-08-2007 04:58:45

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

Grummfy a écrit:

je voix pas pk tu veux un répertoire toto,
d'après ce que j'ai compris
si on fait user/toto
cela fait la même chose que default/user/info/username/toto ou que user/info/username/tata (puisque default qu'il apparaissent ou pas cela ne change rien) en motif standart

donc il te faut un controller user =>
Racine-application/applications/controllers/User.php

si tu veux utiliser le module app1 tu dois faire ceci :

$router->addRoute(
    'routeUser',
    new Zend_Controller_Router_Route('user/:username', array('controller' => 'user', 'action' => 'info', 'module' => 'app1'))
);

Merci pour ta réponse Grummfy car ce problème me torture.  A moins que je ne comprenne encore rien, il me semble que le chemin que tu donnes est incomplet au vu de la route que tu indiques. Pour fonder ma critique je t'explique ce que j'ai fait et en final je reviens sur ta proposition en expliquant, selon moi, le pourquoi du chemin. J'essaie d'être précis en évitant les erreurs de syntaxe, donc tu me corriges si c'est faux.

Il y a certainement plusieurs approches et mon interrogation est confuse. Dans mon esprit et dans ma question initiale  les cas Toto et <app1> sont distincts.

Pour être très précis, j'ai fait un CRUD complet avec ACL et librairies externes (template, formulaire..)  etc ...  et ça marche parfaitement. Ce CRUD je l'ai développé sous <applications> pas de problème. Et je l'ai remis sous <app1> avec les adaptations nécessaires comme indiqué ci-dessous, pas de problème non plus, ça marche.

En ce qui concerne <app1> je l'utilise avec le routage par défaut , je donne son répertoire (dans le bootstrap)  avec la méthode $frontController->setControllerDirectory ('app1' => './applications/app1/controllers'). comme indiqué dans mon premier POST, et je préfixe les méthodes du contrôleur <app1> avec "App1_ " et , j'adapte les chemins de redirection. Pour tester dans <app1> j'ai remis exactement le même CRUD que précédemment et ça marche c'est OK (Je te rassure tout de suite, je contrôle bien quel CRUD s'exécute, directement sous <applications> ou <applications><app1>). Donc tout en conservant le routage par défaut, en me contentant de donner les chemins/répertoires d'installation + le Préfixage des méthodes, je décline tous les modules que je veux avec le routage par défaut. D'où ma frustration, je ne fais rien avec le routage.

En ce qui concerne Toto qui serait un user particulier, dans ta réponse tu me proposes de le traiter dans un module qui s'appellerait <app1>. Soit., je réfléchis en écrivant....

Moi je réponds en oubliant <app1> dans un premier temps, en conservant le routage par défaut, dans l'URL le motif /user/info/username/toto qui obéit au modèle [/contrôleur/action/var1/val1] se décline directement sous <applications> en mettant dans le répertoire controllers le fichier UserController.php qui contient la classe UserController comme extension de Zend_Controller_Action. Cette classe possède la méthode infoAction()  qui récupère la valeur de 'username' avec $this->_request->getParam('username',...) et ça marche.... sans modifier le routage par défaut.

Maintenant ta réponse, on va utiliser  le module <app1> pour traiter le cas des USERS donc je reprends ton conseil :

$router->addRoute(
    'routeUser',
    new Zend_Controller_Router_Route('user/:username', array('controller' => 'user', 'action' => 'info', 'module' => 'app1'))

Je te signale tout de suite au vu de ce que tu dis avant je te cite :

Grummfy a écrit:

donc il te faut un controller user =>
Racine-application/applications/controllers/User.php

Ce motif d'URL, n'obéit pas à la route que tu donnes. En fait elle obéit à ce que j'explique avant  : Racine-application/applications/controllers/UserController.php et le routage par défaut marche  Il est inutile d'ajouter la route que tu indiques, ça ne sert à rien de faire état du module <app1>, car vu le chemin que tu donnes au contrôleur, il me semble que c'est contradictoire, <app1> n'est pas concerné.

J'oublie ton motif d'URL et je me contente de ta proposition de route. Voilà l'analyse que je ferais de ta réponse, car elle m'aide beaucoup et me fait réfléchir. Tu me dis si je trompe, je traduis ta proposition de "route" de la manière suivante :
1 - l'URL est http://localhost/Racine-application/app1/user/toto/info
2 - <app1> conserve en terme de répertoire la position que je lui ai donné initialement,
3 - le fichier userController.php est mis dans le répertoire /app1/controllers/
4 - ce fichier contient la classe UserController comme extension de Zend_Controller_Action.
5 - Cette classe possède la méthode infoAction() 
5 - Cette méthode récupère la valeur de 'username' avec $this->_request->getParam('username',...)
6 - et après ça devrait rouler tout seul

Je vais essayer et je reviens ... Si ça marche c'est que tu m'auras fait comprendre et je vais pouvoir finir le TUTO que je j'ai fait sur le CRUD en utilisant, enfin, le routage.

Pour la petite histoire, je connais l'url_rewriting d'apache, mais l'approche ZEND qui mêle "rewriting et "route" (chemin en français) a créé une véritable confusion dans mon esprit. Par ailleurs les multiples possibilités de faire une même chose sont pour moi "very confusing" comme on dit en anglais.

Merci encore, A plus tard

Marcel

Dernière modification par mbariou (17-08-2007 05:26:44)

Hors ligne

 

#4 17-08-2007 07:38:35

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

J'ai donc fait les essais . J'ai créé un répertoire <app2>. J'ai la structure suivante :

<Racine-application>
    <applications>
            <controllers>
            <models>
            <views>
            <app1>
                 <controllers>
                 <models>
                  <views>
            <app2>
                 <controllers>
                 <models>
                  <views>

Dans le bootsrap je précise le nouveau motif URL :

$newRoute= new Zend_Controller_Router_Route('app2/:username', array('controller'=>user, 'action'=> 'info', 'module' => 'app2'));
$router->addRoute('app2', $newRoute);

Dans ./app2/controllers je crée le fichier UserController.php avec la class de même nom et la méthode infoAction () qui fait un print "Je suis dans App2"; J'ai préparé view en conséquence...

si je fais http://localhost/Racine-application/app2
Il me dit "Invalid Controller Specified (app2) "

Si je rajoute le chemin de répertoire :
$frontController->setControllerDirectory(array('default' => './applications/controllers',
                                                                     'app1' => './applications/app1/controllers',
                                                                    'app2' => './applications/app2/controllers'));

si je fais http://localhost/Racine-application/app2
Il me dit "Invalid Controller Specified (index) "
Comme s'il allait chercher le contrôleur par défaut

Les histoires de route reste un mystère pour moi, à l'exception de la route par défaut qui est la seule que je réussisse à faire marcher.
Où est mon erreur ?

Hors ligne

 

#5 17-08-2007 08:14:24

B.Moncef
Nouveau membre
Lieu: Fes, Maroc
Date d'inscription: 17-08-2007
Messages: 5
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

Fais pointer ton navigateur vers http://localhost/Racine-application/app2/user/.

Si tu as toujours une erreur, c'est que je n'ai pas compris ton problème désolé.

Sinon, le problème vient du fait que tu n'as pas un fichier app2/controllers/IndexController avec une action index, ce qui explique ton message d'erreur (enfin a mon sens).
Vu que l'adresse que tu as tape va utiliser par défaut le controller index, et que celui ci n'existe pas, ça te renvoi "Invalid Controller Specified"

Hors ligne

 

#6 17-08-2007 09:10:08

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

B.Moncef a écrit:

Fais pointer ton navigateur vers http://localhost/Racine-application/app2/user/.

Si tu as toujours une erreur, c'est que je n'ai pas compris ton problème désolé.

Sinon, le problème vient du fait que tu n'as pas un fichier app2/controllers/IndexController avec une action index, ce qui explique ton message d'erreur (enfin a mon sens).
Vu que l'adresse que tu as tape va utiliser par défaut le controller index, et que celui ci n'existe pas, ça te renvoi "Invalid Controller Specified"

Merci pour tes conseils. J'ai le sentiment de ne jamais sortir du rewrite par défaut. Car j'ai l'impression qu'il ne reconnait que ça. Et ton conseil me le confime, si je maintiens l'indication du répertoire du contrôleur
l'URL http://localhost/Racine-application/app2/user/. me renvoie le message d'erreur qu'il attend une classe contrôleur App2_UserController. Il ne tient pas compte du AddRoute et fonctionne en route par défaut avec simple déplacement de répertoire.

Si j'enlève l'indication de répertoire, et que j'applique ton URL, il me dit "Invalid Controller specified (app2)" car il est toujours dans son trip de la route par défaut et il cherche dans ../racine-application/applications/controllers le fichier contrôleur App2Controller.php qui n'y ait pas bien entendu car je veux que <app2> soit un module indépendant avec ses propres règles de ré-écriture d'URL ce qui me semble impossible.

Par ailleur en matière de contrôleur par défaut je n'ai pas mis "index" mais "user" et l'action par défaut c'est 'info' et tout cela est présent dans UserController.php dans le répertoire ../Racine-application/application/app2 /controllers. Il me semblerait que mon addRoute ne s'applique pas.

Merci encore, mais si tu as d'autres idées...

Hors ligne

 

#7 17-08-2007 11:08:47

dinoxyz
Membre
Date d'inscription: 31-03-2007
Messages: 70

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

bonjour,
si tu penses vraiment que c'est un problème de htaccess alors tu as cettte solution qui te permettra de tester ton code mais pas de le mettre en production,

Code:

Zend_Controller_Front::run('../application/app1/controllers');

ne me demande pas la solution miracle à ton problème, je ne l'ai pas trouvé et j'ai abandonné le modèle MVC du Zend, j'ai repris mon ancien maison et j'utilise les librairies de ZendFramework mais si tu trouves une solution qui fonctionne je veux bien m'y remettre.

@++, Dinoxyz


Système : Ubuntu (Linux)
Version : PHP 5.2.1
Mode debug actif

Hors ligne

 

#8 17-08-2007 11:24:37

B.Moncef
Nouveau membre
Lieu: Fes, Maroc
Date d'inscription: 17-08-2007
Messages: 5
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

Une autre idee : ne serait pas au niveau de l'architecture de tes dossiers que ca foire ? (http://framework.zend.com/manual/fr/zen … controller)

essai ceci :

<Racine-application>
    <applications>
            <default>
                 <controllers>
                 <models>
                 <views>
            <app1>
                 <controllers>
                 <models>
                 <views>
            <app2>
                <controllers>
                <models>
                 <views>


Essai egalement :

Code:

$newRoute= new Zend_Controller_Router_Route('user/:username', array('controller'=>user, 'action'=> 'info', 'module' => 'app2'));
$router->addRoute('user', $newRoute);

A part cela je ne vois pas, essai de voir si quelque chose t'as echappe ici > http://framework.zend.com/manual/fr/zen … outer.html

Hors ligne

 

#9 17-08-2007 11:36:33

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

Pour Dinoxyz,

A mon avis, le modèle MVC marche bien, il est possible de l'associer d'autres librairies d'autres templates pas de soucis.. La seule que je constate est que le Cadriciel Zend ne reconnaisse que la route par défaut. J'ai un CRUD complet qui marche très bien. On peut se contenter de la route par défaut, mais c'est dommage.

Il m'est difficile d'incriminer le .htaccess, il donne les règles de rewrite pour Apache, or le rewrite_router de Zend est au-dessus. Donc soit je ne comprend pas qqchose, ce qui est probable, soit il ne marche pas ce qui est peu probable.

Néanmoins je réfléchis à ta suggestion.

Merci

Hors ligne

 

#10 17-08-2007 11:54:49

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

B.Moncef a écrit:

Nouvelle Structure et code + Lien de lecture

Code:

$newRoute= new Zend_Controller_Router_Route('user/:username', array('controller'=>user, 'action'=> 'info', 'module' => 'app2'));
$router->addRoute('user', $newRoute);

Merci J'ai tout essayé cela, mais le problème demeure toujours sur le rewrite. En ce qui concerne les lectures je suis abreuvé, j'ai lu et relu et tester certains exemples pas tous. Bien que l'ayant essayé comme tu le suggères, la structure avec <default> qui ne marche pas mieux, je veux m'en affranchir. Mais le pb reste le même et la route j'ai essayé.

Mais ne perdons pas espoir. :-)

Merci

Hors ligne

 

#11 17-08-2007 12:21:27

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

mbariou a écrit:

Mais ne perdons pas espoir. :-)
Merci

J'ai peut-être une piste, par défaut un routeur est mis en place par le cadriciel. Lorsque l'on ajoute une nouvelle  route, on crée un nouveau routeur, qui reprend les caractéristiques du routeur par défaut. On y ajoute d'autres routes etc...
Or tant que l'on n'a pas dit d'utiliser ce nouveau routeur qui doit surcharge le routeur par défaut, on reste sur le routeur par défaut.

Il faut dire au cadriciel de l'utiliser, ce nouveau routeur,  en faisant => $controller->setRouter($router);

Je ne le faisais pas, j'essaie et je vous tiens au courant.

Merci

Hors ligne

 

#12 17-08-2007 13:09:44

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

C'étair bien ça, il faut faire

$votreObjetController->setRouter($router);

Vous remarquerez comme moi que c'est absent de leur page de doc :

http://framework.zend.com/manual/fr/zen … outer.html

Il va falloir leur signaler, car je crains ne pas être le seul à passer à côté..

Par contre il faut préfixer la classe UserController => App2_UserController

Enfin pour récupérer les paramètres dans la méthode infoAction()

$params=$this->getParams();
le print_r($params) donne =>
Array(['username'] => 'toto' [controller]=>'user' [action] => info [module] => app2) 
c.a.d le paramétrage de la route

Dans le bootstrap j'avais mis :

$frontController->setControllerDirectory(array('default' => './applications/controllers',
                                                                     'app1' => './applications/app1/controllers',
                                                                     'app2' => './applications/app2/controllers'));

$newRoute= new Zend_Controller_Router_Route('app2/:username', array('controller'=>user, 'action'=> 'info', 'module' => 'app2'));
$router->addRoute('app2', $newRoute);
$frontController->setRouter($router);

Je vous remercie tous de m'avoir aidé à sortir de ce pétrin. Je finis le tutoriel du CRUD dans les 48 heures et je vous passe le lien. (cf. www.brasnah.com => Documents => Tutoriels  (ils sont incomplets))

Merci encore à tous et j'espère que je pourrai en aider d'autres comme vous l'avez fait en m'accompagnant sur cette terrible affaire.

Dernière modification par mbariou (17-08-2007 13:43:15)

Hors ligne

 

#13 17-08-2007 13:24:19

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

Surprenant. Normalement, on récupère $router via $frontController->getRouter() et donc tu as la meme instance du routeur que le front, si tu ajoute une route, le front en bénéficie forcement. Je ne comprend pas pourquoi faire un $frontController->setRouter($router) peut changer quelque chose puisque tu remplaces une instance par la meme instance.

Hors ligne

 

#14 17-08-2007 13:42:39

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

TiTerm a écrit:

Surprenant. Normalement, on récupère $router via $frontController->getRouter() et donc tu as la meme instance du routeur que le front, si tu ajoute une route, le front en bénéficie forcement. Je ne comprend pas pourquoi faire un $frontController->setRouter($router) peut changer quelque chose puisque tu remplaces une instance par la meme instance.

Tu as sans doute raison, en ce qui me concerne je récupère le routeur initial par :
$router=Zend_Controller_Front::getInstance();
Et ensuite je déroule ce que j'ai écrit précédemment.

On peut aussi penser, à vérifier il faut voir le code, que si on crée le $frontController avant le routeur, il prend  à l'initialisation comme routeur, la valeur du routeur par défaut. Ensuite si on crée un autre routeur que l'on manipule, ajout de nouvelles routes etc..., celui-ci ne sera pas actif dans le $frontController, tant qu'on ne lui pas dit de le prendre en compte . Ce qui explique la nécessite du $fontController->setRouteur($routeur).

Par contre si chronologiquement on crée un $routeur et ensuite le $frontController, il se peut que le $frontController ne prenne pas la valeur par défaut du routeur, mais l'objet $routeur que tu as créé préalablement, ça doit être vérifiable dans le code. Tout ça ne sont qu'hypothèses de ma part. Il faut analyser le code du Cadriciel.

Merci

Dernière modification par mbariou (17-08-2007 14:15:46)

Hors ligne

 

#15 17-08-2007 14:54:56

dinoxyz
Membre
Date d'inscription: 31-03-2007
Messages: 70

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

J'ai testé et ça marche même en version module grâce à ceci je donne mon code au cas où :

Code:

$front = Zend_Controller_Front::getInstance();
$router = new Zend_Controller_Router_Rewrite();
$front->addModuleDirectory('../application/modules');
$front>setRouter($router)
$front->trowExecptions(true);
$front->dispatch();

Merci, à vous pour tout ça, je vais réintégrer mes pages dans mon MVC Zend big_smile

Dernière modification par dinoxyz (17-08-2007 16:31:48)


Système : Ubuntu (Linux)
Version : PHP 5.2.1
Mode debug actif

Hors ligne

 

#16 17-08-2007 15:57:49

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

Zend_Controller_Front::getInstance() retourne le front controller, en aucun cas une instance de routeur.

Dernière modification par TiTerm (17-08-2007 16:02:37)

Hors ligne

 

#17 17-08-2007 16:31:32

dinoxyz
Membre
Date d'inscription: 31-03-2007
Messages: 70

Re: [Zend_Controller][1.0.1]Rewrite_Router et setControl Directory Lien ?

TiTerm a écrit:

Zend_Controller_Front::getInstance() retourne le front controller, en aucun cas une instance de routeur.

Je suis d'accord avec toi, on instancie le singleton mais la documentation resté très flou pour ajouter des routes du moment ou on voulait utiliser le controller par défaut + d'autres controlleurs là avec ceci on a au moins un bout de code qui est est clair et qui fonctionne proprement.

Le Zend_Controller_Router_Rewrite(); permet de s'abstenir d'écrire les routes dans la condition d'utiliser les standards.

@++, Dinoxyz


Système : Ubuntu (Linux)
Version : PHP 5.2.1
Mode debug actif

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages