This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
Go to file
Nicolas Grekas b2fafc6a0f feature #26143 [Routing] Implement i18n routing (frankdejonge, nicolas-grekas)
This PR was merged into the 4.1-dev branch.

Discussion
----------

[Routing]  Implement i18n routing

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      |no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | N/A
| License       | MIT

This PR introduces support for I18N routing into core. This is a port from a bundle I've made recently, now merged into the default implementation. While it's ok to have this as a bundle, it was suggested by @nicolas-grekas to create a PR for this so it can be included into the core.

## New usages

### YAML

```yaml
contact:
    controller: ContactController::formAction
    path:
        en: /send-us-an-email
        nl: /stuur-ons-een-email
```

Will be effectively the same as declaring:

```yaml
contact.en:
    controller: ContactController::formAction
    path: /send-us-an-email
    defaults:
        _locale: en

contact.nl:
    controller: ContactController::formAction
    path: /stuur-ons-een-email
    defaults:
        _locale: nl
```

### Annotation usage:

```php
<?php

use Symfony\Component\Routing\Annotation\Route;

class ContactController
{
    /**
     * @Route({"en": "/send-us-an-email", "nl": "/stuur-ons-een-email"}, name="contact")
     */
    public function formAction()
    {

    }
}

/**
 * @Route("/contact")
 */
class PrefixedContactController
{
    /**
     * @Route({"en": "/send-us-an-email", "nl": "/stuur-ons-een-email"}, name="contact")
     */
    public function formAction()
    {

    }
}
```

### Route generation

```php
<?php
/** @var UrlGeneratorInterface $urlGenerator */
$urlWithCurrentLocale = $urlGenerator->generate('contact');
$urlWithSpecifiedLocale = $urlGenerator->generate('contact', ['_locale' => 'nl']);
```

Route generation is based on your request locale. When not available it falls back on a configured default. This way of route generation means you have a "route locale switcher" out of the box, but generate the current route with another locale for most cases.

## Advantages

Having i18n routes defined like this has some advantages:

* Less error prone.
* No need to keep `requirements` or `defaults` in sync with other definitions.
* No need to `{_locale}` in the path (bad for route matching performance).
* Better developer experience.

### Next steps

I've ported all the things the bundle supported, before moving on I'd like to discuss this first in order not to waste our collective time. This initial PR should give a clear enough picture to see what/how/why this is done.

If and when accepted I/we can move forward to implement the XML loader and @nicolas-grekas mentioned there should be a `Configurator` implemented for this as well. He opted to help with this (for which I'm very thankful).

- [x] Yaml Loader
- [x] Annotation Loader
- [x] XML Loader
- [x] PHP Loader?
- [ ] Documentation

Commits
-------

4ae66dc [Routing] Handle "_canonical_route"
e32c414 [Routing] Implement i18n routing
2018-03-19 09:25:11 +01:00
.composer Drop hirak/prestissimo 2016-05-12 07:44:15 -05:00
.github Another PR template tweak 2018-02-20 16:46:06 +01:00
src/Symfony feature #26143 [Routing] Implement i18n routing (frankdejonge, nicolas-grekas) 2018-03-19 09:25:11 +01:00
.editorconfig Add EditorConfig File 2012-06-16 14:08:15 +02:00
.gitignore Add appveyor.yml for C.I. on Windows 2015-08-25 23:41:37 +02:00
.php_cs.dist Merge branch '2.8' into 3.3 2018-01-03 18:13:53 +01:00
.travis.yml Merge branch '3.4' into 4.0 2018-02-22 15:57:28 +01:00
appveyor.yml Merge branch '2.7' into 2.8 2018-02-26 16:33:21 +01:00
CHANGELOG-4.0.md updated CHANGELOG for 4.0.5 2018-03-01 11:48:25 -08:00
composer.json Merge branch '2.7' into 2.8 2018-01-21 20:03:25 +01:00
CONTRIBUTING.md Mention the community review guide 2016-12-18 22:02:35 +01:00
CONTRIBUTORS.md update CONTRIBUTORS for 2.7.42 2018-02-28 14:53:19 -08:00
LICENSE fixed years in copyright 2018-01-03 08:23:28 +01:00
link Update Repository Symlink Helper 2018-02-11 12:15:02 +01:00
phpunit Force phpunit-bridge update (bis) 2017-11-22 10:25:38 +01:00
phpunit.xml.dist Merge branch '3.2' 2017-04-12 07:14:56 -07:00
README.md Prefer composer install instead for using Symfony Installer 2018-01-10 18:56:50 +01:00
UPGRADE-4.0.md Add entry for container.dumper.inline_class_loader param at UPGRADE-3.4.md and UPGRADE-4.0.md 2018-03-01 21:43:47 -03:00
UPGRADE-4.1.md feature #26564 [HttpFoundation] deprecate call to Request::getSession() when Request::hasSession() returns false (fmata) 2018-03-18 20:19:04 +01:00
UPGRADE-5.0.md feature #26564 [HttpFoundation] deprecate call to Request::getSession() when Request::hasSession() returns false (fmata) 2018-03-18 20:19:04 +01:00

Symfony is a PHP framework for web applications and a set of reusable PHP components. Symfony is used by thousands of web applications (including BlaBlaCar.com and Spotify.com) and most of the popular PHP projects (including Drupal and Magento).

Installation

Documentation

Community

Contributing

Symfony is an Open Source, community-driven project with thousands of contributors. Join them contributing code or contributing documentation.

Security Issues

If you discover a security vulnerability within Symfony, please follow our disclosure procedure.

About Us

Symfony development is sponsored by SensioLabs, led by the Symfony Core Team and supported by Symfony contributors.