Liens inter-applications avec Symfony 1.2

10 novembre 2008 par Olivier Mansour

Aprè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 :

  1. Par NiKo le 11 novembre 2008 | Répondre

    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 ?

  2. Par Olivier Mansour le 11 novembre 2008 | Répondre

    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 ?

  3. Par NiKo le 12 novembre 2008 | Répondre

    > 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 ;)

  4. Par NiKo le 12 novembre 2008 | Répondre

    (mince, raoul.org existe, et il fait du cul :$)

  5. Par Olivier Mansour le 13 novembre 2008 | Répondre

    hu hu, va falloir utiliser autre chose que raoul comme nom de variable ! c’est une demi décennie d’habitudes à revoir. 8-)

  6. Par aimxhaisse le 20 novembre 2008 | Répondre

    Tres pratique comme helper =) Merci beaucoup !

  7. Par Morpheus le 12 août 2009 | Répondre

    Bonjour,
    je suis nouveau sous symfony!
    Ma question va vous paraître bizarre mais ou dois-je mettre cette fonction afin qu’elle soit prise en compte par toute une application (enfin que le sois possible depuis le template général de mon appli)
    merci.

  8. Par Olivier Mansour le 13 août 2009 | Répondre

    @Morpheus, je te conseille plutôt d’utiliser ce plugin : http://www.glagla.org/weblog/2008/12/02/omcrossappurlplugin-est-disponible-sur-le-repository-de-symfony/

Commentaires

RSS des commentaires pour ce post