2010-06-13 7 views
1

c'est mon premier article ici :)Quelle est la bonne façon d'utiliser les URL de Cakephp?

J'ai des difficultés à gérer les URL et les paramètres. J'ai parcouru la documentation api de classe de routeur encore et encore et n'ai trouvé rien d'utile. Tout d'abord, j'aimerais savoir s'il y a un format 'universel' dans CakePHP (1.3) pour gérer les URLs. Je gère actuellement toutes mes urls sous la forme de tableaux simples (au format que Router :: url et $ html-> link acceptent) et c'est facile tant que je n'ai besoin que de les passer en arguments des propres méthodes de cake. Cela devient généralement difficile si j'ai besoin d'autre chose. Principalement, j'ai des problèmes avec la conversion d'URL de chaînes au format de tableau de base. Disons que je veux convertir arrayUrl de $ à chaîne et à nouveau dans url:

$arrayUrl=array('controller'=>'SomeController','action'=>'someAction','someValue'); 
$url=Router::url($arrayUrl);  //$url is now '/path/to/site/someController/someAction/someValue' 
$url=Router::normalize($url);  //remove '/path/to/site' 
$parsed=Router::parse($url);  /*$parsed is now 
Array(
    [controller] => someController 
    [action] => someAction 
    [named] => Array() 
    [pass] => Array([0] => someValue) 
    [plugin] => 
) */ 

Cela semble énormément de code pour faire quelque chose d'aussi simple que de convertir entre 2 formats de base. Notez également que $ parsed n'est toujours pas identique à $ arrayUrl. Bien sûr, je pourrais ajuster $ $ manuellement et en fait j'ai fait ça quelques fois pour un correctif rapide mais j'aimerais aller au fond des choses. J'ai également remarqué que lors de l'utilisation de routage de préfixe, $ this-> params dans le contrôleur a le préfixe intégré dans l'action (ie [action] => 'admin_edit') et le résultat de Router :: parse() n'est pas . Les deux ont bien sûr le préfixe dans sa propre clé. Pour résumer, comment puis-je convertir un URL entre l'un de ces 3 (ou 4, si vous incluez le préfixe chose) les formats mentionnés dans le bon sens? Bien sûr, il serait facile de me frayer un chemin à travers cela, mais j'aimerais quand même croire que le gâteau est développé par un groupe de personnes qui ont beaucoup plus d'expérience et de perspicacité que moi, donc je suppose qu'il y a un bonne raison pour cette "mauvaise conduite perçue".

J'ai essayé de présenter mon problème aussi bien que possible, mais en raison de mes compétences rouillées en anglais, j'ai dû faire quelques détours :) Je vais expliquer plus si nécessaire.

Répondre

2

Le format "officiel" pour les URLs Cake doit être la notation array('controller' => 'foo', 'action' => 'bar', 'baz', 'admin' => true). Chaque fois que vous écrivez des URL, vous devez utiliser ce format. La classe Router convertira ces chaînes en chaînes (/admin/foo/bar/baz) ou en informations requises pour Dispatcher (array('named' => array(), 'pass' => array(), …)), selon l'emplacement de l'URL.

Vous devriez penser à l'action du contrôleur que vous voulez appeler. Les URL (en tant que chaînes) sont seulement un mal nécessaire pour accomplir ceci dans un contexte Web. Vous ne devriez pas avoir besoin d'utiliser le format Dispatcher. Vous ne devez pas non plus utiliser la notation de chaîne lorsque vous spécifiez des URL, car celles-ci ne peuvent pas être routées de manière inversée si vous souhaitez modifier votre schéma d'URL.

Peut-être pourriez-vous expliquer par un exemple pourquoi vous avez besoin de convertir ces trois formes de l'une à l'autre?

+0

Merci pour la réponse rapide. J'ai demandé cela parce que pas une fonction de gâteau sigle que je connais retourne ce format (tableau). En l'absence d'un exemple réel, utilisons $ controller-> referer(). Le résultat de referer() est string, que j'ai besoin de convertir en tableau pour le modifier. Le seul moyen que je connaisse est Router :: parse(), qui retourne les paramètres du répartiteur. Si je voulais comparer le résultat à une URL de tableau, je devrais aussi convertir l'URL du tableau en paramètres du répartiteur, ce qui est fait via Router :: parse (Router :: normalize (Router :: url ($ arrayUrl))). Pas bon. – jpeltoniemi

+0

@Pichan Le référent est un cas intéressant en ce sens que c'est à la fois quelque chose que vous voudrez peut-être analyser, mais en même temps quelque chose que vous ne devriez pas faire attention à la première place. Puisque vous êtes vraiment en manque d'exemple, il semble que mon conseil soit valable. :) – deceze

+0

Disons que je dois enregistrer l'URL actuelle dans la session, donc quand une certaine tâche est terminée, le visiteur est ramené à la page d'où provient la tâche. Jusqu'à présent, j'utilisais $ this-> params, ce qui n'est pas la même chose que les URL de tableau, donc peu de bricolage est nécessaire pour les rendre sympas. Je veux juste éviter d'avoir à coder en dur les URL qui sont déjà disponibles pour le contrôleur dans un certain format. Je commence à penser que Cake ne travaillera pas avec moi sur celui-ci, mais est-ce seulement Cake ou est-ce que ma pensée est défectueuse? Après tout, je suis plutôt vert à toute la chose MVC donc ce ne serait pas une surprise :) – jpeltoniemi

Questions connexes