
Кастомні функції-хелпери в Laravel 5
25.04.2018 13:34 | Laravel
Мета – написати функції-хелпери, які можна викликати у будь-якій частині додатку. Створити користувацькі функції можна будь-де, але давайте виділимо для них спеціальну теку з назвою Helpers
, у якій створимо файл functions.php
. Тобто, шлях до файлу буде виглядати так: yourproject/app/Helpers/functions.php
Для початку напишемо тестову функцію:
if (!function_exists('test')) {
function test()
{
return 'My helper function';
}
}
Якщо зараз спробувати її викликати, отримаємо помилку «function is not defined». Тому наступний крок – «пояснити» додатку, де визначена наша функція. Для цього йдемо у файл composer.json
, знаходимо autoload
та додаємо шлях до файлу-хелперу. У підсумку ця частина файлу буде виглядати приблизно так:
...
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
},
"files": [
"app/Helpers/functions.php"
]
},
...
Потім потрібно оптимізувати автозавантажувач, тобто в консолі виконаємо команду, яка регенерує список всіх класів і файлів, які слід включити в проект:
$ composer dump-autoload -o
Тепер все працює.
І наостанок приклад конкретної функції. В Laravel є функція str_limit()
, але я нюанси, які особисто мені не подобаються:
- Якщо у рядку будуть теги, вони також будуть пораховані як символи. Тому перш ніж обрізати рядок, я хотів би видалити усі теги.
- Рядок може бути обрізаний посеред слова, чого не хотілось би.
Не будемо вигадувати щось нове, і у якості протитипу використаємо все ту ж str_limit()
з Laravel, а точніше метод limit()
з класу Illuminate\Support\Str
:
public static function limit($value, $limit = 100, $end = '...')
{
if (mb_strwidth($value, 'UTF-8') <= $limit) {
return $value;
}
return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end;
}
Все, що нам потрібно – додати функцію strip_tags()
, а також замінити rtrim()
на mb_strrchr()
, тобто візьмемо частину обрізаного рядка до останнього пробілу. В результаті отримаємо рядок, який можливо трохи коротший, ніж вказана лімітна кількість символів, але без розрирів слів. Ось код нової функції:
if (! function_exists('strlimit')) {
function strlimit($str, $limit = 100, $end = '...')
{
$str = strip_tags($str);
if (mb_strwidth($str, 'UTF-8') <= $limit) {
return $str;
}
return mb_strrchr(mb_strimwidth($str, 0, $limit, '', 'UTF-8'), ' ', true) . $end;
}
}