не устанавливает _locale FOSUserBundle Symfony 3 - PullRequest
0 голосов
/ 06 июня 2018

Я использую Symfony 3 и использую FOSUserBundle.

Я хочу автоматически перенаправлять, когда у меня нет _locale в URL

, например

http://127.0.0.1:8000/

это 404

http://127.0.0.1:8000/en все в порядке

Я хотел бы иметь en, как по умолчанию.

my conf.yml

parameters:
    locale: en

framework:
    #esi: ~
    translator: ~ #default
    secret: '%secret%'

myroutes:

  fos_user_security_login             GET|POST   ANY      ANY    /{_locale}/login
  fos_user_security_check             POST       ANY      ANY    /{_locale}/login_check
  fos_user_security_logout            GET|POST   ANY      ANY    /{_locale}/logout
  fos_user_profile_show               GET        ANY      ANY    /{_locale}/profile/
  fos_user_profile_edit               GET|POST   ANY      ANY    /{_locale}/profile/edit
  fos_user_registration_register      GET|POST   ANY      ANY    /{_locale}/register/
  fos_user_registration_check_email   GET        ANY      ANY    /{_locale}/register/check-email
  fos_user_registration_confirm       GET        ANY      ANY    /{_locale}/register/confirm/{token}
  fos_user_registration_confirmed     GET        ANY      ANY    /{_locale}/register/confirmed
  fos_user_resetting_request          GET        ANY      ANY    /{_locale}/resetting/request
  fos_user_resetting_send_email       POST       ANY      ANY    /{_locale}/resetting/send-email
  fos_user_resetting_check_email      GET        ANY      ANY    /{_locale}/resetting/check-email
  fos_user_resetting_reset            GET|POST   ANY      ANY    /{_locale}/resetting/reset/{token}
  fos_user_change_password            GET|POST   ANY      ANY    /{_locale}/profile/change-password

homepage ANY ANY ANY / {_ locale} /

Даже когда я выхожу из системы с помощью

<a class="btn btn-primary" href="{{ path('fos_user_security_logout') }}">Logout</a>

Iпроизошла ошибка, потому что мое перенаправление включено / login

my security.yml

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_token_generator: security.csrf.token_manager

            logout:
                path: fos_user_security_logout
                target: /
            anonymous:    true
            remember_me:
                secret: '%secret%'

    access_control:
        - { path: ^/[a-z]+/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/[a-z]+/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/[a-z]+/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

1 Ответ

0 голосов
/ 07 июня 2018

Добавьте это в начале вашей конфигурации маршрутизации (/app/config/routing.yml):

# Redirecting the root ("/" to the homepage)
root:
    path: /
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: homepage
        permanent: true

Затем в контроллере вашей домашней страницы убедитесь, что ваш маршрут включает в себя параметр _locale:

<?php
// src/AppBundle/Controller/Homepage/HomepageController.php

namespace AppBundle\Controller\Homepage;

class HomepageController extends Controller
{
    /**
     * @Route("/{_locale}",
     *          name="homepage",
     *          requirements={
     *              "_locale": "%app.locales%"
     *          }
     * )
     * @Method({"GET", "POST"})
     */
    public function homepageAction(Request $request)
    {
        // your code here
    }
}

О FOSUserBundle, вы должны добавить префикс в конфигурации маршрутизации.Я предполагаю, что вы уже переопределили FOSUserBundle своим собственным UserBundle, это будет в файле /src/UserBundle/Resources/config/routing/all.yml.Затем вы можете выбрать, будете ли вы использовать маршрутизацию FOSUserBundle по умолчанию или свою собственную маршрутизацию.

# Security
fos_user_security:

    # FOSUserBundle default security routes
    #resource: "@FOSUserBundle/Resources/config/routing/security.xml"

    # UserBundle custom security routes
    resource: "@UserBundle/Resources/config/routing/security.yml"

    prefix: /{_locale}
    requirements:
        _locale: '%app.locales%'

# Profile
fos_user_profile:

    # FOSUserBundle default profile routes
    #resource: "@FOSUserBundle/Resources/config/routing/profile.xml"

    # UserBundle custom profile routes
    resource: "@UserBundle/Resources/config/routing/profile.yml"

    prefix: /{_locale}/profile
    requirements:
        _locale: '%app.locales%'

# Registration
fos_user_register:

    # FOSUserBundle default registration routes
    resource: "@FOSUserBundle/Resources/config/routing/registration.xml"

    # UserBundle custom registration routes
    #resource: "@UserBundle/Resources/config/routing/registration.yml"

    prefix: /{_locale}/register
    requirements:
        _locale: '%app.locales%'

# Resetting Password
fos_user_resetting:

    # FOSUserBundle default resetting routes
    #resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"

    # UserBundle custom resetting routes
    resource: "@UserBundle/Resources/config/routing/resetting.yml"

    prefix: /{_locale}/resetting
    requirements:
        _locale: '%app.locales%'

И, конечно, я забыл упомянуть, что вам нужно указать параметр app.locales в вашей конфигурации (/app/config/config.yml):

parameters:
    # Locale authorized for routing
    app.locales : en|fr|es
...