Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Salut ! Je reviens vers vous
Je suis face à un problème de routing, qui est identifié. Je vous explique :
J'essaye de créer une appli pour paramétrer certaines choses, genre créer mes entités de base etc. Et il faut pouvoir agir sur les différents environnements qui sont actuellement Dev et Recette.
La première idée avait été de créer dans chaque route un paramètre "environnement" de cette manière là
'autonomie' => [ 'type' => 'segment', 'options' => [ 'route' => '/autonomie[/:environnement][/:action][/:id]', 'constraints' => [ 'environomment' => '[a-zA-Z][a-zA-Z0-9_-]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9a-z]+', ], 'defaults' => [ 'controller' => 'autonomie/controller', 'environment' => 'dev' ], ], ],
Ça a bien fonctionné mais il faut le spécifier dans chaque route, et envoyer le paramètre dans tous les liens et donc l'utilisé dans tout les controllers et toutes les vues.
La deuxième idée a donc été de le mettre en paramètre de la route principale et ne plus avoir à y toucher derrière mais là encore il faut quand même l'envoyer tout le temps. Je pense que Zend reconstruit à chaque fois toutes les routes donc il bloque sur ce paramètre environnement si il n'est pas récupérable quelque part. Mais dans ce cas je n'arrive pas à le récupérer tout le temps..
Et je me retrouve à court d'idée sur comment gérer ce paramètre le plus simplement possible, peut-être auriez vous des idées sur ce type de gestion ?
Merci !
Dernière modification par zigo (29-07-2016 10:56:11)
Hors ligne
Bonjour,
Je ne comprend pas tellement ce que tu souhaite faire de ce paramètre, ni de comment tu l'identifie.
Hors ligne
Ok, je vais tacher d'être plus clair
Ce paramètre "environment" me permet de définir si je vais aller chercher mes données dans ma base de données dev ou recette.
Il est donc variable et je peux pas le fixer en dur. Je cherche donc un moyen de gérer ce paramètre au plus simple. Pour le moment ça se résume à :
Le récupérer depuis la route
$environment = $this->params()->fromRoute('environment');
L'envoyer dans la vue
return new ViewModel( [ 'utilisateurs' => $utilisateurs, 'id' => $id, 'environment' =>$environment, ] );
Et le remettre dans les liens
<a href="<?php echo $this->url( 'support/vehicule', [ 'environment' => $this->environment, 'id' => $entreprise['idAffiliation'] ] ); ?>"><?php echo $entreprise['vehicules']; ?></a>
Et ça partout partout. Donc je me disais qu'il y'a peut être moyen de le fixer une bonne fois pour toutes quand je rentre dans la section dev ou recette de mon appli pour ne pas avoir à m'en soucier après.
Je sais pas si c'est encore très clair
Hors ligne
D'accord,
Je vais donc tâcher de te donner des idées exploitables, en rapport avec cela.
J'aurais personnellement utilisé un événement sur EVENT_ROUTE ou dès que possible.
Dans le listener attaché, j'aurais analysé dans qu'elle section je suis pour déterminer ce paramètre que je poserai sous forme d'une variable (mis dans la session par exemple). Cela te le sors du coup de tes url ce qui est pas plus mal puisqu'il joue sur tes insert de donnés.
Hors ligne
Ok, ça fait appelle à des éléments nouveaux dans mon apprentissage de Zend :p
Si je comprends bien ce que tu proposes, ça serait sur les quelques liens qui permettent de passer d'un environnement à un autre :
- lancer l’événement EVENT_ROUTE pour créer cette variable
- La mettre en session
- La récupérer dans les controllers pour faire mes appels de web service
Et donc la gestion ne se fait plus dans les routes. J'aime bien l'idée !
Actuellement j'ai pas encore de système de login donc mettre en session.. >.< Mais peut être une classe service qui s'occuperait de retourner cette variable pourrait palier à ça pour le moment.
Hors ligne
La session n'est pas lié au login, elle est lié a celui qui requete sur ton site, même un invité non loggé possède une session de son navigateur (Le composant Container de zend t'en dira plus)
Je ne sais pas comment sont construits tes liens, mais dans l'idée tu as tout compris.
Hors ligne
Yes,
J'ai déjà utilisé Container donc je devrais pouvoir m'en sortir là dessus, le EVENT_ROUTE par contre c'est complètement nouveau donc je vais regarder ça tranquillement.
Hors ligne
Je te donne un peu d'aide si tu veux :
Comprendre (en fr) comment ZF2 gère les Evénement :
http://www.michaelgallego.fr/blog/2013/ … amework-2/
Quels sont les evenement qui sont déjà utilisé par zf2
https://akrabat.com/a-list-of-zf2-events/
Des exemples :
https://samsonasik.wordpress.com/2013/0 … ntmanager/
Le dernier exemple devrait t'intérréser.
Hors ligne
En parcourant un peu, je pourrais faire un truc de ce style là ?
public function onBootstrap(MvcEvent $e) { $event = $e->getApplication()->getEventManager(); $event->attach('route', function($e) { $container = new Container('environment-session'); //mon catch pour récupérer "dev" ou "recette" $container->environment = $mon_catch }); }
Et là première chose que je me dis, c'est hors la route, je ne peux actuellement pas différencier l'environnement sur lequel je suis.
Hors ligne
Voila le plus dur, et c'était le but de ma première réponse, tout dépend combien tu as de manière d'identifier dev ou recette.
Si tu n'a aucune autre solution que de passer par la route pour renseigner dev ou recette, chose que tu as l'air de confirmer, alors les solutions pour centraliser cela me paraissent compliqués. Et tu es obligé de faire cela partout partout...
Comme tu l'a si bien expliqué c'est embêtant, et probablement que tu as un problème d'architecture a ce niveau là.
Hors ligne
Je suis tout a fait d'accord. Et je te confirme bien que je n'ai actuellement aucun moyen d'identifier les deux environnements sans la route.
Sinon une solution que j'avais imaginé mais je n'ai aucune idée sur sa faisabilité ça serait en gros :
J'ai ma route qui contient le paramètre "environnement"
'support' => [ 'type' => 'segment', 'options' => [ 'route' => '/:environment/support', 'constraints' => [ 'environment' => '[a-zA-Z][a-zA-Z0-9_-]*', ], 'defaults' => [ 'environment' => 'dev', ], ],
Le but est dans ne pas avoir dans les child route à définir environnement. Sauf que si je le fais pas, c'est le défaut qui est pris en compte. Donc ça serait d’interagir dynamiquement sur ce paramètre par défaut.
En utilisant par exemple la session.
Mais est-il possible d’interagir dans le module.config ? et est-ce que même si c'est lourd, il vaut mieux pour le moment saisir le paramètre partout..
Hors ligne
Seul toi peu faire ce choix, pour le bien de ton projet, la durée, la maintenabilité, les évolutions prévues ?
Ce que je comprends pas c'est que veux dire Dev et recette ? D'accord ce sont deux bases différentes, mais dans quel contexte c'est l'une ou l'autre ?
Ton environnement c'est dev pour developpement et recette pour production c'est cela ?
Hors ligne
C'est tout a fait ça, la dev c'est l'environnement de développement et la recette est l'environnement utilisé pour les tests.
Sauf que (oui c'est très con) les données sur l'une et l'autre ne sont pas les mêmes.. Donc je fais un outil externe pour paramétrer rapidement les choses que ce soit pour un environnement ou l'autre.
Pour que ce soit générique et pas dupliquer tout deux fois, on a introduit l'environnement comme un paramètre qui permet de se connecter sur une base ou l'autre. Si on pouvait juste être ISO entre les deux avec les mêmes entités dans chaque ça serait la fête.
L'heure est un peu à la panique car on nous demande de faire un site en mode SAP avec une API contenant des modèles qui s'adapteraient à la volée pour correspondre à chaque client etc. Et le tout en pas bcp de temps alors que personne à l'expertise technique pour juste imaginer la faisabilité de tout ça x)
Un peu comme si on devait créer un SAAS où dans lequel il y'a un paramétrage du paramétrage en 4mois.
Dernière modification par zigo (01-08-2016 15:16:30)
Hors ligne
J'ai un peu de mal a visualiser ce que tu me dis car, moi aussi j'ai différents environnements et mes connections aux base de données se font bien en amont dans la configurations des adapteurs de connections en fait. Le coup de jouer sur l'url parceque tu ne connait pas avant sur l'environnement d'ou tu viens me semble étrange.
Je ne peux t'aider plus et j'en suis désolé.
Hors ligne
Je comprends.
Juste pour que tu visualises mieux le truc même si ça apportera pas grand chose pour le problème,
Je suis pas connecté directement aux bases de données mais à une API donc il y'a une API Dev et une API Recette.
Toutes les informations de connexions à ces APIs sont renseignées dans une classe "RestfulApi[Env]Service" donc j'ai deux fichiers. Ils sont ensuite appelés par des alias restfulApi[Env]
Donc le paramètre dans la route me permet de savoir si je vais chercher restfulApiDev ou restfulApiRecette.
Ce qui est tricky c'est que le site que je fais n'est pas branché à un environnement particulier mais il doit accéder aux deux et donc il faut un moyen pour savoir sur quel environnement je tape et actuellement j'ai trouvé que la route..
Voilà en espérant que ce soit plus clair
Dernière modification par zigo (01-08-2016 15:26:22)
Hors ligne
Voici comment on peut faire:
- régler la variable d'environnement dans le VirtualHost de la conf Apache : SetEnv APPLICATION_ENV "recette"
- ou régler la variable d'environnement dans un fichier .htaccess (mais celui-ci ne devra pas être poussé pendant les déploiements, mais édité manuellement sur le virtualhost approprié ou en utilisant un outil de déploiement): SetEnv APPLICATION_ENV "Recette"
- ou régler la variable d'environnement dans PHP (bof, bof...): putenv("APPLICATION_ENV=recette")
Pour moi, la première solution est la mieux parce qu'elle évite des erreurs d'écrasement. Ça nécessite toutefois d'avoir accès à la conf du Virtualhost. J'ai nommé la variable APPLICATION_ENV, on peut l'appeler n'importe comment.
Ensuite, grâce à la fonction 'getenv()' tu récupères ton environnement qui te permet de cibler un fichier de conf du genre "config/autoload/db.recette.php" ou "config/autoload/db.dev.php"...
Exemple dans "application.config.php"
[lang=php]//on récupère la variable d'environnement (ne pas oublier de faire quelques contrôles et une valeur par défaut) $env = getenv('APPLICATION_ENV'); return [ 'modules' => ... ... 'module_listener_options' => [ //on cible le fichier de conf de cet environnement. 'config_glob_paths' => ['config/autoload/db/' . $env . '.php'] ] ... ];
Sinon, si tu veux pouvoir alimenter à la volée ta db de dev OU de recette à partir du même Virtualhost, je te propose de mettre deux simples boutons "dev" et "recette" dans ton UI qui vont te mettre un cookie "environnement". Ensuite tu fais le test de l'environnement sur le cookie. Evidemment c'est moins secure (comme ta solution à base de paramètre dans l'url d'ailleurs).
Hors ligne
Ok, je vais étudier ça.
L'idée du cookie aussi ça pourrait être une solution, ou bien mettre en session l'information. Et le point d'entrée du site serait ces deux boutons.
Aujourd'hui j'ai eu de nouvelles infos, il est probable que j'ai à mettre en place un système de login dans ce site donc je pourrais surement associé cette information à l'utilisateur avec un admin_dev et un admin_recette par exemple.
Les besoins changent chaque jour alors j'attendrais d'avoir un peu plus de visibilité pour choisir quelque chose
Merci pour les réponses !
Hors ligne