Astuce symfony : générer du cache depuis une task

7 avril 2010 par Olivier Mansour

Dans une tache symfony, il est tout à fait possible de créer un contexte comme si l’on venait d’un appel http.

$configuration = ProjectConfiguration::getApplicationConfiguration($options['application'], $options['env'], false);
$sf_context = sfContext::createInstance($configuration, 'raoul');
sfContext::switchTo('raoul');

Ceci fait, on pourrait imaginer appeler la fonction get_component présente dans PartialHelper.php histoire de générer le cache pour certains composants.

// charge le helper
$configuration->loadHelpers('Partial');
get_component($moduleName, $componentName, $vars); // si le composant utilise du cache, le fichier de cache sera crée

Le probleme est que tous les appels à link_to ou image_tag vont générer des liens invalides. (avec des symfony/symfony dans les urls)

La solution que j’ai trouvée en regardant du coté de sfBrowserBase.class.php consiste à setter le tableau $_SERVER pour simuler complètement la navigation web. Il faut donc insérer les lignes suivantes avant la création du contexte :

unset($_SERVER['argv']);
unset($_SERVER['argc']);
$_SERVER['HTTP_HOST']       = $arguments['host'];
$_SERVER['SCRIPT_NAME']     = $arguments['script_name'];
$_SERVER['SERVER_NAME']     = $_SERVER['HTTP_HOST'];
$_SERVER['SERVER_PORT']     = 80;
$_SERVER['REQUEST_METHOD']  = 'GET';

Bien sur, il faut que votre task prenne host (par exemple ‘localhost’ pour vos test) et script_name (par exemple ‘/monalias/frontend.php’) en arguments.

Cela semble fonctionner dans mon cas. N’hésitez pas si vous avez des retours ou des remarques.

  1. Par Thomas R. le 8 avril 2010 | Répondre

    Pour éviter ce hack avec la variable $_SERVER, dans le fichier settings.yml il faut mettre no_script_name: true et dans le fichier factories.yml il faut rajouter un request: {relative_url_root:  »}

    et hop plus de /symfony/symfony dans les urls ;)

  2. Par Olivier Mansour le 8 avril 2010 | Répondre

    merci Thomas. Dans mon cas par contre ce n’est pas possible car je ne connais pas le host et script_name à l’avance. Les taches sont lancées en asynchrone suite à une action utilisateur. Je collecte ces infos à ce moment là.

  1. 3 Trackback(s)

  2. avr 8, 2010: Tweets that mention Glagla Dot Org » Le blog sans prétentions d'Olivier Mansour » Astuce symfony : générer du cache depuis une task -- Topsy.com

Commentaires

RSS des commentaires pour ce post