2016-12-04 3 views
1

У меня проблема с маршрутизацией для локалей.Symfony3 автоматическая маршрутизация локалей

www.example.com/ -> не работает (ни одного маршрута не найдено для "GET /")

www.example.com/en/ -> работает

В моем случае это должно тоже самое. Английский язык по умолчанию, и я хочу показывать страницу на английском языке, если вызывается www.example.com. Я всегда получаю сообщение об ошибке (маршрут не найден для «GET /»), когда я вызываю страницу без языкового стандарта.

routing.yml

app: 
resource: "@AppBundle/Controller/" 
type: annotation 
prefix: /{_locale} 

config.yml

imports: 
 
    - { resource: parameters.yml } 
 
    - { resource: security.yml } 
 
    - { resource: services.yml } 
 

 
# Put parameters here that don't need to change on each machine where the app is deployed 
 
# http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration 
 
parameters: 
 
    locale: en 
 

 
framework: 
 
    #esi:    ~ 
 
    translator:  { fallbacks: ["%locale%"] } 
 
    secret:   "%secret%" 
 
    router: 
 
     resource: "%kernel.root_dir%/config/routing.yml" 
 
     strict_requirements: ~ 
 
    form:   ~ 
 
    csrf_protection: ~ 
 
    validation:  { enable_annotations: true } 
 
    #serializer:  { enable_annotations: true } 
 
    templating: 
 
     engines: ['twig'] 
 
    default_locale: "%locale%" 
 
    trusted_hosts: ~ 
 
    trusted_proxies: ~ 
 
    session: 
 
     # http://symfony.com/doc/current/reference/configuration/framework.html#handler-id 
 
     handler_id: session.handler.native_file 
 
     save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%" 
 
    fragments:  ~ 
 
    http_method_override: true 
 
    assets: ~ 
 

 
# Twig Configuration 
 
twig: 
 
    debug:   "%kernel.debug%" 
 
    strict_variables: "%kernel.debug%" 
 

 
# Doctrine Configuration 
 
doctrine: 
 
    dbal: 
 
     driver: pdo_mysql 
 
     host:  "%database_host%" 
 
     port:  "%database_port%" 
 
     dbname: "%database_name%" 
 
     user:  "%database_user%" 
 
     password: "%database_password%" 
 
     charset: UTF8 
 
     # if using pdo_sqlite as your database driver: 
 
     # 1. add the path in parameters.yml 
 
     #  e.g. database_path: "%kernel.root_dir%/data/data.db3" 
 
     # 2. Uncomment database_path in parameters.yml.dist 
 
     # 3. Uncomment next line: 
 
     #  path:  "%database_path%" 
 

 
    orm: 
 
     auto_generate_proxy_classes: "%kernel.debug%" 
 
     naming_strategy: doctrine.orm.naming_strategy.underscore 
 
     auto_mapping: true 
 

 
# Swiftmailer Configuration 
 
swiftmailer: 
 
    transport: "%mailer_transport%" 
 
    host:  "%mailer_host%" 
 
    username: "%mailer_user%" 
 
    password: "%mailer_password%" 
 
    spool:  { type: memory }

DefaultController.php

<?php 
 

 
namespace AppBundle\Controller; 
 

 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
 
use Symfony\Component\HttpFoundation\Request; 
 

 
use AppBundle\Entity\Page; 
 

 
class DefaultController extends Controller 
 
{ 
 
    /** 
 
    * @Route("/", name="homepage") 
 
    */ 
 
    public function indexAction(Request $request) 
 
    { 
 
     // replace this example code with whatever you need 
 
     return $this->render('default/index.html.twig', [ 
 
      'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR, 
 
     ]); 
 
    } 
 

 

 
}

Это работает, но это не сексуально

class DefaultController extends Controller 
 
{ 
 
    /** 
 
    * @Route("/", name="homepage") 
 
    * @Route("/{_locale}/", name="homepage_locale") 
 
    */ 
 
    public function indexAction(Request $request) 
 
    { 
 
     // replace this example code with whatever you need 
 
     return $this->render('default/index.html.twig', [ 
 
      'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR, 
 
     ]); 
 
    }

+0

добавить именно то, что вы хотите, это не ясно – Blag

ответ

1

JMSI18nRoutingBundle

Чтобы добиться того, что вы хотите, я когда-то JMSI18nRoutingBundle. Он позволяет вам переводить маршруты для каждого языкового стандарта, а также управлять вашим префиксом по URL-адресу.

Пример конфигурации YAML:

jms_i18n_routing: 
    default_locale: en 
    locales: [de, en] 
    strategy: prefix_except_default 

Тогда ваши адреса будут выглядеть следующим образом:

- /de/contact # Locale: de 
- /contact # Locale: en 

Или, если вы определили перевод маршрутов (оба URL, по-прежнему указывают на то же место!):

- /de/kontakt # Locale: de 
- /contact # Locale: en 

There больше информации о том, как настроить булочка dle, как вы можете расширить его.

Symfony путь

В routing.yml файле вы должны определить маршруты:

app.locale: 
    resource: "@AppBundle/Controller/" 
    type: annotation 
    prefix: /{_locale} 
app: 
    resource: "@AppBundle/Controller/" 
    type: annotation 

Затем Symfony первый ищет маршрут с локалью. Важно помнить, что маршруты от api.locale являются первыми в соответствующем шаблоне, тогда, когда у вас будет маршрут с именем example.com/go (например, GO, чтобы хранить, но сокращать), тогда Symfony попытается найти локаль go.Чтобы предотвратить это, вы можете использовать requirements параметр:

app.locale: 
    resource: "@AppBundle/Controller/" 
    type: annotation 
    prefix: /{_locale} 
    requirements: 
     _locale: en|de 

Это не сухой способ, вам нужно определить любой маршрут дважды (с и без локализации).

Использование defaults в настройке маршрута не помогает, поскольку Symfony Routing добавляет любые параметры, если это необходимо. С defaults пути example.com должен работает, но если вы идете в example.com/about, Symfony добавляет параметр _locale в URI и результат будет example.com/en/about

[EDIT] Важно, что также, как работает маршрутизация Symfony в. У нас есть первый маршрут app.locale с префиксом /{_locale} и вторым homepage с путём /. Сводный путь будет example.com/{_locale}/, а не example.com/{_locale}. Конечная косая черта важна для создания URI.

Без этого пути example.com/de ищет маршрут в app и не может найти ничего похожего на de.

Там вы, вероятно, решение лидирующий слэш: Redirect URLs with a Trailing Slash

Смежные вопросы