Новое в Symfony 3.2: Поддержка Unicode в маршрутах

В Symfony 3.2, в компонент маршрутизации была добавлена поддержка UTF-8 символов в маршрутах. Благодаря этой новой опции, вы можете устанавливать и генерировать маршруты, содержащие UTF-8 символы

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

/**
 * @Route(
 *     "/category/{name}",
 *     "requirements" = { "name": ".+" },
 *     "options" = { "utf8": true }
 * )
 */
public function categoryAction($name)
{
    // ...
}

В этом маршруте, значение опции utf8 устанавливается как true, что позволяет Symfony рассматривать символ «.», как любой UTF-8 символ ( не только однобайтовый), поэтому следующие URL-адреса будут соответствовать этому маршруту: /category/日本語, /category/فارسی, /category/한국어 и т.д. Например, этот вариант также позволяет использовать в качестве URL смайлики.

В Symfony 3.2 нет необходимости устанавливать опцию utf8 специально. Как только Symfony находит символ UTF-8 в настройках маршрута, он будет автоматически включать поддержку в UTF-8:

/**
 * 'utf8' is set to 'true' automatically because of the
 * contents of the 'name'  requirements:
 *
 * @Route(
 *     "/category/{name}",
 *     "requirements" = { "name": "日本語|فارسی" }
 * )
 */
public function categoryAction($name)
{
    // ...
}

Однако, если взять себе за правило делать так постоянно, то в дальнейшем это может оказаться устаревшим, и может приводить к LogicException в Symfony 4.0. Поэтому, не забудьте определить опцию utf8 в явном виде, для любого маршрута, который может понадобиться.

В дополнение к UTF-8 символам, компонент маршрутизации также поддерживает все свойства PCRE Unicode, являющиеся управляющими последовательностями, которые соответствуют некоторым общим символьным типам. Например, \p{Lu} соответствует любой символ верхнего регистра на любом языке, \p{Greek} соответствует любой греческий символ, \P{Han} соответствует любому символу, не включенных в китайский Хань и т.д.

Источник: https://symfony.com/blog/new-in-symfony-3-2-unicode-routing-support

Добавить комментарий

Ваш адрес email не будет опубликован.

двадцать + девять =