Bonsoir / Bonjour tout le monde !

Je me suis spécialement inscrit sur développez pour partager mon problème avec vous. (je suis un visiteur régulier, mais je n'avais jamais eu le besoin de créer un compte ! )

Je pose un peu le contexte de mon développement:
- j'utilise Zend Framework 2 dans sa dernière version (j'ai attaqué sa découverte ce soir)
- j'ai un serveur Varnish en front
- j'utilise des tag ESI afin de gérer finement mon cache
- j'ai un soucis avec ces derniers ... (cela aurait été trop beau sans ce dernier point)

Pas de soucis pour varnish et le fonctionnement des tags ESI, ils sont OK. Les pages sont correctement incluses et l'affichage est OK.

Le soucis vient plus du traitement réalisé par Zend (et de mon code, très certainement).

Par exemple pour la page de login, ma politique de cache est la suivante: je cache toute la page, et dans cette page cachée, j'ai une balise ESI qui inclue la page /esiLogin, qui elle contient mon formulaire html généré (avec CSRF, d'où l'importance de na pas la cacher).

Voici, rapidement, le code:

Routing:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
'router' => array(
  'routes' => array(
    'login' => array(
      /*  */
      'route'    => '/login',
    ),
    'esiLogin' => array(
       /* */
       'route'    => '/esiLogin',
    )
  )
);

login.phtml. Page rendue lors de l'accès à l'url /login: (j'ai mis l'url en dur, afin de simplifier pour le moment)
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
/* */
<esi:include src="http://piteur.lxc/esiLogin" />
/* */


Et la page de rendu résultant de l'inclusion ESI, correspondant à l'url /esiLogin:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
$form = $this->form;
$form->setAttribute('action', $this->url('login'));
$form->prepare();
 
echo $this->form()->openTag($form);
echo $this->formRow($form->get('csrf'));
/* ... */

J'ai tronqué le code, l'idée étant là.


Le soucis étant que lorsque que je soumet le formulaire de connexion avec des informations bidons, aucune erreur n'est remontée au template inclus par le tag ESI (la requête POST étant interceptée par l'url '/login' et non par '/esiLogin').
Précision: si je me rend directement sur la page /esiLogin & que je soumet un formulaire bidon, les erreurs s'affichent correctement.

Comment résoudre ce problème ? Est-il possible en configurant correctement Zend et/ou Varnish de faire descendre l'information au controller inclus par le tag ?
Sachant que le controller de la page /login, qui reçoit les données POST, n'est pas concerné car il n'est même pas appelé (page cachée).


Je me doute que le soucis ne concerne pas exclusivement en PHP, mais j'avoue être un peu perdu ... sachant que ma politique de cache est idéale (plusieurs tags ESI cachés, ou non, contenus dans une page entièrement cachée).


Et deuxième soucis, qui lui concerne plus surement Zend Framework:
J'ai mis en place une gestion très basique des droits utilisateurs en surchargeant le controller par défaut, et en vérifiant dans la fonction "onDispatch" les droits actuels et leur exactitude vis-à-vis de la page demandée.

Ce système fonctionne parfaitement lorsque je n'utilise pas de tag ESI (affiche d'une vue d'erreur "accès non autorisé" grosso modo).
Je fais simplement un redirect dans le controller:

Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
if ('pas accès à la page') {
  return $this->redirect()->toRoute($currentRoute['redirect']);
}

J'ai rapidement été conscient que cela n'est pas possible dans un contexte d'inclusion de page. De ce fait, je suis parti sur l'idée d'inclure le template d'erreur à la place de celui demandé.
Je remplace donc mon redirect par un forward

Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
if ('pas accès à la page') {
  return $this->forward()->dispatch('Gameserver\Controller\Index', array('action' => 'index'));
}

Ce qui me claque une magnifique boucle de redirection (sans que je puisse l'expliquer) :

Zend\Mvc\Exception\DomainException
File:
/var/www/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/Plugin/Forward.php:130
Message:
Circular forwarding detected: greater than 10 nested forwards
Merci d'avance de m'éclairer sur ces quelques points encore obscur pour moi ...


Cordialement,
Pierre