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 :
- Depuis la console (communément appelé CLI)
- Depuis une adresse locale (localhost)
- Depuis une requête AJAX (ou XMLHttpRequest JavaScript)
- En mode debug
- 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).
}
Aucun trackbacks pour l'instant

8 janvier 2010 - 10:54
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 }8 janvier 2010 - 11:37
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.
8 janvier 2010 - 12:22
dans ce cas un :
if (php_uname('n') == sfConfig::get('sf_master_hostname', 'master')) { }c’était pour l’exemple
9 mars 2010 - 02:05
Pour detecter REMOTE_ADDR, je prense qu’il vaut mieux utiliser:
$this->getRequest()->getRemoteAddress();
29 mars 2010 - 05:39
Merci Saad, cette syntaxe est effectivement plus sûre. J’ai modifié mon article en conséquence.
28 mai 2010 - 15:26
Exactement ce qu’il me fallait! merci.