Roteamento Internacionalizado no Symfony 4.1

Andréia Bohner
2 min readMar 20, 2018

--

Recentemente, o desempenho do componente de Roteamento (Routing) foi melhorado para torná-lo o componente PHP de rotas mais rápido disponível. Agora, a tempo de incluí-lo no Symfony 4.1, foi adicionado outro recurso incrível: suporte para rotas internacionalizadas.

Esse recurso permite definir caminhos diferentes para cada rota dependendo da localidade do usuário. Isso é essencial para aplicações internacionalizadas e é por isso que bundles de terceiros, como o JMSI18nRoutingBundle, têm milhões em downloads. No Symfony 4.1, esse recurso foi integrado no próprio componente de roteamento para que você possa usá-lo prontamente nas aplicações Symfony.

Na prática, ao definir uma rota, agora você pode fornecer um array na opção path para definir um caminho diferente por localidade:

contact:
controller: App\Controller\ContactController::send
path:
en: /send-us-an-email
nl: /stuur-ons-een-email

Este formato também é suportado para rotas definidas em XML e anotações PHP:

use Symfony\Component\Routing\Annotation\Route;

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

Internamente, o Symfony cria uma rota por localidade (chamadas contact.en e contact.nl nesse exemplo), mas você ainda pode usar o nome da rota original para gerar URLs. Ao gerar uma URL, a localidade da requisição é usada por padrão, mas é possível passar a localidade explicitamente para gerar qualquer das URLs alternativas:

/** @var UrlGeneratorInterface $urlGenerator */
// uses the current request locale
$url = $urlGenerator->generate('contact');

// ignores the current request locale and generates '/stuur-ons-een-email'
$url = $urlGenerator->generate('contact', ['_locale' => 'nl']);
// this would also work, but it's not recommended:
// $url = $urlGenerator->generate('contact.nl');

O prefixo de rota também pode ser traduzido (ambos em arquivos YAML/XML e anotações @Route definidas no nível da classe do controlador) e você também pode misturar caminhos traduzidos e não traduzidos:

# config/routes/annotations.yaml
site:
resource: '../src/Controller/'
type: annotation
prefix:
en: '/site'
es: '/sitio'
class DefaultController extends Controller
{
/**
* @Route({"en": "/contact", "es": "/contacto"}, name="contact")
*/
public function contact()
{
// ...
}

/**
* @Route("/page/{slug}", name="page")
*/
public function page($slug)
{
// ...
}
}

As quatro rotas resultantes geradas pelo Symfony serão:

Tradução de: New in Symfony 4.1: Internationalized routing

--

--