Пользовательские функции-хэлперы в 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() – т.е. возьмём часть обрезанной строки до последнего пробела. В результате получим строку может чуть меньшую, чем указанное количество символов (limit), но без разрывов слов. Вот код новой функции:

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;
    }
}