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

Discussion :

prefix locale dans toutes les url [4.x]


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 40
    Points : 24
    Points
    24
    Par défaut prefix locale dans toutes les url
    Bonjour à tous,

    J'ai un projet en Symfony 3.4.29 qui marche bien, et je le migre vers Symfony 4.3.2

    J'ai un problème pour préfixer toutes mes routes par _locale

    J'ai le message
    No route found for "GET /fr/visit"
    avec l'url : index.php/fr/visit

    Mais l'url index.php/visit m'affiche bien ma page, en anglais. Donc la définition de mon préfixe n'est pas prise en compte.

    Dans toutes les docs que je trouve sur le web, ça devrait directement marcher, mais ça fait des jours que je ne trouve pas !

    Ai je oublié un paramètre quelque part pour que ça prenne en compte mon annotation ?
    Sinon vous avez des idées ?

    Voici des extraits de mon code :

    route.yaml

    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    index:
        path:     /visit
        defaults: 
            _controller: App\Controller\VisitController::visit_accueil
        requirements:
            _locale: '%app_locales%'

    annotations.yaml

    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    controllers:
        resource: ../../src/Controller/
        type: annotation
        prefix:   /{_locale}
        requirements:
            _locale: '%app_locales%'
        defaults:
            _locale: '%locale%'

    services.yaml

    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    parameters:
        locale: fr
        app_locales: fr|en|

    Merci d'avance pour votre aide !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2012
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2012
    Messages : 533
    Points : 935
    Points
    935
    Par défaut
    Bonjour,
    No route found for "GET /fr/visit"
    dans le routing de cette action tu n'as pas défini de préfixe. Il suffit de faire précéder visit par {_locale} comme suit:
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    index:
        path:     /{_locale}/visit  
        defaults: 
            _controller: App\Controller\VisitController::visit_accueil
            _locale: '%locale%' 
        requirements:
            _locale: '%app_locales%'

    dans annotations.yaml
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #annotations.yaml
    controllers:
        resource: ../../src/Controller/
        type: annotation
        prefix:   /{_locale}
        requirements:
            _locale: '%app_locales%'
        defaults:
            _locale: '%locale%'

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 40
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Merci beaucoup pour tes indications

    Là, je ne suis pas chez moi, je n'ai pas mon projet sous la main, je ne peux pas essayer.
    Je suis d'accord sur ce que tu dis, ça devrait marcher, j'essaie dès que je peux...

    Mais je veux le préfixe {_locale} pour toutes mes routes, sans avoir à le préciser pour chaque route.
    D'après ce que j'ai compris, mon annotation prefix dans le fichier annotations.yaml devrait suffire.
    Mais ça ne marche pas !

    C'est moi qui ai mal compris, il faut ajouter {_locale} dans chaque route ?
    Ou il y a un moyen de définir quelque part mon prefix pour toutes les routes ?

    Merci d'avance !

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2012
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2012
    Messages : 533
    Points : 935
    Points
    935
    Par défaut
    Indépendamment de l'internalisation tu exposes 2 types de routing différents: un routing par configuration via le fichier routes.yaml et un autre par annotation avec annotations.yaml.
    Dans le 1er cas, routage par configuration, qui comporte qu'une seule route laquelle route appelle l'action visit_accueil. Si tu souhaites préfixer le chemin de l'url menant à l'action visit_accueil il te faut alors déclarer la _locale dans le paramètre de la route path: /{_locale}/visit. En fait c'est {_locale} qui permet de modifier dynamiquement la langue depuis l'url et doit être présente sur n'importe quelle route que tu déclares.

    Dans le second cas, routage par annotation, tu as préfixé les ressources (resource: '../src/Controller/') par la {_locale}. N'importe quel contrôleur situé dans le dossier src/Controller/ est déjà préfixé inutile d'en rajouter dans les contrôleurs sauf si tu souhaites avoir des urls spécifiques pour chaque langues.

    tu peux récupérer le projet Symfony demo sur github et t'en inspirer.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 40
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup pour ta réponse et tes explications

    En effet, je mélangeais les routes et les annotations.
    Je n'ai pas besoin de préfixer mes contrôleurs, j'ai donc ajouté dans toutes mes routes le préfixe /{_locale} et ça marche nickel !

    Et merci pour l'idée d'aller voir la démo de Symfony sur Github, je n'y pense jamais Il va falloir que je prenne ce réflexe !

    Merci encore !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 40
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Je reviens sur mon problème pour comprendre comment ça marche...

    Ok, en SF4, j'ai préfixé toutes mes routes (dans le fichier config/routes.yaml) par /{_locale} et ça marche bien.

    Mais en SF3, je n'avais pas ce préfixe dans mon fichier des routes (src/monprojetBundle/Resources/config/routing.yml).
    Et j'avais le code suivant dans : app/config/routing.yml

    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    monprojet:
        resource: "@monprojetBundle/Resources/config/routing.yml"
        prefix:   /{_locale}
        requirements:
            _locale: fr|en|
        defaults: { _locale: fr}

    Est ce possible de faire l'équivalent sous SF4 ?

    J'ai essayé sous SF4 en mettant dans le champ resource la valeur : "@config/routes.yaml" (dans le fichier config/routes/annotations.yaml).

    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    routes:
        resource: "@config/routes.yaml"
        type: annotation
        prefix: /{_locale}
        requirements:
            _locale: '%app_locales%'
        defaults:
            _locale: '%locale%'

    Mais ça ne marche pas, j'ai le message d'erreur suivant :

    An exception has been thrown during the rendering of a template ("Bundle "config" does not exist or it is not enabled. Maybe you forgot to add it in the registerBundles() method of your App\Kernel.php file? in @config/routes.yaml (which is being imported from "/home/moi/wwwroot/monprojet_v4/config/routes/annotations.yaml"). Make sure the "config" bundle is correctly registered and loaded in the application kernel class. If the bundle is registered, make sure the bundle path "@config/routes.yaml" is not empty.").
    Cette possibilité de préfixer les routes a été perdue au passage vers SF4, ou il me manque quelque chose ?

    Merci d'avance pour votre aide !

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2012
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2012
    Messages : 533
    Points : 935
    Points
    935
    Par défaut
    en remontant ton poste initial il manque la clé controller. Par exemple pour la page d'accueil il fallait indiquer le contrôleur associé à la route.
    Code yaml : 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
    #config/routes.yaml
     
    index:
        path:     /{_locale}/visit
        controller: App\Controller\VisitController::visit_accueil # <-- il manquait ce contrôleur
        defaults:
            _locale: '%locale%'
        requirements:
            _locale: '%app_locales%'
     
     
     
    #annotations.yaml
    controllers:
        resource: '../src/Controller/'
        type: annotation
        prefix:   /{_locale}
        requirements:
            _locale: '%app_locales%'
        defaults:
            _locale: '%locale%'
    Est ce possible de faire l'équivalent sous SF4 ?

    J'ai essayé sous SF4 en mettant dans le champ resource la valeur : "@config/routes.yaml" (dans le fichier config/routes/annotations.yaml).
    ton routage en SF3 indique que toutes les routes déclarées dans le bundle @monprojetBundle doivent avoir un préfixe en fr, en. Il est possible d'ajouter un préfixe à un ensemble de ressources(controller, fichier yaml). Pour ce faire il faut envisager 2 cas: routage par annotation et routage par configuration.

    - routage par config
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #config/routes.yaml
     
    #toutes les routes du fichier routes/front_end.yaml auront pour préfixe _locale(fr,en,es)
    front:
        resource: 'routes/front_end.yaml'
        prefix:   /{_locale}
     
    #les routes du fichier routes/api.yaml auront pour préfixe v1
    api_users:
        resource: 'routes/api.yaml'
        prefix: /v1

    puis dans le fichier routes/front_end.yaml
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #config/routes/front_end.yaml
    blog_list:
        # Matches /fr/blog or /en/blog 
        path:     /blog
        controller: App\Controller\BlogController::list
     
    blog_show:
        # Matches /fr/blog/* or /en/blog/*
        path:     /blog/{slug}
        controller: App\Controller\BlogController::show
    - Le routage par annotation est optionnel. si tu n'utilises pas les annotations dans tes contrôleurs alors le fichier annotations.yaml n'aura aucun effet sur tes routes et dans ce cas tu peux même supprimer tout simplement le package sensio/framework-extra-bundle .
    au niveau de ton projet SF3 utilises-tu des annotations dans les contrôleurs pour faire du routage?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 40
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup pour tes explications et les exemples de code !

    J’ai vérifié mon projet sous SF3, voilà ce que j’ai dans routing.yml :

    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    monprojet:
        resource: "@monprojetBundle/Resources/config/routing.yml"
        prefix:   /{_locale}
        requirements:
            _locale: fr|en|
        defaults: { _locale: fr}
     
    app:
        resource: '@AppBundle/Controller/'
        type: annotation

    Et ça marchait ! Donc je suppose que c’est suffisant pour définir la clé controller…

    Sous SF4, je viens de faire un routage par configuration comme tu expliques, ce qui est le plus simple pour mon projet, car je n’utilise pas les annotations dans les contrôleurs pour faire du routage.

    Et ça y est, c’est propre et ça marche nickel ! Merci encore !

    Et je passe mon sujet en résolu !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/07/2006, 09h44
  2. [VBA-E] Supprimer le cont de cellules dans toutes les feuill
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/03/2006, 09h44
  3. bizarerie dans toutes les requetes
    Par zais_ethael dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/03/2006, 21h28
  4. Comment MAJ le même champ présent dans toutes les tables ?
    Par PamelaGeek dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/02/2006, 14h06

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