Roteamento Internacionalizado no Symfony 4.1
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