Liens inter-applications avec Symfony 1.2
10 novembre 2008 par Olivier MansourAprès une première tentative peu concluante, voici un autre helper permettant de faire des liens entre différentes applications dans Symfony 1.2.
<?php /** * @author Olivier Mansour */ /** * return an url for a given symfony application and an internal url * * @author Olivier Mansour * * @param string $appname * @param string $url * @param boolean $absolute * @param string $env * @param boolean $debug * @return string */ function cross_app_url_for($appname, $url, $absolute = 'false', $env = null, $debug = 'false') { $initial_app = sfContext::getInstance()->getConfiguration()->getApplication(); $initial_web_controler = basename(sfContext::getInstance()->getRequest()->getScriptName()); // get the environment if (is_null($env)) { $env = sfContext::getInstance()->getConfiguration()->getEnvironment(); } // context creation if (!sfContext::hasInstance($appname)) { $context = sfContext::createInstance(ProjectConfiguration::getApplicationConfiguration($appname, $env, $debug), $appname); } else { $context = sfContext::getInstance($appname); } $web_url = $context->getController()->genUrl($url, $absolute); sfContext::switchTo($initial_app); // usefull ? unset($context); //remove initial web controler // genUrl use $this->context->getRequest()->getScriptName();, its a call to $_SERVER // so I need this (sort of) hack $script_name = $appname; if (($env != 'prod') and $env) { $script_name.='_'.$env; } $script_name.='.php'; // check if this file exist if (!file_exists(sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.$script_name)) throw new sfException('can t find '.$script_name.' in the web directory'); $web_url = str_replace ($initial_web_controler, $script_name, $web_url); return $web_url; }
Pour l’utiliser, c’est à peu près comme url_for :
<?php echo cross_app_url_for('front' , 'module/action?id=5&tmp=ok#raoul'); ?> <?php echo cross_app_url_for('front' , '@route'); ?>
Jusqu’ici ça marche (Symfony 1.2 est en cours de développement, l’API peut encore un peu changer, attention) ! N’hésitez pas à mettre un commentaire si vous avez un retour.
Pour soutenir ce site, n'hésitez pas à cliquer sur un de ces liens :










En fait je te conseillerai plutôt de ne développer que des plugins, avec des modules de back ou de front que tu n’actives alors que pour tes applications, si tu en as plusieurs. Ça permet notamment une meilleure réutilisation éventuelle de code.
En effet, tu peux définir des routes au niveau d’un plugin qui seront donc connues de toutes les applications symfony pour lesquels le plugin a été activé. Chouette, non ?
Cette solution est vraiment bien et ouvre pas mal de possibilités, toutefois, cela force à réfléchir au routing au niveau du projet, je trouvais confortable de laisser chaque équipe libre de ses routes par projet. De plus, c’est difficile de changer un applicatif existant non ?
> je trouvais confortable de laisser chaque équipe libre de ses routes par projet.
Avec un peu d’organisation et l’emploi de conventions, ça devrait pouvoir se faire… Dans un « futur pas si lointain» il sera vraisemblablement possible de gérer des familles de routes « connectables» à une racine, genre toutes les routes du blog vont derrière http://raoul.org/blog et le forums sous http://raoul.org/forum
Mais je t’ai rien dit ;)
> De plus, c’est difficile de changer un applicatif existant non ?
C’est une bonne scéance de refactoring, certes ;)
(mince, raoul.org existe, et il fait du cul :$)
hu hu, va falloir utiliser autre chose que raoul comme nom de variable ! c’est une demi décennie d’habitudes à revoir. 8-)
Tres pratique comme helper =) Merci beaucoup !