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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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