[Symfony] routage symfony

Eléphant du PHP | 199 Messages

25 févr. 2010, 19:05

Bonjour depuis ce matin je me prends la tête avec le routage de Symfony.
Bon, je fais du routage en utilisant doctrine.

En gros j'ai une liste de news et quand je clique sur le texte de la news ca affiche la new.
Ca marche en temps normal sauf quand je fais du routage avec Symfony.

Voici le fichier php affichant les news
<!--appel du css -->
<?php use_stylesheet ('actus.css')?>

<div id='actus'>
	
	<h1>Toutes les actualités</h1>

	<table>
  	<tbody>
   	 <?php foreach ($news_list as $news): ?>
    	<tr>
      	<td class='actu_titre'>
				<a href="<?php echo url_for (array('sf_route' => 'actualite_show_user', 'sf_subject' => $news)) ?>">
      			<?php echo $news->getNTitre() ?>
      		</a>
      	</td>
      	<td class='actu_date'><?php echo $news->getNDate() ?></td>
    	</tr>
    	<tr>
    		<td class='actu_contenu'><?php echo $news->getNContenu() ?></td>
    	</tr>
	 	<tr>    
      	<td class='actu_auteur'><?php echo $news->getNAuteur() ?></td>
    	</tr> 
 
    	<?php endforeach; ?>
  	</tbody>
	</table>
</div>

 <!-- <a href="<?php echo url_for('Actualite/new') ?>">New</a>-->
Voici mon fichier de routage en YAML.

Code : Tout sélectionner

url: / param: { module: Actualite, action: index } default_index: url: /:module param: { action: index } default: url: /:module/:action/* actualite_show_user: url: /Actualite/:titre_slug/:auteur_slug class: sfDoctrineRoute options: { model: news, type: object } param: { module: Actualite, action: show } requirements: id: \d+ sf_method: [get]id
Merci d'avance pour votre aide.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 févr. 2010, 01:07

Encore et toujours, il manque des messages d'erreur, des comportements. Parce qu'un simple "ça ne marche pas", ça n'aide en RIEN.

Bon, sinon, concernant l'utilisation de url_for(), j'avoue que je ne l'ai jamais vu utilisé comme ça (avec un array), je l'ai toujours utilisé comme suit :
url_for('@route_name', array('param1' => 'value1));
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 1024 Messages

27 févr. 2010, 14:05

on n'est pas censés mettre les routes génériques en fin de fichier de routing ?

il est possible que la route soit reconnue par défaut, avant un routing précis.

A+

Pascal

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 févr. 2010, 15:51

on n'est pas censés mettre les routes génériques en fin de fichier de routing ?

il est possible que la route soit reconnue par défaut, avant un routing précis.

A+

Pascal
Bien vu ! C'est probable.

Mais, de toutes façons, il faudrait en savoir plus sur le comportement pour le confirmer.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 199 Messages

04 mars 2010, 12:17

Je suis désolé de ne pas avoir mis toutes les informations.
Je vais le faire maintenant.

Donc quand je clique sur lien ne marchant pas ca m'affiche une page d'erreur:

Code : Tout sélectionner

404 | Not Found | sfError404Exception Action "Actualite/6emenew" does not exist. stack trace * at () in SF_SYMFONY_LIB_DIR/controller/sfController.class.php line 202 ... 199. $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Action "%s/%s" does not exist', $moduleName, $actionName)))); 200. } 201. 202. throw new sfError404Exception(sprintf('Action "%s/%s" does not exist.', $moduleName, $actionName)); 203. } 204. 205. // create an instance of the action ......
:(

Merci d'avance

P.S: J'ai mis les routes en défauts en dernier hélas ca fait toujours l'erreur.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 mars 2010, 13:23

Il nous faudrait l'url complète que tu essayes.
De plus, le message d'erreur que tu nous montres me laisse penser qu'il a utilisé la route "url: /:module/:action/*" (regarde le module/action qu'il essaye d'utiliser).

Après avoir passé les routes en dessus, est-ce que tu as bien fait un "./symfony cache:clear" ?
Sinon, pour comprendre ce qu'il se passe, il faudrait que tu regardes dans les log (répertoire /log). Petite astuce, supprime tout les fichiers, affiche la page qui plante et tu auras un seul fichier de log, qui commenceras par les routes qu'il a connecté (vérifie déjà que tout marche bien à ce niveau), puis la route que symfony à voulu utilisé pour parser ton url.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 199 Messages

04 mars 2010, 14:53

Merci Zeus pour ces réponses.

Le soucis c'est que si il fait appel à "/:module/:action/*" il appel la route par defaut. Pourquoi il appelle pas ma route Actualite_show_user?
Si je la commente ca m'affiche cette erreur:

Code : Tout sélectionner

500 | Internal Server Error | sfConfigurationException Unable to find a matching route to generate url for params "array ( 'action' => 'new', 'module' => 'Actualite',)". stack trace * at () in SF_SYMFONY_LIB_DIR/routing/sfPatternRouting.class.php line 401 ... 398. // find a matching route 399. if (false === $route = $this->getRouteThatMatchesParameters($params, $this->options['context'])) 400. { 401. throw new sfConfigurationException(sprintf('Unable to find a matching route to generate url for params "%s".', is_object($params) ? 'Object('.get_class($params).')' : str_replace("\n", '', var_export($params, true)))); 402. } 403. } 404. * at sfPatternRouting->generate('', array('action' => 'new', 'module' => 'Actualite'), ) in SF_SYMFONY_LIB_DIR/controller/sfWebController.class.php line 74 ... 71. } 72. 73. // routing to generate path 74. $url = $this->context->getRouting()->generate($route, $parameters, $absolute); 75. 76. if ($fragment) 77. { * at sfWebController->genUrl('Actualite/new', ) in SF_SYMFONY_LIB_DIR/helper/UrlHelper.php line 88 ... 85. 86. function url_for1($internal_uri, $absolute = false) 87. { 88. return sfContext::getInstance()->getController()->genUrl($internal_uri, $absolute); 89. } 90. 91. /** * at url_for1('Actualite/new') in n/a line n/a ... * at call_user_func_array('url_for1', array('Actualite/new')) in SF_SYMFONY_LIB_DIR/helper/UrlHelper.php line 115 ... 112. $arguments = func_get_args(); 113. if (is_array($arguments[0]) || '@' == substr($arguments[0], 0, 1) || false !== strpos($arguments[0], '/')) 114. { 115. return call_user_func_array('url_for1', $arguments); 116. } 117. else 118. { * at url_for('Actualite/new') in SF_ROOT_DIR/apps/frontend/modules/Actualite/templates/indexSuccess.php line 31 ...
Pour le fichier log j'ai fait comme tu m'as dit. Il m'affiche qu'il a parcouru la route par défaut:

Code : Tout sélectionner

Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite" (/actualite.:sf_format) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_new" (/actualite/new.:sf_format) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_create" (/actualite.:sf_format) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_edit" (/actualite/:id/edit.:sf_format) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_update" (/actualite/:id.:sf_format) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_delete" (/actualite/:id.:sf_format) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_show" (/actualite/:id.:sf_format) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_show_user" (/Actualite/:titre_slug) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfRoute "homepage" (/) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfRoute "default_index" (/:module) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Connect sfRoute "default" (/:module/:action/*) Mar 04 12:55:53 symfony [info] {sfPatternRouting} Match route "homepage" (/) for / with parameters array ( 'module' => 'Actualite', 'action' => 'index',) Mar 04 12:55:53 symfony [info] {sfFilterChain} Executing filter "sfRenderingFilter" Mar 04 12:55:53 symfony [info] {sfFilterChain} Executing filter "sfCommonFilter" Mar 04 12:55:53 symfony [info] {sfFilterChain} Executing filter "sfExecutionFilter" Mar 04 12:55:53 symfony [info] {ActualiteActions} Call "ActualiteActions->executeIndex()" Mar 04 12:55:53 symfony [info] {sfDoctrineLogger} executeQuery : SELECT n.id AS n__id, n.n_titre AS n__n_titre, n.n_date AS n__n_date, n.n_auteur AS n__n_auteur, n.n_contenu AS n__n_contenu, n.n_id AS n__n_id, n.created_at AS n__created_at, n.updated_at AS n__updated_at FROM news n ORDER BY n.id DESC LIMIT 5 Mar 04 12:55:53 symfony [info] {sfPHPView} Render "/home/sfprojects/luxe/apps/frontend/modules/Actualite/templates/indexSuccess.php" Mar 04 12:55:53 symfony [info] {sfPHPView} Decorate content with "/home/sfprojects/luxe/apps/frontend/templates/layout.php" Mar 04 12:55:53 symfony [info] {sfPHPView} Render "/home/sfprojects/luxe/apps/frontend/templates/layout.php" Mar 04 12:55:53 symfony [info] {main} Get slot "title" Mar 04 12:55:53 symfony [info] {sfWebResponse} Send status "HTTP/1.1 200 OK" Mar 04 12:55:53 symfony [info] {sfWebResponse} Send header "Content-Type: text/html; charset=utf-8" Mar 04 12:55:53 symfony [info] {sfWebDebugLogger} Configuration 13.82 ms (10) Mar 04 12:55:53 symfony [info] {sfWebDebugLogger} Action "Actualite/index" 40.69 ms (1) Mar 04 12:55:53 symfony [info] {sfWebDebugLogger} Database (Doctrine) 0.00 ms (1) Mar 04 12:55:53 symfony [info] {sfWebDebugLogger} View "Success" for "Actualite/index" 16.84 ms (1) Mar 04 12:55:53 symfony [info] {sfWebResponse} Send content (32048 o) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite" (/actualite.:sf_format) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_new" (/actualite/new.:sf_format) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_create" (/actualite.:sf_format) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_edit" (/actualite/:id/edit.:sf_format) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_update" (/actualite/:id.:sf_format) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_delete" (/actualite/:id.:sf_format) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_show" (/actualite/:id.:sf_format) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "actualite_show_user" (/Actualite/:titre_slug) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfRoute "homepage" (/) Mar 04 12:55:54 symfony [info] {sfPatternRouting} Connect sfRoute "default_index" (/:module)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 mars 2010, 15:40

Il y a une ligne de code qui est très intéressante :

Code : Tout sélectionner

Mar 04 12:55:53 symfony [info] {sfPatternRouting} Match route "homepage" (/) for / with parameters array ( 'module' => 'Actualite', 'action' => 'index',)
En 2 mots, cela signifie qu'il a utilisé la route "homepage", qui correspond à l'url qu'il a parsé, et cette url est "/".
En plus clair, ce qui me parait intéressant, c'est que l'url que Symfony essaye de matcher n'est pas une url complète, mais un truc du genre "http://[]/frontend_dev.php"
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 199 Messages

04 mars 2010, 18:07

Merci oui j'ai remarqué ca.
Avant c'est mon routage qui ne fonctionne pas.
Car la seule route qui marche est la homepage.
Le reste me pose des soucis :(

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 mars 2010, 18:35

Ce que je voulais te dire, c'est que la route qui arrive à PHP est "/", pas ta route " /Actualite/bidule/machin".
Si, dans le log, tu vois "/" et pas autre chose, c'est que Symfony ne connait pas autre chose.

Tu n'aurais pas modifié ton .htaccess par hasard ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 199 Messages

04 mars 2010, 18:43

Non pour le routage j'ai juste touché à routing.yml

Eléphant du PHP | 199 Messages

05 mars 2010, 16:49

J'ai peur d'avoir fait une bêtise car maintenant j'ai une erreur comme celle la:

Code : Tout sélectionner

Not Found The requested URL /Actualite/6eme+newarf was not found on this server.
Et non plus une levée d'exception.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

08 mars 2010, 00:17

Je suis à deux doigts de te demander de me transmettre ton application, que j'essaye chez moi ...
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 6 Messages

26 mars 2010, 12:26

bonjour a tous j'ai pratiquement le même problème,

Code : Tout sélectionner

404 | Not Found | sfError404Exception Action "general/action" does not exist.


j'ai cette URL

Code : Tout sélectionner

http://localhost/monprojet/web/frontend_dev.php/general/showInfos/action?id_hardware=2
au lieu de celle ci qui marche trés bien pour exécuter mon action

Code : Tout sélectionner

http://localhost/monprojet/web/frontend_dev.php/general/2/showInfos
dois je modifier mon routing.yml? il est par defaut pour le moment
j'ai juste rajouter dans generator.yml une nouvelle action

Code : Tout sélectionner

object_actions: _edit: { label: Editer } showInfos: { label: Infos , action: showInfos }
ainsi que mon actions dans actions.class.php

Code : Tout sélectionner

public function executeShowInfos (sfWebRequest $request) { $this->hardware = $this->getRoute()->getObject(); $this->setTemplate('showInfos'); }
merci pour votre aide

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 mars 2010, 12:34

Modération :
rs232, si tu as une autre question ouvre un nouveau sujet,
cela te permettra d'avoir plus de réponses.

En plus, tu pourras mettre [Résolu] dès que ton problème évoqué ici sera réglé.

Merci de prendre le temps de lire les règlements.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer