I share so I am Contributions et réflexions

7jan/106

Détecter le contexte d’exécution sous Symfony

Lorsqu'on développe avec le framework Symfony, ou plus généralement en PHP, il est parfois nécessaire de connaitre le contexte dans lequel est exécuté le code pour adapter les actions effectuées. Ainsi, il est possible d'identifier au moins 4 contextes d'appel pour lesquels je vous propose une méthode de détection :

  1. Depuis la console (communément appelé CLI)
  2. Depuis une adresse locale (localhost)
  3. Depuis une requête AJAX (ou XMLHttpRequest JavaScript)
  4. En mode debug
  5. Contexte d'exécution

1. Détecter la console PHP

La fonction php_sapi_name retourne le type d'interface utilisée, par exemple "cli" ou "cgi". En analysant la valeur retournée par cette fonction vous pouvez donc facilement détecter une exécution dans la console PHP. Dans Symfony, ce sont les tâches qui sont généralement exécutées par cette interface.

if(php_sapi_name() == 'cli')
{
  // Code exécuté uniquement lorsque le script est appelé en ligne de commande (cli).
}

2. Détecter une adresse locale

Symfony fait déjà cette détection par défaut dans le fichier app_dev.php pour empêcher l'exécution de l'application en mode debug depuis d'extérieur. Les adresses 127.0.0.1 et ::1 sont les adresses IP v4 et v6 normalisées de rebouclage sur la machine locale, la condition ci-dessous vérifie que la requête est transmise depuis l'une de ces deux adresses.

if (in_array($this->getRequest()->getRemoteAddress(), array('127.0.0.1', '::1')))
{
  // Code exécuté uniquement lorsque l'application est exécutée depuis une adresse locale.
}

3. Détecter requête AJAX

Parmi les fonctionnalités magiques de Symfony, vous pouvez appelé la fonction sfWebRequest::isXmlHttpRequest() depuis vos sfAction(s). Vous saurez alors si la page a été appelée depuis JavaScript.

if($this->getRequest()->isXmlHttpRequest())
{
  // Code exécuté uniquement lorsque l'action est appelée depuis JavaScript
}

4. Détecter le mode debug

Lorsque votre application est exécutée en mode debug, la constante sf_debug prend la valeur true. Il vous est donc facile de n'afficher certaines informations que pour le développement et le débogage de votre application.

if(sfConfig::get('sf_debug'))
{
  // Code exécuté uniquement lorsque l'application est exécutée en mode debug
}

(Ajouté le 04/02/2010)

5. Contexte d'exécution

Pour éviter l'erreur « The "default" context does not exist. » lorsqu'on utilise i18n ou doctrine dans les models/widgets par exemple.

if(sfContext::hasInstance())
{
  $contexte = sfContext::getInstance();
  // Code exécuté uniquement lorsque l'application est exécutée avec un contexte (depuis une application).
}
Commentaires (6) Trackbacks (0)
  1. Dans le même genre, il y a la détection d’exécution sur telle ou telle machine :

    if (php_uname('n') == 'web2')
    {
      // code exécuté uniquement le serveur nommé web2
    }
  2. Merci Benjamin, mais saisir le nom d’une machine directement dans le code rend l’application moins portable. Ton contexte d’exécution est donc à utiliser avec prudence.

    La fonction php_uname est effectivement riche en informations sur la machine hôte.

  3. dans ce cas un :

    if (php_uname('n') == sfConfig::get('sf_master_hostname', 'master'))
    {
    }

    c’était pour l’exemple

  4. Pour detecter REMOTE_ADDR, je prense qu’il vaut mieux utiliser:
    $this->getRequest()->getRemoteAddress();

  5. Merci Saad, cette syntaxe est effectivement plus sûre. J’ai modifié mon article en conséquence.

  6. Exactement ce qu’il me fallait! merci.


Laisser un commentaire


Aucun trackbacks pour l'instant