Кастомні функції-хелпери в Laravel 5

Кастомні функції-хелпери в Laravel 5

Мета – написати функції-хелпери, які можна викликати у будь-якій частині додатку. Створити користувацькі функції можна будь-де, але давайте виділимо для них спеціальну теку з назвою 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(), але я нюанси, які особисто мені не подобаються:

  1. Якщо у рядку будуть теги, вони також будуть пораховані як символи. Тому перш ніж обрізати рядок, я хотів би видалити усі теги.
  2. Рядок може бути обрізаний посеред слова, чого не хотілось би.

Не будемо вигадувати щось нове, і у якості протитипу використаємо все ту ж 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;
    }
}