IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Paramètres par sous-domaine


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut Paramètres par sous-domaine
    Bonjour tout le monde,

    Voici j'ai un petit souci

    je suis en train de mettre en place une application symfony qui pourra être accessible depuis une multitude de domaine et sous domaine.

    La conf reseaux est ok, cependant je me heurte maintenant à la conf de symfony2

    Dans mon Bundle j'ai créer une dépendance avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public function load(array $configs, ContainerBuilder $container)
        {
            $configuration = new Configuration();
            $config = $this->processConfiguration($configuration, $configs);
     
            $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
            $loader->load('services.yml');
    	$loader->load($_SERVER['HTTP_HOST'].'.yml');
        }
    Afin de récupérer un fichier de conf au nom du domaine qui appel le site. Si je supprime le cache et que je navigue sur chaque domaine en premier j'ai bien mon fichier correspondant qui est lue.

    Cependant si je parcourt plusieurs sous domaine, le fichier de configuration du nouveau sous domaine n'est pas lue et j'ai encore les parametres de l'ancien fichier qui apparaissent sur ma page.

    Comment je peux remedier à cela ?

    En gros j'aimerais avoir une liste de parametre spécifique pour chacun de mes domaines et sous domaines.

    Merci pour votre aide

    Cordialement,

    decad7

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    la configuration est chargé au premier appel de app.php, pour les requetes suivants c'est le cache qui sera utilisé.
    tu trouveras dans app/cache/prod/ProdProjectContainer.php cette config, tu verras que les paramètres y sont écris en dur, et que la méthode setParameter est désactivé.

    une autre approche serait de créer un service "subDomain" qui te renverrait ces paramètres en fonction de la requete HTTP en cours.

    Autre solution, créer plusieurs environnements (fichiers web/app_{env}.php et app/config/config_{env}.yml) pour chacun de tes sous-domaines.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    Salut et merci pour ta réponse,

    Le problème c'est que le nombre de sous domaine va être trés important, et que le fichier de configuration sera créé à la volée.

    Je peut donc pas me permettre de creer un environement pour chacun de mes sous domaines, il y en aura beaucoup trop.

    Il n'y a aucun moyen pour differencier ce cache en fonction du domaine, ou autrement ?

    Encore merci

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    Bon j'ai essayé une autre piste

    en utilisant ceci :

    que j'ai rajouté dans le fichier de config dans app :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    services:
       kernel.listener.subdomain_listener:
           class: MONCHEMIN\SubdomainListener
           tags:
               - { name: kernel.event_listener, event: kernel.request, method: onDomainParse }
    puis j'ai créé la classe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    namespace MONCHEMIN;
     
    use Symfony\Component\EventDispatcher\EventDispatcher;
    use Symfony\Component\EventDispatcher\Event;
     
    class SubdomainListener
    {
       public function onDomainParse(Event $event)
       {
           $request = $event->getRequest();
           $session = $request->getSession();
     
           // todo: parsing subdomain to detect country
           $session->set('subdomain', $request->getHost());
       }
    }
    donc avec cette methode la variable du sous domaine est passé en session.

    Maintenant comment je pourrais faire pour créer une liste de parametres qui soit automatiquement charger en fonction de l'host. Sachant que mes parametres devront être accessible depuis l'ensemble des mes controleurs.

    Si quelqu'un peu me donner un coup de pouce...

    Merci d'avance

    Decad7

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Je vois pas vraiment pourquoi tu met en session le host, c'est une information auquel tu auras toujours accés via ton service et de plus si l'utilisateur bascule sur un autre sous-domaine, les résultats seront sans doute inatendues

    à priori l'approche service doit te permettre de réaliser ce que tu veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    use Symfony\Component\EventDispatcher\EventDispatcher;
    use Symfony\Component\EventDispatcher\Event;
     
    class SubdomainListener
    {
       protected $currentDomain;
     
       protected $parameters;
     
       public function onDomainParse(Event $event)
       {
           $this->currentDomain=$event->getRequest()->getHost();
       }
       public function getHostParameter($paramName,$default=null){
            if(null===$this->parameters){
                  $this->loadParameter();
            }
            return isset($this->parameters[$paramName])?$this->parameters[$paramName]:$default;
       }
       //implémenter ici la logique pour configurer les paramètres selon le host
       protected function loadParameter(){
         $this->parameters=array();
         switch($this->currentDomain) {
             case 'toto.domain.com':
                 $this->parameters['param1']='toto';
               break;
         }     
       }
    }
    ton listener étant avant tout un service tu auras toujours accés aux parametres dans tes controlleurs via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->get('kernel.listener.subdomain_listener')->getHostParameter('param1');

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    je vois trés bien ou tu veux m'ammener.

    cependant voila mon souci pour être plus précis.

    Nous allons avoir une interface pour chaque client (lié à son domaine) chaque client peut modifier certains parametres, et nous générons notre fichier de configuration à cette instant (qui contient l'ensemble des parametres)

    le nombre de domaine est trop important pour mettre tout ça dans un switch, et doit utiliser la logique des fichiers de configuration yml de symfony....

    et la je séche vraiment, je n'arrive pas à trouver de solution propre pour faire cela.

    Je pense que ton script n'en est pas loin...

    Tu aurais une idée ?

    Encore merci

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Le switch case n'était qu'un exemple,
    effectivement si vous sauvegarder ces paramètres dans un fichier yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //implémenter ici la logique pour configurer les paramètres selon le host
       protected function loadParameter(){
         //on considère que l'on a injecté dans le service listener un parametre "chemin du répertoire de sauvegarde" genre %app_kernel.root_dir%/client_config
         $fileName=$this->pathToAppKernel.'/'.$this->currentDomain.'.yml';
    //gérer le cas ou le fichier n'existe pas...
    //pour le parser voir http://symfony.com/doc/2.0/components/yaml.html
         $this->parameters= Yaml::parse($fileName);
     
       }
    aprés rien n'oblige à utiliser les fichiers yml pour sauvegarder des paramètres, tu pourrais tout aussi bien avoir un champ clientParameters dans une table de ta BDD et y insérer des paramètres au format json

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    bon merci je vois maintenant comment faire...

    sinon je vais parraître pour une quiche...mais comment je peux récuperer le root directory de app depuis mon listener ?

    merci beaucoup pour ton aide.

  9. #9
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    comment je peux récuperer le root directory de app depuis mon listener ?
    en l'injectant dans le constructeur de ta classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    services:
       kernel.listener.subdomain_listener:
           class: MONCHEMIN\SubdomainListener
           arguments: [%kernel.root_dir%] # liste des arguments que l'on passe dans le constructeur
           tags:
               - { name: kernel.event_listener, event: kernel.request, method: onDomainParse }
    http://symfony.com/doc/2.0/book/serv...ner-parameters
    http://symfony.com/doc/2.0/cookbook/...bal-parameters

    je te conseille également de changer le nom de ton service pour quelque chose de plus court ('my_app.subdomain_params')
    éventuellement tu pourras toujours changer le service qui te fournit ces paramètres et ce ne sera pas forcement un listener, l'important étant que cette classe ait une méthode getParameter (ou bien get tout court)

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    Merci beaucoup,

    je suis enfin parvenu à faire ce que je voulais faire grâce a tes conseils avisés.

    Maintenant il me reste plus qu'un point a traiter.

    L'idéal ce serait de faire en sorte que le tableau de paramètres soient basculer également en cache, mais avec un cache différent par domaine.

    On peut surcharger la méthode qui créer le cache dans le kernel, mais le soucis c'est qu'il faudrait que j'utilise ce procéder uniquement pour le cache générer pour ces paramètres.

    Et la cela devient vite complexe, et malgré la lecture de la doc concernant le cache, je n'ai pas trouver de solution...

    J'y suis presque et grâce a vous

    Si vous avez une idée pour cette histoire de cache je suis preneur.

    Encore merci

  11. #11
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    On peut toujours gérer manuellement son cache en créant des fichiers php dans le répertoire cache.

    dans app/cache/prod/client_parameters/client1.php, exemple de fichier généré à partir du parsing d'un fichier yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <?php
    return array('param1'=>1, 'param2'=>2);
    on peut l'utiliser et le générer ainsi


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <?php
     
    $pathToCacheFile="app/cache/prod/client_parameters/client1.php";
     
    if(file_exist($pathToCacheFile)){
      //on inclut le fichier de cache et on récupère le tableau qu'il renvoit dans une variable
      $params = include $pathToCacheFile;
    }else{
      //on parse le Yml et on génère le fichier de cache
      $params=Yaml::parse('mon/fichier/de/parametres/client1.yml');
      $paramSerialized=array();
      foreach($params as $key=>$value){
         $paramSerialized[]="'$key'=>'$value'";
      }
      file_put_contents($pathToCacheFile, '<?php return array('.implode(',',$paramSerialized).');');
    }
     
     
    $param1=$param['param1'];

    Je n'ai pas cherché mais il existe probablement des outils dans Symfony pour faire ce genre de chose de façon plus propre.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    Bon alors j'ai cherché un peu pour mettre en cache les données

    Et j'ai créer mon service avec le controleur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <?php
     
    namespace [MonChemin]\Listener;
     
    use Symfony\Component\EventDispatcher\EventDispatcher;
    use Symfony\Component\EventDispatcher\Event;
    use Symfony\Component\Yaml\Parser;
    use Doctrine\Common\Cache\ArrayCache;
     
    class SubdomainListener
    {
       protected $currentDomain;
       protected $pathToAppKernel;
       public $Cache;
     
       protected $parameters;
     
       public function __construct(ArrayCache $Cache,$KernelDirectory) {
           $this->pathToAppKernel = $KernelDirectory;
       }
     
       public function onDomainParse(Event $event)
       {
           $this->currentDomain=$event->getRequest()->getHost();
       }
     
       public function getHostParameter($paramName,$default=null){
     
            if(null===$this->parameters){
                  $this->loadParameter();
            }
            return isset($this->parameters['parameters'][$paramName])?$this->parameters['parameters'][$paramName]:$default;
       }
     
       public function GetDomain(){
           return $this->currentDomain;
       }
     
     
       protected function loadParameter(){
     
         if ($this->Cache->contains($this->currentDomain.'-params')) {
                $this->parameters = $this->Cache->fetch($this->currentDomain.'-params');
            }else{       
                //Read Configuration File
                $fileName = (file_exists($this->pathToAppKernel.'/config/domain/'.$this->currentDomain.'.yml'))
                               ? $this->pathToAppKernel.'/config/domain/'.$this->currentDomain.'.yml'
                               : $this->pathToAppKernel.'/config/domain/default.yml';
     
                //Parse yaml Configuration File
                $yaml = new Parser();
                $this->parameters = $yaml->parse(file_get_contents($fileName));
     
                $this->Cache->save($this->currentDomain.'-params', $this->parameters,3600);
            }
       }
    }
    ?>
    Et j'ai rajouté dans la configuration cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    services:
       kernel.listener.subdomain_listener:
           class: [MONCHEMIN]\SubdomainListener
           arguments: [Doctrine\Common\Cache\ArrayCache, %kernel.root_dir%]
           tags:
               - { name: kernel.event_listener, event: kernel.request, method: onDomainParse }
    Cependant j'ai une erreur concernant la déclaration de la variable 1 dans le constructeur de mon controleur, mon premier argument Doctrine\Common\Cache\ArrayCache ne fonctionne pas.

    Comment je peux faire hériter dans mon constructeur de l'objet de la classe ArrayCache ?

    J'ai regardé quelques tuto mais rien n'y fait

    Merci d'avance

    decad7

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    Bon finalement j'ai fait quelques modifs et je n'ai plus d'erreur.

    Voici le controleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    namespace [MonChemin]\Listener;
     
    use Symfony\Component\EventDispatcher\EventDispatcher;
    use Symfony\Component\EventDispatcher\Event;
    use Symfony\Component\Yaml\Parser;
    use Doctrine\Common\Cache\ArrayCache;
     
    class SubdomainListener
    {
       protected $currentDomain;
       protected $pathToAppKernel;
       public $Cache;
     
       protected $parameters;
     
       public function __construct(ArrayCache $Cache,$KernelDirectory) {
           $this->pathToAppKernel = $KernelDirectory;
           $this->Cache = $Cache;
       }
     
       public function onDomainParse(Event $event)
       {
           $this->currentDomain=$event->getRequest()->getHost();
       }
     
       public function getHostParameter($paramName,$default=null){
     
            if(null===$this->parameters){
                  $this->loadParameter();
            }
            return isset($this->parameters['parameters'][$paramName])?$this->parameters['parameters'][$paramName]:$default;
       }
     
       public function GetDomain(){
           return $this->currentDomain;
       }
     
     
       protected function loadParameter(){
     
         if ($this->Cache->contains($this->currentDomain.'-params')) {
                $this->parameters = $this->Cache->fetch($this->currentDomain.'-params');
            }else{       
                //Read Configuration File
                $fileName = (file_exists($this->pathToAppKernel.'/config/domain/'.$this->currentDomain.'.yml'))
                               ? $this->pathToAppKernel.'/config/domain/'.$this->currentDomain.'.yml'
                               : $this->pathToAppKernel.'/config/domain/default.yml';
     
                //Parse yaml Configuration File
                $yaml = new Parser();
                $this->parameters = $yaml->parse(file_get_contents($fileName));
     
                $this->Cache->save($this->currentDomain.'-params', $this->parameters,3600);
            }
        }
    }
    et le fichier de conf, j'ai rajouté le @ pour que cela fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    services:
       cache:
           class: Doctrine\Common\Cache\ArrayCache
       kernel.listener.subdomain_listener:
           class: [MONCHEMIN]\SubdomainListener
           arguments: [@cache,%kernel.root_dir%]
           tags:
               - { name: kernel.event_listener, event: kernel.request, method: onDomainParse }
    Mais comme c'était trop beau pour que cela fonctionne correctement ^^ j'ai malgrés tout un petit soucis.

    dans cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    //JE NE PASSE JAMAIS DANS CETTE PREMIERE CONDITION COMME SI IL NE RETROUVER PAS LE CACHE
     if ($this->Cache->contains($this->currentDomain.'-params')) {
                $this->parameters = $this->Cache->fetch($this->currentDomain.'-params');
            }else{       
                //Read Configuration File
                $fileName = (file_exists($this->pathToAppKernel.'/config/domain/'.$this->currentDomain.'.yml'))
                               ? $this->pathToAppKernel.'/config/domain/'.$this->currentDomain.'.yml'
                               : $this->pathToAppKernel.'/config/domain/default.yml';
     
                //Parse yaml Configuration File
                $yaml = new Parser();
                $this->parameters = $yaml->parse(file_get_contents($fileName));
     
                //ALORS QUE LA SAUVEGARDE DU CACHE EST ICI
                $this->Cache->save($this->currentDomain.'-params', $this->parameters,3600);
            }
        }
    Comme j'essaye de le monter dans le code, je rentre jamais dans la condition du cache qui est retrouvé, du coup il génére le cache a chaque fois......

    Est ce que vous avez une piste ou des idées ?

    Encore merci

Discussions similaires

  1. [Reverse proxy] un port différent par sous-domaine
    Par maaazaaam dans le forum Apache
    Réponses: 5
    Dernier message: 18/03/2012, 17h10
  2. Faire un mini Short url par sous domaine
    Par dancom5 dans le forum Apache
    Réponses: 11
    Dernier message: 02/10/2011, 15h00
  3. Réponses: 5
    Dernier message: 05/03/2009, 13h09
  4. Réponses: 0
    Dernier message: 17/11/2008, 21h15
  5. Sous domaine virtuel par Htaccess
    Par Nicolas N. dans le forum Apache
    Réponses: 2
    Dernier message: 16/07/2007, 13h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo