Новое в Symfony 5.0: Cтроковый компонент

Symfony 5.0 был выпущен 21 ноября 2019 года. В отличие от Symfony 4.0, он не меняет структуру каталогов полностью и не добавляет какой-либо принципиально новый способ разработки. Вместо этого Symfony 5 опирается на плечи Symfony 4 и предоставляет новые функции, облегчающие жизнь.

Согласно процессу выпуска Symfony, в Symfony 5.0 есть все новые функции, представленные в Symfony 4.4. Ознакомьтесь с новостями из серии Symfony 4.4, чтобы узнать обо всех этих замечательных функциях. Кроме того, Symfony 5.0 добавляет некоторые эксклюзивные функции, которые недоступны в Symfony 4.4. В этом блоге представлена одна из этих функций: новый компонент String.

Работать со строками сложно

Для таких языков, как английский, требуется очень ограниченный набор символов и символов для отображения любого содержимого. Тем не менее, другие языки требуют тысячи символов для отображения своего содержимого. Им нужны сложные стандарты кодирования, такие как Unicode, и вам приходится иметь дело с «кодовыми точками», «кластерами графем» и «байтами». Прочитайте документацию по компоненту String для ознакомления с этими терминами.

Компонент String абстрагирует эту сложность и предоставляет три простых класса для создания любых строк в соответствии с вашими потребностями:

use Symfony\Component\String\ByteString;
use Symfony\Component\String\CodePointString;
use Symfony\Component\String\UnicodeString;

$content = new CodePointString('Hello world');
$content = new UnicodeString('नमस्ते दुनिया');
$content = new ByteString('さよなら');

$content = (new CodePointString('hello'))->toUnicodeString();
$content = UnicodeString::fromCodePoints(0x68, 0x65, 0x6C, 0x6C, 0x6F)->toByteString();

Компонент также предоставляет некоторые функции быстрого доступа для быстрого создания строк:

use function Symfony\Component\String\b;
use function Symfony\Component\String\u;

// both are equivalent
$content = b('hello');
$content = new ByteString('hello');

// both are equivalent
$content = u('hello');
$content = new UnicodeString('hello');

Объектно-ориентированные строки

Создание строк – это только первый шаг. Этот компонент также предоставляет тщательно разработанный API для работы со строками объектно–ориентированным способом. Этот API может сделать ваш код намного более читабельным. Посмотрите, например, как проверить, заканчивается ли строка другой подстрокой:

// using PHP functions
if ('.html' === substr($theString, -strlen('.html'))) {
    // ...
}

// using Symfony's String
if (u($theString)->endsWith('.html')) {
    // ...
}

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

$text =u('This is a déjà-vu situation.')
    ->trimEnd('.')
    ->replace('déjà-vu', 'jamais-vu')
    ->append('!');
// $text = 'This is a jamais-vu situation!'

Если вы регулярно работаете со строками, компонент String – это воплощение вашей мечты. Компонент предоставляет десятки методов для решения всех ваших задач, связанных с поиском строк, заменой, добавлением, предварительным заполнением, заполнением, обрезкой, разделением, усечением и т. Д.

Некоторые из этих методов решают удивительно сложные проблемы. Представьте, что ваше приложение поддерживает разные языки, и вам нужно сравнивать без учета регистра. Применение strtolower() или mb_strtolower() перед выполнением сравнения не будет работать для некоторых языков. Почему? Поскольку языки определяют три регистра (нижний, верхний, заголовок), некоторые символы не имеют регистра, регистр зависит от языка и локали и т. д.

Symfony абстрагирует эту невероятную сложность в единый метод, называемый folded(), который всегда возвращает правильное значение для сравнения без учета регистра:

u('FOO Bar')->folded();             // 'foo bar'
u('Die O\'Brian Straße')->folded(); // "die o'brian strasse"

Найдите минутку, чтобы проверить ссылку на метод компонента String, и вы захотите сразу начать использовать его в своих проектах!

Струнный слаггер

Слаггеры являются популярной потребностью во многих приложениях. Они берут любую строку и преобразуют ее в другую строку, которую можно безопасно использовать в местах, где разрешены не все символы Юникода (URL-адреса, имена файлов или каталогов и т. д.)

Компонент String включает в себя AsciiSlugger(), который преобразует и транслитерирует любую строку в другую строку только для ASCII:

use Symfony\Component\String\Slugger\AsciiSlugger;

$slugger = new AsciiSlugger();
$slugger->slug('Стойността трябва', 'bg');  // 'Stoinostta-tryabva'
$slugger->slug('Αυτή η τιμή πρέπει', 'el'); // 'Avti-i-timi-prepi'
$slugger->slug('该变量的值应为', 'zh');       // 'gai-bian-liang-de-zhi-ying-wei'
$slugger->slug('Wôrķšƥáçè sèťtïñğš');       // 'Workspace-settings'

Этот слаггер обеспечивает бесшовную интеграцию с платформой Symfony, поэтому вы можете автоматически связать его со своими службами, автоматически определить текущую локаль и т. д.

Интеграция с шаблонизатором Twig

Иногда вам нужно обрабатывать строки в шаблонах тоже. Вот почему Twig 2.12.1 добавил новый фильтр с именем u, который упаковывает данное содержимое в класс UnicodeString, чтобы вы имели доступ ко всем методам String:

{{ 'Lorem ipsum'|u.truncate(8, '...') }}
{# prints: Lorem... #}

{{ 'SymfonyStringWithTwig'|u.snake }}
{# prints: symfony_string_with_twig #}

Этот фильтр является частью StringExtension, который не установлен по умолчанию. Сначала установите его с помощью composer require twig/string-extra и прочитайте документацию по фильтру “u.

Совместимость строковых компонентов

Компонент String был представлен как экспериментальная функция Symfony в Symfony 5.0. Это означает, что он достаточно стабилен, чтобы использовать его в работе, но его публичный API может немного измениться, прежде чем заморозить его в Symfony 5.1.

Экспериментальные функции не могут быть представлены в долгосрочной версии поддержки. Вот почему он был представлен в Symfony 5.0 вместо Symfony 4.4. В любом случае вам не нужно обновляться до Symfony 5, чтобы использовать этот компонент. Компонент String готов к использованию в любом приложении PHP 7.2.5 или более поздней версии.