Введение
При разработки веб-сайтов и приложений, довольно часто возникает необходимость динамического формирование строк контента. Решается это по разному, кто то использует str_replace(), кто то делает поиск и замену с помощью регулярок, а кто то использует другие способы.
Вот, например, несколько таких задач:
- Генерация названий сущностей на сайте при их сохранении в БД (имя статьи, название категории)
- Генерация и вывод СЕО метатегов на страницах
- Шаблоны email писем и других типов уведомлений
- Генерация url-путей, слагов
- Динамическая генерация и вывод другого контента по заданному шаблону
В известных CMS, эти задачи решаются с использованиям так называемых токенов (Drupal) или шорткодов (WordPress) или "жетонов".
Однозначного определения "токена" нет. Мы же это определим так:
Токены (шорткоды) — это специальные конструкции, фрагменты в текстовых строках, "контейнер с данными", которые после обработки, автоматически заменяются на нужный нам текст.
Решение
Для работы с токенами в Laravel, мы будем использовать следующий пакет laravel-str-tokens
Чтобы его применять в нашем проекте, будем использовать фасад StrToken.
Установка и настройка пакета очень проста, описана в документации на github.
Рассмотрим, для начала, пример: нам нужно сохранить статью в БД. Название статьи должно содержать само имя статьи, имя автора и текущая дата. Допустим, имя статьи пользователь задает вручную, а система с помощью токенов добавляет к этому имени, имя автора и дату. Зададим шаблон и сформируем строку с нужным полным названием статьи:
public function store(Request $request)
{
$name = StrToken::setText($request->name . '[user:name]-[date:short]')
->setDate(\Carbon\Carbon::now())
->setEntity(Auth::user())
->replace();
// сохраняем статью с $name в БД
}
В нашей строке есть конструкция [user:name]-[date:date] — это и есть наши токены — подстроки, обернутые в квадратные скобки “[ ]”. Сущность (обьект, модель) и его поле (метод, параметр) разделяются двоеточием “:”
[user:name] — user — имя Eloquent модели, name — поле этой модели
[date:short] — date — объект даты Carbon, short — это формат даты
Фасад StrToken имеет следующие методы:
- setText(string) — принимает строку, в которой нужно найти и заменить токены
- setDate(Carbon) — принимает объект даты Carbon. При использовании мы пишем токен выда [date:short], [date:time], [date:date]… — шаблон результата можно задать в конфигурационном файле пакета
- setEntity(Eloquent) — принимает объект модели Eloquent. При использовании название класса модели и название первой части токена должны совпадать, например Article & [article:name]
- setEntities(array) — аналогично как setEntity, только уже принимает ассоциативный массив Eloquent моделей, например: [‘user1’ => User::find(1), ‘user2’ => User::find(2), ‘node’ => Page::first()]
и примеры строк с токенами: [‘user1:name’],[‘user2:city:name],[‘node:title’] - setVar(string, string) — принимает два аргумента — ключ и его значение
- setVars(array) — сюда кидаем ассоциативный массив переменных. Токен в строке записываем по аналогии как выше, например [var:length], [var:price]
- replace():string — заменить токены в строке и получить результат
Также, есть возможность использовать токены для получения значений конфигов Laravel, используя токены вида:
[config:app.name], [config:mail.from.address],...
Задать шаблоны защищенных конфигов возможно в конфигурационном файле пакета, например, чтобы скрыть пароли, токены своих сервисов и т.д.
Приведем еще один пример работы с токенами разного типа:
$str = StrToken::setText('
Example str with tokens for article: "[article:title]([article:id])",
Article created at date: [article:created_at],
Author: [article:user:name]([article:user:id]).
User: [article:user:email], [article:user:city:country:title], [article:user:city:title].
Generated token at: [config:app.name], [date:raw]
[article:test:Hello]!!!
Length: [var:length];
Width: [var:width];
Price: [var:price]
')->setDate(\Carbon\Carbon::tomorrow())
->setEntity(\App\Model\Article::findOrFail(13))
->setVars(['length' => '2.2 m.', 'width' => '3.35 m.'])
->setVar('price', '$13')
->replace();
В результате мы получим слудующую строку:
Example str with tokens for article: "Test article title(23)",
Article created at date: 15.07.2018,
Author: Taylor Otwell(1),
User: taylorotwell@gmail.com, AR, Little Rock.
Generated token at: Laravel, 2018-10-27 00:00:00
TEST TOKEN:Hello!!!
Length: 2.2 m.;
Width: 3.35 m.;
Price: $13
Как выше могли заметить, пакет поддерживает использование связей между моделями и может с ними отлично работать: [user2:city:name].
Итоги
Можно с уверенностью сказать, что применение пакета https://github.com/fomvasss/laravel-str-tokens, очень упрощает многие аспекты работы и ускоряет процесс разработки веб-приложений на Laravel, где нужно генерировать текстовый строки, создавать шаблоны.
В следующей статьи, планируестя показать, как добавлять собственные кастомные методы для построения своих токенов для Eloquent моделей и как можно использовать токены для связанных моделей.
oxidmod
sprintf запретили?