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 :

Créer un sous domaine de mon site [2.x]


Sujet :

Symfony PHP

  1. #1
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut Créer un sous domaine de mon site
    Bonjour,

    Je suis le créateur d'un site, nommé J'ai Une Idée : https://www.jaiuneidee.net

    Comme vous pouvez le constater, ce site permet de proposer des idées aussi bien au niveau local que national.
    La plateforme nationale me va, mais pour le local, je pense que je peux faire bien mieux. En effet, j'aimerai pouvoir créer des url du type : https://www.angouleme.jaiuneidee.net
    Cette url n'afficherait que les idées d’Angoulême, proposerait une valeur par default a la création d'un compte ou d'une idée.

    La question, comment le faire.

    Je pense pouvoir créer un vhost apache qui répond a toutes les url du type : xxx.jaiuneidee.net
    Ensuite, j'imaginais renseigner un entète HTTP contenant l'id de la localisation.
    Sur mes pages, je testerai cet id, et selon le cas, j'afficherai la version totale ou la version locale du site. Bien évidement, cela veut dire que toutes les url internes sont transformées en angouleme.jaiuneidee.net pour rester sur la version locale.



    Est-ce que cette solution technique vous parait cohérente ?
    Quelles difficultés voyez-vous à cette construction ?

    Je vois plusieurs trucs un peu embêtant :
    - associer un sous domaine à un id. Il me faudrait un controlleur ou un service spécial appelé depuis toutes les pages qui va chercher cette association quelque part, et qui renseigne une variable de session.A quel endroit mettre ce code(potentiellement, toutes les pages peuvent être ouvertes sans variable de session renseignée). Est-ce que j'associe automatiquement selon le nom(avec les nombreux doublons en France) ou est-ce que je créé une table spécifique ou une colonne sous domaine dans ma table localisation.
    - rester sur le site
    - gérer le https, je crois qu'il faut un certificat spécial pour du multidomaine.

    Vous en pensez quoi ?

    Merci,
    Pierre

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Bonjour,

    - associer un sous domaine à un id. Il me faudrait un controlleur ou un service spécial appelé depuis toutes les pages qui va chercher cette association quelque part, et qui renseigne une variable de session.A quel endroit mettre ce code(potentiellement, toutes les pages peuvent être ouvertes sans variable de session renseignée). Est-ce que j'associe automatiquement selon le nom(avec les nombreux doublons en France) ou est-ce que je créé une table spécifique ou une colonne sous domaine dans ma table localisation.
    Le routing de base est capable de gérer ton sous domaine et la verification de l'existence de ce dernier (soit en dur, soit en utilisant un service)
    http://symfony.com/fr/doc/current/co...e_pattern.html

    Tu pourras donc avoir une route du style
    monDomaine.com
    {maville}.monDomaine.com
    et prévoir une route du style
    monDomaine.com/{maville}

    n'oublies pas de bien preciser au moteurs de recherche la page principal pour éviter les duplicate-content
    (<link rel="canonical" href="....)

    - rester sur le site
    J'ai pas compris

    - gérer le https, je crois qu'il faut un certificat spécial pour du multidomaine.
    Oui, il te faudra passer a un certificat wilcard.

  3. #3
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Merci, pour l'aide symfony, ca me parait assez adapté.
    Pour le widcard aussi.

    Pour l'idée de rester sur le site, je ne veux pas que la personne qui va sur angouleme.jaiuneidee.net se retrouve plus tard sur jaiuneidee.net... mais qu'elle reste sur sa sous plateforme.

    Je peux donc imaginer de crééer une route comme suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    projects_homepage:
        path:     /
        host:     "{ville}.jaiuneidee.net"
        defaults: { _controller: AcmeDemoBundle:Main:VilleSelection }
     
    homepage:
        path:     /
        defaults: { _controller: AcmeDemoBundle:Main:homepage }
    Dans mon controller Ville Selection, je fais l'association entre la ville et l'id en session, et puis je redirige vers le controlleur principal, en esperant qu'il ne supprime pas le sous domaine.

    C'est bien cela ?
    Pierre

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Oui pour le routing c'est la solution (mais pas besoin du VilleSelection).

    Pour la selection des villes je poserais un listener sur le KernelEvents::REQUEST, ce qui me parait plus adapté a la situation.

    Tu peux tout de meme créer un controller, qui aura lui comme role de permettre a l'utilisateur de changer de ville ( modifier la session ).

    Voila

  5. #5
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Merci pour ton aide.
    Je vais essayer ca ce week end je pense.

    A mon avis, j'aurais un test sur 2 variables dans le event listener.
    Ville et idVille.
    Si la ville change(par exemple si l'utilisateur décide d'aller sur arras.jaiuneidee.net) je déclenche le changement sur l'id avec requete, etc...

    par contre, j'ai déjà pas mal de parametre sur ma première page(numéro de page par exemple) donc je me demande un peu comment je vais faire pour faire passer ma variable de mon fichier de route a mon event listener.

    Dailleur, j'en viens a une seconde question, comment puis-je faire pour que cet variable puisse etre disponible depuis toutes les routes. Puisque a priori, si quelqu'un a un lien direct, il doit se retrouver avec une session proprement ouverte, et pas seulement si il passe par la page d'accueil.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Petite démo :

    un routing :
    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
     
     
    city_homepage:
        path:     /
        host:     "{city}.domaine.local"
        defaults:
            _controller: FrameworkBundle:Template:template
            template:    '::homepage.html.twig'
        requirements:
            city:        marseille|paris
     
    homepage:
        path: /{city}
        defaults:
            _controller:  FrameworkBundle:Template:template
            template:     '::homepage.html.twig'
            city:         null


    un listener :

    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
     
    <?php
     
    namespace App\CityBundle\Listener;
     
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
     
    class RequestListener {
     
        public function __construct()
        {
        }
     
        /**
         * @param GetResponseEvent $event
         */
        public function onKernelRequest(GetResponseEvent $event)
        {
            /** @var \Symfony\Component\HttpFoundation\Request $request */
            $request = $event->getRequest();
     
            /** @var \Symfony\Component\HttpFoundation\Session\Session $session */
            $session = $request->getSession();
     
            // have session and request but not equals
            if((null !== $session->get('city') && null !== $request->get('city')) && ($session->get('city') !== $request->get('city'))){
                $session->set('city',$request->get('city'));
                $request->attributes->set('city',$session->get('city'));
            }
     
            // user do not have session and have request
            if(null === $session->get('city') && null !== $request->get('city')){
                $session->set('city',$request->get('city'));
            }
     
            // user have session and do not have request
            if(null !== $session->get('city') && null === $request->get('city')){
                $request->attributes->set('city',$session->get('city'));
            }
     
            // user do not have session and do not have request
            if(null === $session->get('city') && null === $request->get('city')){
                $request->attributes->set('city','all city');
            }
     
     
        }
     
    }

    n'oublions pas qu'il va falloir partager les sessions (the truc qui aurait pu te faire suer, mais tkt je suis là ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    framework:
    ...
        session:
            cookie_lifetime: 0
            save_path: %kernel.root_dir%/cache/sessions
            cookie_domain: .domaine.local
            name: SFSESSID
    ...
    puis enregistrons notre listener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    services:
        city_request_listener:
            class: App\CityBundle\Listener\RequestListener
            tags:
                - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
    Et laissons faire la magie ...
    il te restes plus qu'a faire un petit test histoire de voir si c'est ce que tu attendais comme solution

  7. #7
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Merci beaucoup.

    je n'avais pas du tout pensé au partage de session(entre les sous domaine et les surdomaine).
    Pas bete.

    Pour la variable city, je ne compte pas la mettre en parametre a droite de mon url... juste a gauche.
    Ce qui veut dire que je pense qu'il sera complexe d'imaginer la récupérer dans $request. Mais je me trompe peut être. Il faudra donc que je gère les 2 cas, soit je suis sur le site principale et cette variable n'existe pas. Soit je suis sus run sous domaine et la variable existe et j'associe l'id qui va bien.

    Merci en tout cas

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Pour la demo je l'ai mis a null par default (et dans le listener si elle est null alors je set app.request.get('city') avec un 'city all'), donc pas de problème ...

    Je l'ai rajouté pour que tu comprennes bien que si tu voulais l'avoir en paramètre sur le domaine principal cela serait possible (voir pratique).

    Je te laisse le temps de tester, et n'hésite pas à faire un retour si à un moment tu te sens perdu ....

  9. #9
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Bonjour,

    J'ai enfin eu le temps ce week end de m'y mettre.
    Bon, ce n'est pas en ligne encore, mais tout le dérouelment ci dessus fonctionne très bien.

    J'ai eu quelques petits changements à faire :
    - simplifier les cas dans lee listener .Je ne comprend pas trop pkoi il faudrait que j'inscrive quelque chose dans mon objet request... je n'utilise que ma session.
    - importer mon entity manager doctrine dans mon listener afin de chercher en BDD la correspondance avec la ville.

    Le plus complexe finalement a été de configurer apache pour accepter n'imorte quelle url en entrée. Avant de trouver la syntaxe du serveralias *.jaiuneidee.net

    Il me reste à mettre en place une redirection vers une 404 personnalisée, un affichage des villes disponibles (menu, carte...) et bien sur à utiliser ces données pour afficher différents contenus dans mon site. Mais on est dans le simple maintenant.

    Un autre trucs moins facile, on ne peut pas crééer un hostname dans le fichier /etc/hosts au format *.xxx.net
    Ce sera possible uniquement sur un vrai DNS, ce qui m'a bloqué un petit poil pour le dev, mais pas trop.

    Encore merci pour ton aide, tu m'a épargné de nombreuses heures de recherche je pense.

    Pierre

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    - simplifier les cas dans lee listener .Je ne comprend pas trop pkoi il faudrait que j'inscrive quelque chose dans mon objet request... je n'utilise que ma session.
    Si tu y arrives sans c'est tout aussi bien

    - importer mon entity manager doctrine dans mon listener afin de chercher en BDD la correspondance avec la ville.
    suffit de passer le repository à ton Listener non ?

    pour declarer un repo as service rien de plus simple :
    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
     
    <?xml version="1.0" ?>
     
    <container xmlns="http://symfony.com/schema/dic/services"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
     
        <parameters>
            <parameter key="folio.entity.project_repository.class">Acme\FolioBundle\Entity\ProjectRepository</parameter>
            <parameter key="folio.entity.project_entity.class">Acme\FolioBundle\Entity\Project</parameter>
        </parameters>
     
        <services>
     
            <service id="folio.entity.project_repository"
                     class="%folio.entity.project_repository.class%"
                     factory-service="doctrine.orm.default_entity_manager"
                     factory-method="getRepository"
                    >
                <argument>%folio.entity.project_entity.class%</argument>
            </service>
     
            <service id="folio.entity.project_entity" class="%folio.entity.project_entity.class%"/>
        </services>
     
     
    </container>
    Et n'oublie pas de foutre ce résultat en cache (je parle du Cache Doctrine) avec un bon gros ttl, qu'il est rare qu'une ville change de nom.

  11. #11
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Quel est l'avantage pour toi de mettre plutôt le repository plutot que l'entity manager en parametre de mon listener ?

    Pour le cache, j'ai activé le cache des requetes il y a longtemps (dans la config... pas sur que ca cache quoi que ce soit au final, je ne sais pas trop comment vérifier).

    Pour le cache, j'ai toujours eu du mal à le gérer. Autant le cache HTTP de base sur les images etc(celui qui se fait tout seul) va a peu près, autant après, ca se mélange entre session utilisateur, etc.. et j'ai toujours trouvé que ca me donnait beaucoup d'emmerdes.

    Mais pour le résultat des villes, si vraiment ca devient une requête courante(et ca va le devenir au moins pour génerer le système pour passer d'une ville à l'autre) c'est vrai que ca peut être utile.

    on parle bien du result cache décrit sur cette page ?
    http://docs.doctrine-project.org/en/...e/caching.html


    Merci,
    pierre

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Quel est l'avantage pour toi de mettre plutôt le repository plutot que l'entity manager en parametre de mon listener ?
    Pour les mêmes raisons que d'injecter l'entity manager plutot que doctrine ou le container tout entier
    Après tu trouves ton niveau de précision qui te conviens.
    Injecter l'entity manager a ton listener qui ne fait que d’interroger ta base pour la correspondance de ta ville c'est donner accès a des responsabilités superflues (persist, remove etc...).

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Pour le cache c'est bien celui de Doctrine ( faut jouer avec ) et pour savoir ce qui est en cache apc propose une interface pour visualiser les indexes.

    L'autre truc, en injectant le repository et en passant toute la configuration des definitions de tes services via le container tu pourras simplement changer d'entité au niveau de l'application en ovveridant les paramètres ou les services, ou dans un autre bundle avec une passe de compilation ....

  14. #14
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Bonjour,

    Question bizarre...

    J'ai bien fait dans le listener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $session->set('localisation', $localisation->getNom());
    Et dans mon controller je peux faire ca : (et récupérer ma ville)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "Localisation : ".$request->getSession()->get('localisation');
    En revanche, dans twig, si je fait ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {{app.session.get('localisation')}}
    Je ne récupère rien.

    Une idée ? Dans le profiler, mon objet localisation existe bien dans ma session, mais il est null...

    Pierre

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Non c'est pas normal !
    Il va falloir fournir plus d'informations.

    'ce null ne sort pas de nulle part'

  16. #16
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Je pense avoir compris.

    Seule une seule de mes routes est parémetrée avec le nom d'hote.

    Hors, il suffit que je fasse un render par exemple ou que j'appelle une autre route pour que mon listener découvre une variable vide, croie que l'on est dans le cas du site principale et vide toutes les variables.

    Comme mon application peut avoir plusieurs points d'entrée, je me demande bien maintenant comment appliquer a toutes mes routes l'utilisation de ce parametre.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    JaiUneIdeeSiteBundle_localized_homepage:
        path:     /
        host:     "{localisation}.%main_site%"
        defaults: {_controller: JaiUneIdeeSiteBundle:Page:index, page:1, page_news:1 }
    JaiUneIdeeSiteBundle_homepage:
        pattern:  /
        defaults: {_controller: JaiUneIdeeSiteBundle:Page:index, page:1, page_news:1, localisation:null }
    Je n'ai pas du tout envie de faire la même chose pour toutes les routes, sans compter que pour celles ajoutée par des bundle(fosuser) je vais me galérer...

    Il faut donc que je trouve un moyen d'ajouter ce parametres a toutes les routes, un peu comme on peut mettre prefix.

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Dans ton listener, comme je te l'ai montré l'autre jours ..... ( si null alors city_all )

  18. #18
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Bonjour,

    Cette idée fonctionne bien si on a un seul point d'entrée.

    Exemple, l'utilisateur arrive toujours ou sur https://www.jaiuneidee.net ou sur https://paris.jaiuneidee.net

    Mais que se passe t'il si il viennent sur :
    paris.jaiuneidee.net/idee/1/titredemonidee
    sans avoir de session ouverte ?

    J'utiliserai alors une autre route, qui n'est bien sur pas la homepage. Cela veut il dire qu'il faudrait que toutes mes routes soient duppliquées pour être compatible avec les 2 hosts ?

    Merci
    Pierre

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Hein dupliquer tes routes ..... t'es dingue !!!

    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
     
     
    city_homepage:
        path:     /{url}
        host:     "{city}.directory.goabonga.com"
        defaults:
            url:        null
        requirements:
            url:        ".+"
            city:       paris|marseille
     
    homepage:
        path:  /
        defaults:
            _controller:  FrameworkBundle:Template:template
            template:     '::homepage.html.twig'
     
    article:
        path:  /{slug}
        defaults:
            _controller:  FrameworkBundle:Template:template
            template:     '::homepage.html.twig'
        requirements:
            slug: "[a-zA-Z0-9]{2,15}"
    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
    60
    61
    62
    63
    64
     
    <?php
     
    namespace EventListener;
     
    use Symfony\Bundle\FrameworkBundle\Routing\Router;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\Routing\RequestContext;
     
     
    class RequestListener 
    {
        protected $router;
     
        function __construct(Router $router)
        {
            $this->router = $router;
        }
     
        /**
         * @param GetResponseEvent $event
         */
        public function onKernelRequest(GetResponseEvent $event)
        {
     
            /** @var \Symfony\Component\HttpFoundation\Request $request */
            $request = $event->getRequest();
     
     
            if($request->get('_route') === 'city_homepage'){
                $city = $request->get('city');
                $m = $this->router->getMatcher();
                $m->setContext(new RequestContext('/','GET','directory.goabonga.com'));
                $r = $m->match('/'.$request->get('url'));
                $event->getRequest()->attributes->replace($r);
                $event->getRequest()->attributes->add(array('city'=>$city));
            }
     
            /** @var \Symfony\Component\HttpFoundation\Session\Session $session */
            $session = $request->getSession();
     
            // have session and request but not equals
            if((null !== $session->get('city') && null !== $request->get('city')) && ($session->get('city') != $request->get('city'))){
                $session->set('city',$request->get('city'));
                $request->attributes->set('city',$session->get('city'));
            }
     
            // user do not have session and have request
            if(null === $session->get('city') && null !== $request->get('city')){
                $session->set('city',$request->get('city'));
            }
     
            // user have session and do not have request
            if(null !== $session->get('city') && null === $request->get('city')){
                $request->attributes->set('city',$session->get('city'));
            }
     
            // user do not have session and do not have request
            if(null === $session->get('city') && null === $request->get('city')){
                $request->attributes->set('city','all city');
            }
     
        }
    }
    http://directory.goabonga.com/slug
    http://paris.directory.goabonga.com/slug

  20. #20
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Bonjour,

    J'ai maintenant un système fonctionnel.

    J'ai abandonné l'utilisation de l'host dans le fichier de route puisque ca ne fonctionne que si on passe par un point d'entrée unique.(il semblerait)

    En revanche, je detecte maintenant l'hote manuellement dans mon listener, et j'extrait l'information qui m'interesse.
    Je fais après ma mise en session / récupération de la ville en cours manuellement sans plus de problème.

    Merci a vous tous pour vos conseils.

    Pierre

    Mon code :
    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
    60
     
    <?php
     
    namespace JaiUneIdee\LocalisationBundle\Listener;
     
    use Doctrine\ORM\EntityManager;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    class RequestListener {
        protected $em;
        protected $base_site;
     
        public function __construct(EntityManager $entity_manager, $base_site) {
            $this->em = $entity_manager;
            $this->base_site = $base_site ;
     
        }
     
        /**
         * @param GetResponseEvent $event
         */
        public function onKernelRequest(GetResponseEvent $event) {
            /** @var \Symfony\Component\HttpFoundation\Request $request */
            $request = $event->getRequest();
            $host = $request->getHost();
            $localisation = str_replace(".","",str_replace($this->base_site,"",$host));
     
            /** @var \Symfony\Component\HttpFoundation\Session\Session $session */
            $session = $request->getSession();
     
            //site principal
            if ("www" === $localisation){
                if($session->get('localisation') !== null){
                    $session->set('localisation', null);
                    $session->set('localisation_name', null);
                    $session->set('localisation_id', null);
                }
            }
            //site d'une ville
            else if ((null !== $localisation)&&($localisation!= $session->get('localisation'))){
                //trouver le nouveaulocalisation_id
                //si localisation_id trouvé
     
                $localisation_object = $this->em->getRepository('JaiUneIdeeLocalisationBundle:Localisation')->findOneBy(array("urlName"=>strtolower($localisation)));
                if($localisation_object !== null){
                    $session->set('localisation', $localisation_object->getUrlName());
                    $session->set('localisation_name', $localisation_object->getNom());
                    $session->set('localisation_id', $localisation_object->getId());
                }
                else{
                    $session->set('localisation', null);
                    $session->set('localisation_name', null);
                    $session->set('localisation_id', null);
                    $url = str_replace($localisation,"www",$request->getSchemeAndHttpHost()).$request->getBaseUrl();
                    $event->setResponse(new RedirectResponse($url));
                }
            }
     
        }
    }
    Si j'ai www.jaiuneidee.net ca fonctionne
    Si j'ai paris.jaiuneidee.net, qui existe dans ma base, je met a jour la session en conséquance.
    Si j'ai une ville inconnue, je redirige vers le site www.jaiuneidee.net et je vide les sessions.

    Finalement, c'est bien plus simple que le système par routage je trouve.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Forum] Recherche de domaine dans mon site
    Par stanley dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 23
    Dernier message: 17/09/2009, 20h33
  2. Redirection sous domaine manquant vers site
    Par superpaoloo dans le forum Apache
    Réponses: 1
    Dernier message: 16/01/2009, 16h06
  3. [Conception] comment simplement créer des menus boutons pour mon site?
    Par irnbru dans le forum Webdesign & Ergonomie
    Réponses: 1
    Dernier message: 10/05/2007, 17h08
  4. sous-domaine sur mon serveur
    Par Quezako dans le forum OVH
    Réponses: 1
    Dernier message: 10/05/2007, 14h03
  5. [MySQL] Comment créer une sous catégorie dans mon site ?
    Par plex dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 18/08/2006, 09h59

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