Symfony
Liens & routing
Principe du routage
• URL standard dévoile l’appli (piratage)• URL standard incompréhensible (référencement)
– les développeurs devront faire correspondre la structure de l'URL avec la structure des fichiers.
• Le routage est un mécanisme qui réécrit les URL pour les rendre plus compréhensibles
• url rewriting => mod_rewrite poru apache– url indépendante de la structure de fichier
• Book mark des pages dynamiques
URL et URI
• Par défaut dans symfony– <module>/<action>?param1=value1...
• Le routage symfony pourra faire correspondre– articles/finance/2006/activity-
breakdown.html – article/permalink?
year=2006&subject=finance&title=activity-breakdown
Config/routing.yml
• http://www.example.com/articles/finance/2006/activity-breakdown.html
• Le système de routage crée– 'module' => 'article' – 'action' => 'permalink' – 'subject' => 'finance' – 'year' => '2006' – 'title' => 'activity-breakdown'
article_by_title: url: articles/:subject/:year/:title.html param: { module: article, action: permalink }
Écriture des liens
• Mécanisme réversible– Le nombre de paramètres doit
correspondre– Pas d’hyperlien directement dans des
balises <a>– Utilisation des helpers
url_for
• transforme les URI internes en URL externes<a href="<?php echo url_for('article/permalink?
subject=finance&year=2006&title=activity-breakdown') ?>">click here
</a>
– Le helper trouve une correspondance avec la règle `article_by`
– Le système de routage crée l'URL externe correspondante
<a href="http://www.example.com/articles/finance/2006/activity-breakdown.html">click here
</a>
link_to
• affiche directement un hyperlien • permet d'éviter le mélange de php et html<?php
echo link_to( 'click here', 'article/permalink?subject=finance&year=2006&title=activity-breakdown' )
?>
• `link_to()` appelle `url_for() en interne<a href="http://www.example.com/articles/finance/2006/activity-breakdown.html">
click here</a>
• Le système de routage ne fonctionne qu’avec l’utilisation de link_to() ou url_for()
Liens hypertextes, boutons et formulaires
• Hyperlien dans une image <?php echo link_to(image_tag('read.gif'), article/read?title=Finance_in_France') ?>
<a href="/routed/url/to/Finance_in_France"><img src="/images/read.gif" /></a>
• Balise bouton <?php echo button_to('my article', 'article/read?title=Finance_in_France') ?>
<input value="my article" type="button"
onclick="document.location.href='/routed/url/to/Finance_in_France';" />
• Balise formulaire <?php echo form_tag('article/read?title=Finance_in_France') ?>
<form method="post" action="/routed/url/to/Finance_in_France" />
Transformer une requête GET en POST
• Intérêt– Non enregistrable en favoris– Non indexé par les moteurs de recherche
<?php echo link_to('go to shopping cart', 'shoppingCart/add?id=100', 'post=true') ?>
<a onclick="f = document.createElement('form'); document.body.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit();return false;" href="/shoppingCart/add/id/100.html">go to shopping cart</a>
• L’action associée ne doit répondre qu’à la méthode POST$this->forward404If($request->getMethod() != sfRequest::POST)
Forcer l’adressage absolu
<?php echo url_for('article/read?title=Finance_in_France') ?>
'/routed/url/to/Finance_in_France‘
<?php echo url_for('article/read?title=Finance_in_France', array(
‘absolute’ => true
) ?>
'http://www.example.com/routed/url/to/Finance_in_France'
Les options du helper lien
<?php echo link_to('my article', 'article/read?title=Finance_in_France', array(
'class' => 'foobar', 'target' => '_blank','confirm' => 'Are you sure?','popup' => array(
'Window title','width=310,height=400,left=320,top=0‘
) )
) ?>
Image_tag
<?php echo image_tag('test') ?> <img href="/images/test.png" alt="Test" />
<?php echo image_tag('test.gif') ?> <img href="/images/test.gif" alt="Test" />
<?php echo image_tag('/my_images/test.gif') ?> <img href="/my_images/test.gif" alt="Test" /> .
<?php echo image_tag('test', array("width"=>"100", "height" => "20" )
) ?><img href="/images/test.png" alt="Test" width="100" height="20"/>
url rewriting
• Le nom du contrôleur principal (index.php or myapp_dev.php) n'apparait jamais dans les URI internes
• Faire apparaître le nom du controleur dans l’URL
http://www.example.com/index.php/articles/finance/2006/activity-breakdown.html
• Désactiver par défaut dans tous les environnements sauf prod– Possible pour une seule application
prod: .settings no_script_name: off
Routage par défaut
myapp/config/routing.yml
homepage: url: / param: { module: default, action: index } default_symfony: url: /symfony/:action/* param: { module: default } default_index: url: /:module param: { action: index } default: url: /:module/:action/*
Règles de routage
• Bijection entre URL externe et URI interne
• En 3 parties– Un titre: utilisé par les helpers de liens– Un motif: mot clé url– Un tableau de variable HTTP: mot clé param
• Parcours séquentiel des règles jusqu’à ce qu’une « match »
Nouvelle règle de routage
• par défautarticle/read?id=123 /article/read/id/123
• La règlearticle_by_id: url: /article/:id param: { module: article, action: read }
• Réécrit enarticle/read?id=123 /article/123
contraintes
• Restriction d’une règle au type d’une variable
article_by_id: url: /article/:id param: { module: article, action: read }
requirements: { id: \d+ } • Id doit être un nombre• NB il est préférable de masquer les clés
primaires (stripped_name cf TP)
Valeur par défaut
article_by_id:
url: /article/:id
param: { module: article, action: read, id: 1 }
• Affiche l’article ayant pour clé primaire 1 si l’id n’est pas spécifié
Convention de nommage
• peut être appelée par module/action<?php echo link_to('my article', 'article/read?id='.$article->getId()) ?>
• peut être appelée par son nom (recommandé)
<?php echo link_to('my article', '@article_by_id?id='.$article->getId()) ?>
• Plus rapide : routing.yml n’a pas à être parcouru
Suffixe .html
• Particulièrement pertinent pour les moteurs de recherche
myapp/config/settings.yml myapp/config/routing.yml
prod: .settings suffix: .html
article_list: url: /latest_articles param: { module: article, action: list }
article_list_feed: url: /latest_articles.rss param: { module: article, action: list, type: feed }
Gérer le routage sans routing.yml
sfRouting::getInstance()->prependRoute('article_by_id', // Route name'/article/:id', // Route pattern array(
'module' => 'article', 'action' => 'read‘
), array('id' => '\d+')
);
Information sur l’URI courante
// http://myapp.example.com/article/21 action $uri = sfRouting::getInstance()->getCurrentInternalUri(); article/read?id=21 $uri = sfRouting::getInstance()->getCurrentInternalUri(true); @article_by_id?id=21 $rule = sfRouting::getInstance()->getCurrentRouteName(); article_by_id
Rappel$module = $this->getRequestParameter('module'); $action = $this->getRequestParameter('action');
Transformer une URI interne en URL externe
$uri = 'article/read?id=21'; $url = $this->getController()->genUrl($uri);
/article/21
$url = $this->getController()->genUrl($uri, true); http://myapp.example.com/article/21
Top Related