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 :

prefix locale dans toutes les url


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    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é
    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 du Club
    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é
    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 du Club
    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 du Club
    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é
    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 du Club
    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 !!!