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

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.

Publicités

3 réflexions au sujet de « Astuce symfony : générer du cache depuis une task »

  1. Ping : 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

  2. Thomas R.

    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 😉

    Répondre
  3. Olivier Mansour

    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à.

    Répondre

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s