#Введение
Laravel включает множество глобальных PHP-функций «хелперов». Многие из них используются самим фреймворком, но вы можете применять их в своих приложениях, если они удобны.
#Доступные методы
<style> .collection-method-list > p { columns: 10.8em 3; -moz-columns: 10.8em 3; -webkit-columns: 10.8em 3; } .collection-method-list a { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } </style>#Массивы и объекты
Arr::accessible Arr::add Arr::collapse Arr::crossJoin Arr::divide Arr::dot Arr::except Arr::exists Arr::first Arr::flatten Arr::forget Arr::get Arr::has Arr::hasAny Arr::isAssoc Arr::isList Arr::join Arr::keyBy Arr::last Arr::map Arr::mapWithKeys Arr::only Arr::pluck Arr::prepend Arr::prependKeysWith Arr::pull Arr::query Arr::random Arr::set Arr::shuffle Arr::sort Arr::sortDesc Arr::sortRecursive Arr::sortRecursiveDesc Arr::take Arr::toCssClasses Arr::toCssStyles Arr::undot Arr::where Arr::whereNotNull Arr::wrap data_fill data_get data_set data_forget head last
#Числа
Number::abbreviate Number::clamp Number::currency Number::fileSize Number::forHumans Number::format Number::ordinal Number::percentage Number::spell Number::useLocale Number::withLocale
#Пути
#URL-адреса
#Разное
abort abort_if abort_unless app auth back bcrypt blank broadcast cache class_uses_recursive collect config cookie csrf_field csrf_token decrypt dd dispatch dispatch_sync dump encrypt env event fake filled info logger method_field now old optional policy redirect report report_if report_unless request rescue resolve response retry session tap throw_if throw_unless today trait_uses_recursive transform validator value view with
#Массивы и объекты
#Arr::accessible() {.collection-method .first-collection-method}
Метод Arr::accessible проверяет, доступно ли значение как массив:
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
$isAccessible = Arr::accessible(['a' => 1, 'b' => 2]);
// true
$isAccessible = Arr::accessible(new Collection);
// true
$isAccessible = Arr::accessible('abc');
// false
$isAccessible = Arr::accessible(new stdClass);
// false
#Arr::add() {.collection-method}
Метод Arr::add добавляет заданную пару ключ / значение в массив, если этот ключ ещё не существует в массиве или установлен в null:
use Illuminate\Support\Arr;
$array = Arr::add(['name' => 'Desk'], 'price', 100);
// ['name' => 'Стол', 'price' => 100]
$array = Arr::add(['name' => 'Desk', 'price' => null], 'price', 100);
// ['name' => 'Стол', 'price' => 100]
#Arr::collapse() {.collection-method}
Метод Arr::collapse сворачивает массив массивов в один массив:
use Illuminate\Support\Arr;
$array = Arr::collapse([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
// [1, 2, 3, 4, 5, 6, 7, 8, 9]
#Arr::crossJoin() {.collection-method}
Метод Arr::crossJoin выполняет декартово произведение заданных массивов, возвращая все возможные комбинации:
use Illuminate\Support\Arr;
$matrix = Arr::crossJoin([1, 2], ['a', 'b']);
/*
[
[1, 'a'],
[1, 'b'],
[2, 'a'],
[2, 'b'],
]
*/
$matrix = Arr::crossJoin([1, 2], ['a', 'b'], ['I', 'II']);
/*
[
[1, 'a', 'I'],
[1, 'a', 'II'],
[1, 'b', 'I'],
[1, 'b', 'II'],
[2, 'a', 'I'],
[2, 'a', 'II'],
[2, 'b', 'I'],
[2, 'b', 'II'],
]
*/
#Arr::divide() {.collection-method}
Метод Arr::divide возвращает два массива: один с ключами, другой — со значениями переданного массива:
use Illuminate\Support\Arr;
[$keys, $values] = Arr::divide(['name' => 'Desk']);
// $keys: ['name']
// $values: ['Desk']
#Arr::dot() {.collection-method}
Метод Arr::dot преобразует многомерный массив в одномерный, используя «точечную» нотацию для обозначения глубины:
use Illuminate\Support\Arr;
$array = ['products' => ['desk' => ['price' => 100]]];
$flattened = Arr::dot($array);
// ['products.desk.price' => 100]
#Arr::except() {.collection-method}
Метод Arr::except удаляет указанные пары ключ / значение из массива:
use Illuminate\Support\Arr;
$array = ['name' => 'Desk', 'price' => 100];
$filtered = Arr::except($array, ['price']);
// ['name' => 'Стол']
#Arr::exists() {.collection-method}
Метод Arr::exists проверяет, что указанный ключ существует в переданном массиве:
use Illuminate\Support\Arr;
$array = ['name' => 'John Doe', 'age' => 17];
$exists = Arr::exists($array, 'name');
// true
$exists = Arr::exists($array, 'salary');
// ложь
#Arr::first() {.collection-method}
Метод Arr::first возвращает первый элемент массива, который проходит заданное условие истинности:
use Illuminate\Support\Arr;
$array = [100, 200, 300];
$first = Arr::first($array, function (int $value, int $key) {
return $value >= 150;
});
// 200
В качестве третьего параметра методу также можно передать значение по умолчанию. Оно будет возвращено, если ни одно значение не пройдет проверку истинности:
use Illuminate\Support\Arr;
$first = Arr::first($array, $callback, $default);
#Arr::flatten() {.collection-method}
Метод Arr::flatten преобразует многомерный массив в одномерный массив:
use Illuminate\Support\Arr;
$array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']];
$flattened = Arr::flatten($array);
// ['Joe', 'PHP', 'Ruby']
#Arr::forget() {.collection-method}
Метод Arr::forget удаляет заданную пару ключ / значение из глубоко вложенного массива с использованием «точечной» нотации:
use Illuminate\Support\Arr;
$array = ['products' => ['desk' => ['price' => 100]]];
Arr::forget($array, 'products.desk');
// ['products' => []]
#Arr::get() {.collection-method}
Метод Arr::get извлекает значение из глубоко вложенного массива, используя «точечную» нотацию:
use Illuminate\Support\Arr;
$array = ['products' => ['desk' => ['price' => 100]]];
$price = Arr::get($array, 'products.desk.price');
// 100
Метод Arr::get также принимает значение по умолчанию, которое будет возвращено, если указанный ключ отсутствует в массиве:
use Illuminate\Support\Arr;
$discount = Arr::get($array, 'products.desk.discount', 0);
// 0
#Arr::has() {.collection-method}
Метод Arr::has проверяет, существует ли указанный элемент или элементы в массиве, используя «точечную» нотацию:
use Illuminate\Support\Arr;
$array = ['product' => ['name' => 'Desk', 'price' => 100]];
$contains = Arr::has($array, 'product.name');
// true
$contains = Arr::has($array, ['product.price', 'product.discount']);
// ложь
#Arr::hasAny() {.collection-method}
Метод Arr::hasAny проверяет, существует ли в массиве хотя бы один элемент из заданного набора, используя «dot» нотацию:
use Illuminate\Support\Arr;
$array = ['product' => ['name' => 'Desk', 'price' => 100]];
$contains = Arr::hasAny($array, 'product.name');
// true
$contains = Arr::hasAny($array, ['product.name', 'product.discount']);
// true
$contains = Arr::hasAny($array, ['category', 'product.discount']);
// false
#Arr::isAssoc() {.collection-method}
Метод Arr::isAssoc возвращает true, если переданный массив является ассоциативным. Массив считается «ассоциативным», если у него нет последовательных числовых ключей, начинающихся с нуля:
use Illuminate\Support\Arr;
$isAssoc = Arr::isAssoc(['product' => ['name' => 'Desk', 'price' => 100]]);
// true
$isAssoc = Arr::isAssoc([1, 2, 3]);
// ложь
#Arr::isList() {.collection-method}
Метод Arr::isList возвращает true, если ключи переданного массива — последовательные целые числа, начиная с нуля:
use Illuminate\Support\Arr;
$isList = Arr::isList(['foo', 'bar', 'baz']);
// true
$isList = Arr::isList(['product' => ['name' => 'Desk', 'price' => 100]]);
// false
#Arr::join() {.collection-method}
Метод Arr::join объединяет элементы массива строкой. С помощью второго аргумента этого метода можно указать строку, которая будет использоваться для соединения последнего элемента массива:
use Illuminate\Support\Arr;
$array = ['Tailwind', 'Alpine', 'Laravel', 'Livewire'];
$joined = Arr::join($array, ', ');
// Tailwind, Alpine, Laravel, Livewire
$joined = Arr::join($array, ', ', ' and ');
// Tailwind, Alpine, Laravel и Livewire
#Arr::keyBy() {.collection-method}
Метод Arr::keyBy создаёт ключи массива на основе заданного ключа. Если несколько элементов имеют одинаковый ключ, в новом массиве останется только последний из них:
use Illuminate\Support\Arr;
$array = [
['product_id' => 'prod-100', 'name' => 'Стол'],
['product_id' => 'prod-200', 'name' => 'Стул'],
];
$keyed = Arr::keyBy($array, 'product_id');
/*
[
'prod-100' => ['product_id' => 'prod-100', 'name' => 'Стол'],
'prod-200' => ['product_id' => 'prod-200', 'name' => 'Стул'],
]
*/
#Arr::last() {.collection-method}
Метод Arr::last возвращает последний элемент массива, который проходит заданное условие истинности:
use Illuminate\Support\Arr;
$array = [100, 200, 300, 110];
$last = Arr::last($array, function (int $value, int $key) {
return $value >= 150;
});
// 300
В качестве третьего аргумента методу можно передать значение по умолчанию. Оно будет возвращено, если ни одно значение не пройдет проверку истинности:
use Illuminate\Support\Arr;
$last = Arr::last($array, $callback, $default);
#Arr::map() {.collection-method}
Метод Arr::map перебирает массив и передаёт каждое значение и ключ в заданное замыкание. Значение массива заменяется на возвращаемое замыканием значение:
use Illuminate\Support\Arr;
$array = ['first' => 'james', 'last' => 'kirk'];
$mapped = Arr::map($array, function (string $value, string $key) {
return ucfirst($value);
});
// ['first' => 'James', 'last' => 'Kirk']
#Arr::mapWithKeys() {.collection-method}
Метод Arr::mapWithKeys перебирает массив и передаёт каждое значение в заданный колбэк. Колбэк должен вернуть ассоциативный массив с одной парой ключ / значение:
use Illuminate\Support\Arr;
$array = [
[
'name' => 'John',
'department' => 'Продажи',
'email' => 'john@example.com',
],
[
'name' => 'Jane',
'department' => 'Маркетинг',
'email' => 'jane@example.com',
]
];
$mapped = Arr::mapWithKeys($array, function (array $item, int $key) {
return [$item['email'] => $item['name']];
});
/*
[
'john@example.com' => 'John',
'jane@example.com' => 'Jane',
]
*/
#Arr::only() {.collection-method}
Метод Arr::only возвращает только указанные пары ключ / значение из заданного массива:
use Illuminate\Support\Arr;
$array = ['name' => 'Desk', 'price' => 100, 'orders' => 10];
$slice = Arr::only($array, ['name', 'price']);
// ['name' => 'Стол', 'price' => 100]
#Arr::pluck() {.collection-method}
Метод Arr::pluck извлекает все значения для заданного ключа из массива:
use Illuminate\Support\Arr;
$array = [
['developer' => ['id' => 1, 'name' => 'Taylor']],
['developer' => ['id' => 2, 'name' => 'Abigail']],
];
$names = Arr::pluck($array, 'developer.name');
// ['Taylor', 'Abigail']
Вы также можете указать, как должны быть индексированы элементы результирующего списка:
use Illuminate\Support\Arr;
$names = Arr::pluck($array, 'developer.name', 'developer.id');
// [1 => 'Taylor', 2 => 'Abigail']
#Arr::prepend() {.collection-method}
Метод Arr::prepend добавляет элемент в начало массива:
use Illuminate\Support\Arr;
$array = ['one', 'two', 'three', 'four'];
$array = Arr::prepend($array, 'zero');
// ['ноль', 'один', 'два', 'три', 'четыре']
Если нужно, можно указать ключ, который будет использоваться для значения:
use Illuminate\Support\Arr;
$array = ['price' => 100];
$array = Arr::prepend($array, 'Desk', 'name');
// ['name' => 'Стол', 'price' => 100]
#Arr::prependKeysWith() {.collection-method}
Arr::prependKeysWith добавляет указанный префикс ко всем именам ключей ассоциативного массива:
use Illuminate\Support\Arr;
$array = [
'name' => 'Desk',
'price' => 100,
];
$keyed = Arr::prependKeysWith($array, 'product.');
/*
[
'product.name' => 'Стол',
'product.price' => 100,
]
*/
#Arr::pull() {.collection-method}
Метод Arr::pull возвращает и удаляет пару ключ / значение из массива:
use Illuminate\Support\Arr;
$array = ['name' => 'Desk', 'price' => 100];
$name = Arr::pull($array, 'name');
// $name: Desk
// $array: ['price' => 100]
В качестве третьего аргумента методу можно передать значение по умолчанию. Оно будет возвращено, если ключ не существует:
use Illuminate\Support\Arr;
$value = Arr::pull($array, $key, $default);
#Arr::query() {.collection-method}
Метод Arr::query преобразует массив в строку запроса:
use Illuminate\Support\Arr;
$array = [
'name' => 'Taylor',
'order' => [
'column' => 'created_at',
'direction' => 'desc'
]
];
Arr::query($array);
// name=Taylor&order[column]=created_at&order[direction]=desc
#Arr::random() {.collection-method}
Метод Arr::random возвращает случайное значение из массива:
use Illuminate\Support\Arr;
$array = [1, 2, 3, 4, 5];
$random = Arr::random($array);
// 4 - (получено случайным образом)
Вы также можете указать количество элементов для возврата в качестве необязательного второго аргумента. Обратите внимание, что при указании этого аргумента будет возвращён массив, даже если нужен только один элемент:
use Illuminate\Support\Arr;
$items = Arr::random($array, 2);
// [2, 5] - (выбрано случайным образом)
#Arr::set() {.collection-method}
Метод Arr::set устанавливает значение внутри глубоко вложенного массива, используя «точечную» нотацию:
use Illuminate\Support\Arr;
$array = ['products' => ['desk' => ['price' => 100]]];
Arr::set($array, 'products.desk.price', 200);
// ['products' => ['desk' => ['price' => 200]]]
#Arr::shuffle() {.collection-method}
Метод Arr::shuffle случайным образом перемешивает элементы массива:
use Illuminate\Support\Arr;
$array = Arr::shuffle([1, 2, 3, 4, 5]);
// [3, 2, 5, 1, 4] - (сгенерировано случайным образом)
#Arr::sort() {.collection-method}
Метод Arr::sort сортирует массив по значениям:
use Illuminate\Support\Arr;
$array = ['Desk', 'Table', 'Chair'];
$sorted = Arr::sort($array);
// ['Стул', 'Письменный стол', 'Стол']
Вы также можете отсортировать массив по результатам заданного замыкания:
use Illuminate\Support\Arr;
$array = [
['name' => 'Desk'],
['name' => 'Table'],
['name' => 'Chair'],
];
$sorted = array_values(Arr::sort($array, function (array $value) {
return $value['name'];
}));
/*
[
['name' => 'Стул'],
['name' => 'Письменный стол'],
['name' => 'Стол'],
]
*/
#Arr::sortDesc() {.collection-method}
Метод Arr::sortDesc сортирует массив по значениям в порядке убывания:
use Illuminate\Support\Arr;
$array = ['Desk', 'Table', 'Chair'];
$sorted = Arr::sortDesc($array);
// ['Стол', 'Письменный стол', 'Стул']
Вы также можете отсортировать массив по результатам заданного замыкания:
use Illuminate\Support\Arr;
$array = [
['name' => 'Стол'],
['name' => 'Таблица'],
['name' => 'Стул'],
];
$sorted = array_values(Arr::sortDesc($array, function (array $value) {
return $value['name'];
}));
/*
[
['name' => 'Стол'],
['name' => 'Письменный стол'],
['name' => 'Стул'],
]
*/
#Arr::sortRecursive() {.collection-method}
Метод Arr::sortRecursive рекурсивно сортирует массив, используя функцию sort для числовых подмассивов и функцию ksort для ассоциативных подмассивов:
use Illuminate\Support\Arr;
$array = [
['Roman', 'Taylor', 'Li'],
['PHP', 'Ruby', 'JavaScript'],
['one' => 1, 'two' => 2, 'three' => 3],
];
$sorted = Arr::sortRecursive($array);
/*
[
['JavaScript', 'PHP', 'Ruby'],
['one' => 1, 'three' => 3, 'two' => 2],
['Li', 'Roman', 'Taylor'],
]
*/
Если нужно отсортировать результаты в порядке убывания, используйте метод Arr::sortRecursiveDesc.
$sorted = Arr::sortRecursiveDesc($array);
#Arr::take() {.collection-method}
Метод Arr::take возвращает новый массив с указанным количеством элементов:
use Illuminate\Support\Arr;
$array = [0, 1, 2, 3, 4, 5];
$chunk = Arr::take($array, 3);
// [0, 1, 2]
Вы также можете передать отрицательное целое число, чтобы взять указанное количество элементов с конца массива:
$array = [0, 1, 2, 3, 4, 5];
$chunk = Arr::take($array, -2);
// [4, 5]
#Arr::toCssClasses() {.collection-method}
Метод Arr::toCssClasses условно формирует строку CSS-классов. Метод принимает массив классов, где ключ массива содержит класс или классы, которые нужно добавить, а значение — логическое выражение. Если элемент массива имеет числовой ключ, он всегда будет включён в итоговый список классов:
use Illuminate\Support\Arr;
$isActive = false;
$hasError = true;
$array = ['p-4', 'font-bold' => $isActive, 'bg-red' => $hasError];
$classes = Arr::toCssClasses($array);
/*
'p-4 bg-red'
*/
#Arr::toCssStyles() {.collection-method}
Метод Arr::toCssStyles условно формирует строку CSS-стилей. Он принимает массив, где ключ — это класс или классы, которые нужно добавить, а значение — логическое выражение. Если элемент массива имеет числовой ключ, он всегда включается в итоговую строку стилей:
use Illuminate\Support\Arr;
$hasColor = true;
$array = ['background-color: blue', 'color: blue' => $hasColor];
$classes = Arr::toCssStyles($array);
/*
'background-color: blue; color: blue;'
*/
Этот метод обеспечивает работу функционала Laravel, позволяющего объединять классы с набором атрибутов компонента Blade, а также директиву @class Blade.
#Arr::undot() {.collection-method}
Метод Arr::undot преобразует одномерный массив с использованием «dot» нотации в многомерный массив:
use Illuminate\Support\Arr;
$array = [
'user.name' => 'Kevin Malone',
'user.occupation' => 'Accountant',
];
$array = Arr::undot($array);
// ['user' => ['name' => 'Kevin Malone', 'occupation' => 'Бухгалтер']]
#Arr::where() {.collection-method}
Метод Arr::where фильтрует массив с помощью заданного замыкания:
use Illuminate\Support\Arr;
$array = [100, '200', 300, '400', 500];
$filtered = Arr::where($array, function (string|int $value, int $key) {
return is_string($value);
});
// [1 => '200', 3 => '400']
#Arr::whereNotNull() {.collection-method}
Метод Arr::whereNotNull удаляет все значения null из заданного массива:
use Illuminate\Support\Arr;
$array = [0, null];
$filtered = Arr::whereNotNull($array);
// [0 => 0]
#Arr::wrap() {.collection-method}
Метод Arr::wrap оборачивает переданное значение в массив. Если значение уже является массивом, оно возвращается без изменений:
use Illuminate\Support\Arr;
$string = 'Laravel';
$array = Arr::wrap($string);
// ['Laravel']
Если переданное значение равно null, будет возвращён пустой массив:
use Illuminate\Support\Arr;
$array = Arr::wrap(null);
// []
#data_fill() {.collection-method}
Функция data_fill устанавливает отсутствующее значение в вложенном массиве или объекте с использованием «dot» нотации:
$data = ['products' => ['desk' => ['price' => 100]]];
data_fill($data, 'products.desk.price', 200);
// ['products' => ['desk' => ['price' => 100]]]
data_fill($data, 'products.desk.discount', 10);
// ['products' => ['desk' => ['price' => 100, 'discount' => 10]]]
Эта функция также принимает звёздочки как подстановочные символы и заполнит целевой массив соответствующим образом:
$data = [
'products' => [
['name' => 'Стол 1', 'price' => 100],
['name' => 'Стол 2'],
],
];
data_fill($data, 'products.*.price', 200);
/*
[
'products' => [
['name' => 'Стол 1', 'price' => 100],
['name' => 'Стол 2', 'price' => 200],
],
]
*/
#data_get() {.collection-method}
Функция data_get извлекает значение из вложенного массива или объекта с помощью «точечной» нотации:
$data = ['products' => ['desk' => ['price' => 100]]];
$price = data_get($data, 'products.desk.price');
// 100
Функция data_get также принимает значение по умолчанию, которое будет возвращено, если указанный ключ не найден:
$discount = data_get($data, 'products.desk.discount', 0);
// 0
Функция также поддерживает подстановочные знаки с помощью звёздочек, которые могут соответствовать любому ключу массива или объекта:
$data = [
'product-one' => ['name' => 'Стол 1', 'price' => 100],
'product-two' => ['name' => 'Стол 2', 'price' => 150],
];
data_get($data, '*.name');
// ['Стол 1', 'Стол 2'];
#data_set() {.collection-method}
Функция data_set устанавливает значение внутри вложенного массива или объекта с помощью «точечной» нотации:
$data = ['products' => ['desk' => ['price' => 100]]];
data_set($data, 'products.desk.price', 200);
// ['products' => ['desk' => ['price' => 200]]]
Эта функция также поддерживает подстановочные знаки с помощью звёздочек и будет устанавливать значения в целевом массиве соответственно:
$data = [
'products' => [
['name' => 'Стол 1', 'price' => 100],
['name' => 'Стол 2', 'price' => 150],
],
];
data_set($data, 'products.*.price', 200);
/*
[
'products' => [
['name' => 'Стол 1', 'price' => 200],
['name' => 'Стол 2', 'price' => 200],
],
]
*/
По умолчанию любые существующие значения перезаписываются. Если нужно установить значение только в случае его отсутствия, можно передать false в качестве четвёртого аргумента функции:
$data = ['products' => ['desk' => ['price' => 100]]];
data_set($data, 'products.desk.price', 200, overwrite: false);
// ['products' => ['desk' => ['price' => 100]]]
#data_forget() {.collection-method}
Функция data_forget удаляет значение внутри вложенного массива или объекта с помощью «точечной» нотации:
$data = ['products' => ['desk' => ['price' => 100]]];
data_forget($data, 'products.desk.price');
// ['products' => ['desk' => []]]
Эта функция также поддерживает подстановочные знаки с помощью звёздочек и будет удалять значения в целевом массиве соответственно:
$data = [
'products' => [
['name' => 'Стол 1', 'price' => 100],
['name' => 'Стол 2', 'price' => 150],
],
];
data_forget($data, 'products.*.price');
/*
[
'products' => [
['name' => 'Стол 1'],
['name' => 'Стол 2'],
],
]
*/
#head() {.collection-method}
Функция head возвращает первый элемент заданного массива:
$array = [100, 200, 300];
$first = head($array);
// 100
#last() {.collection-method}
Функция last возвращает последний элемент заданного массива:
$array = [100, 200, 300];
$last = last($array);
// 300
#Числа
#Number::abbreviate() {.collection-method}
Метод Number::abbreviate возвращает удобочитаемый формат заданного числового значения с сокращением единиц измерения:
use Illuminate\Support\Number;
$number = Number::abbreviate(1000);
// 1К
$number = Number::abbreviate(489939);
// 490K
$number = Number::abbreviate(1230000, precision: 2);
// 1,23M
#Number::clamp() {.collection-method}
Метод Number::clamp гарантирует, что число находится в заданном диапазоне. Если число меньше минимального значения, возвращается минимум. Если число больше максимума, возвращается максимум:
use Illuminate\Support\Number;
$number = Number::clamp(105, min: 10, max: 100);
// 100
$number = Number::clamp(5, min: 10, max: 100);
// 10
$number = Number::clamp(10, min: 10, max: 100);
// 10
$number = Number::clamp(20, min: 10, max: 100);
// 20
#Number::currency() {.collection-method}
Метод Number::currency возвращает строковое представление валюты для заданного значения:
use Illuminate\Support\Number;
$currency = Number::currency(1000);
// $1,000
$currency = Number::currency(1000, in: 'EUR');
// 1 000 €
$currency = Number::currency(1000, in: 'EUR', locale: 'de');
// 1.000 €
#Number::fileSize() {.collection-method}
Метод Number::fileSize возвращает строковое представление размера файла для заданного значения в байтах:
use Illuminate\Support\Number;
$size = Number::fileSize(1024);
// 1 КБ
$size = Number::fileSize(1024 * 1024);
// 1 МБ
$size = Number::fileSize(1024, precision: 2);
// 1.00 КБ
#Number::forHumans() {.collection-method}
Метод Number::forHumans возвращает человекочитаемый формат переданного числового значения:
use Illuminate\Support\Number;
$number = Number::forHumans(1000);
// 1 тысяча
$number = Number::forHumans(489939);
// 490 тысяч
$number = Number::forHumans(1230000, precision: 2);
// 1,23 миллиона
#Number::format() {.collection-method}
Метод Number::format форматирует заданное число в строку с учётом локали:
use Illuminate\Support\Number;
$number = Number::format(100000);
// 100 000
$number = Number::format(100000, precision: 2);
// 100 000,00
$number = Number::format(100000.123, maxPrecision: 2);
// 100,000.12
$number = Number::format(100000, locale: 'de');
// 100.000
#Number::ordinal() {.collection-method}
Метод Number::ordinal возвращает порядковое представление числа:
use Illuminate\Support\Number;
$number = Number::ordinal(1);
// 1-й
$number = Number::ordinal(2);
// 2-й
$number = Number::ordinal(21);
// 21-й
#Number::percentage() {.collection-method}
Метод Number::percentage возвращает строковое представление заданного значения в виде процента:
use Illuminate\Support\Number;
$percentage = Number::percentage(10);
// 10%
$percentage = Number::percentage(10, precision: 2);
// 10.00%
$percentage = Number::percentage(10.123, maxPrecision: 2);
// 10.12%
$percentage = Number::percentage(10, precision: 2, locale: 'de');
// 10,00%
#Number::spell() {.collection-method}
Метод Number::spell преобразует заданное число в строку слов:
use Illuminate\Support\Number;
$number = Number::spell(102);
// сто два
$number = Number::spell(88, locale: 'fr');
// восемьдесят восемь
Аргумент after позволяет указать значение, после которого все числа будут записаны прописью:
$number = Number::spell(10, after: 10);
// 10
$number = Number::spell(11, after: 10);
// одиннадцать
Аргумент until позволяет указать значение, до которого все числа должны быть пропечатаны словами:
$number = Number::spell(5, until: 10);
// пять
$number = Number::spell(10, until: 10);
// 10
#Number::useLocale() {.collection-method}
Метод Number::useLocale устанавливает глобально локаль по умолчанию для чисел, что влияет на форматирование чисел и валюты при последующих вызовах методов класса Number:
use Illuminate\Support\Number;
/**
* Инициализация сервисов приложения.
*/
public function boot(): void
{
Number::useLocale('de');
}
#Number::withLocale() {.collection-method}
Метод Number::withLocale выполняет переданное замыкание с указанной локалью, а после выполнения восстанавливает исходную локаль:
use Illuminate\Support\Number;
$number = Number::withLocale('de', function () {
return Number::format(1500);
});
#Пути
#app_path() {.collection-method}
Функция app_path возвращает полный путь к директории app вашего приложения. Также можно использовать функцию app_path для получения полного пути к файлу относительно директории приложения:
$path = app_path();
$path = app_path('Http/Controllers/Controller.php');
#base_path() {.collection-method}
Функция base_path возвращает полный путь к корневой директории вашего приложения. Также вы можете использовать функцию base_path для генерации полного пути к файлу относительно корня проекта:
$path = base_path();
$path = base_path('vendor/bin');
#config_path() {.collection-method}
Функция config_path возвращает полный путь к каталогу config вашего приложения. Также можно использовать функцию config_path для получения полного пути к конкретному файлу внутри каталога конфигурации приложения:
$path = config_path();
$path = config_path('app.php');
#database_path() {.collection-method}
Функция database_path возвращает полный путь к каталогу database вашего приложения. Также можно использовать функцию database_path для получения полного пути к конкретному файлу внутри каталога базы данных:
$path = database_path();
$path = database_path('factories/UserFactory.php');
#lang_path() {.collection-method}
Функция lang_path возвращает полный путь к каталогу lang вашего приложения. Также можно использовать функцию lang_path для получения полного пути к конкретному файлу внутри этого каталога:
$path = lang_path();
$path = lang_path('en/messages.php');
По умолчанию в каркасе приложения Laravel нет директории lang. Если хотите настроить языковые файлы Laravel, вы можете опубликовать их с помощью команды Artisan lang:publish.
#mix() {.collection-method}
Функция mix возвращает путь к версионированному файлу Mix:
$path = mix('css/app.css');
#public_path() {.collection-method}
Функция public_path возвращает полный путь к каталогу public вашего приложения. Также можно использовать функцию public_path для получения полного пути к конкретному файлу внутри каталога public:
$path = public_path();
$path = public_path('css/app.css');
#resource_path() {.collection-method}
Функция resource_path возвращает полный путь к каталогу resources вашего приложения. Также можно использовать функцию resource_path для получения полного пути к конкретному файлу внутри каталога ресурсов:
$path = resource_path();
$path = resource_path('sass/app.scss');
#storage_path() {.collection-method}
Функция storage_path возвращает полный путь к каталогу storage вашего приложения. Также можно использовать функцию storage_path для получения полного пути к конкретному файлу внутри каталога storage:
$path = storage_path();
$path = storage_path('app/file.txt');
#URL-адреса
#action() {.collection-method}
Функция action генерирует URL для указанного действия контроллера:
use App\Http\Controllers\HomeController;
$url = action([HomeController::class, 'index']);
Если метод принимает параметры маршрута, вы можете передать их вторым аргументом метода:
$url = action([UserController::class, 'profile'], ['id' => 1]);
#asset() {.collection-method}
Функция asset генерирует URL для ресурса, используя текущую схему запроса (HTTP или HTTPS):
$url = asset('img/photo.jpg');
Вы можете настроить хост URL для ассетов, установив переменную ASSET_URL в вашем файле .env. Это полезно, если вы храните ассеты на внешнем сервисе, например Amazon S3 или другом CDN:
// ASSET_URL=http://example.com/assets
$url = asset('img/photo.jpg'); // http://example.com/assets/img/photo.jpg
#route() {.collection-method}
Функция route генерирует URL для заданного именованного маршрута:
$url = route('route.name');
Если маршрут принимает параметры, вы можете передать их вторым аргументом функции:
$url = route('route.name', ['id' => 1]);
По умолчанию функция route генерирует абсолютный URL. Если нужно получить относительный URL, можно передать false третьим аргументом функции:
$url = route('route.name', ['id' => 1], false);
#secure_asset() {.collection-method}
Функция secure_asset генерирует URL для ресурса с использованием HTTPS:
$url = secure_asset('img/photo.jpg');
#secure_url() {.collection-method}
Функция secure_url генерирует полный HTTPS URL для указанного пути. Дополнительные сегменты URL можно передать вторым аргументом функции:
$url = secure_url('user/profile');
$url = secure_url('user/profile', [1]);
#to_route() {.collection-method}
Функция to_route создаёт HTTP-ответ с перенаправлением для указанного именованного маршрута:
return to_route('users.show', ['user' => 1]);
При необходимости можно передать HTTP-статус, который будет назначен редиректу, и дополнительные HTTP-заголовки в качестве третьего и четвёртого аргументов метода to_route:
return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);
#url() {.collection-method}
Функция url генерирует полный URL для указанного пути:
$url = url('user/profile');
$url = url('user/profile', [1]);
Если путь не указан, возвращается экземпляр Illuminate\Routing\UrlGenerator:
$current = url()->current();
$full = url()->full();
$previous = url()->previous();
#Разное
#abort() {.collection-method}
Функция abort выбрасывает HTTP-исключение, которое будет обработано обработчиком исключений:
abort(403);
Вы также можете указать сообщение исключения и пользовательские HTTP-заголовки ответа, которые должны быть отправлены в браузер:
abort(403, 'Неавторизованно.', $headers);
#abort_if() {.collection-method}
Функция abort_if выбрасывает HTTP-исключение, если заданное логическое выражение возвращает true:
abort_if(! Auth::user()->isAdmin(), 403);
Как и в методе abort, вы можете передать текст ответа исключения в качестве третьего аргумента и массив пользовательских HTTP-заголовков ответа — в качестве четвёртого аргумента функции.
#abort_unless() {.collection-method}
Функция abort_unless выбрасывает HTTP-исключение, если заданное логическое выражение оценивается как false:
abort_unless(Auth::user()->isAdmin(), 403);
Как и в методе abort, вы можете передать текст ответа исключения в качестве третьего аргумента и массив пользовательских HTTP-заголовков ответа — в качестве четвёртого аргумента функции.
#app() {.collection-method}
Функция app возвращает экземпляр контейнера служб:
$container = app();
Вы можете передать имя класса или интерфейса, чтобы разрешить его из контейнера:
$api = app('HelpSpot\API');
#auth() {.collection-method}
Функция auth возвращает экземпляр аутентификатора. Её можно использовать как альтернативу фасаду Auth:
$user = auth()->user();
При необходимости можно указать, к какому экземпляру guard вы хотите получить доступ:
$user = auth('admin')->user();
#back() {.collection-method}
Функция back создаёт HTTP-ответ с перенаправлением на предыдущий адрес пользователя:
return back($status = 302, $headers = [], $fallback = '/');
return back();
#bcrypt() {.collection-method}
Функция bcrypt хеширует переданное значение с помощью Bcrypt. Эту функцию можно использовать как альтернативу фасаду Hash:
$password = bcrypt('my-secret-password');
#blank() {.collection-method}
Функция blank определяет, является ли переданное значение «пустым»:
blank('');
blank(' ');
blank(null);
blank(collect());
// true
blank(0);
blank(true);
blank(false);
// false
Для противоположности blank смотрите метод filled.
#broadcast() {.collection-method}
Функция broadcast транслирует указанное событие его слушателям:
broadcast(new UserRegistered($user));
broadcast(new UserRegistered($user))->toOthers();
#cache() {.collection-method}
Функция cache используется для получения значений из кэша. Если указанный ключ отсутствует в кэше, будет возвращено необязательное значение по умолчанию:
$value = cache('key');
$value = cache('key', 'default');
Вы можете добавить элементы в кэш, передав массив пар ключ / значение в функцию. Также нужно указать количество секунд или длительность, в течение которой кэшированное значение будет считаться актуальным:
cache(['key' => 'value'], 300);
cache(['key' => 'value'], now()->addSeconds(10));
#class_uses_recursive() {.collection-method}
Функция class_uses_recursive возвращает все трейты, используемые классом, включая трейты всех его родительских классов:
$traits = class_uses_recursive(App\Models\User::class);
#collect() {.collection-method}
Функция collect создаёт экземпляр коллекции из переданного значения:
$collection = collect(['taylor', 'abigail']);
#config() {.collection-method}
Функция config получает значение переменной из конфигурации. Значения конфигурации можно получить с помощью «точечной» нотации, указывая имя файла и нужный параметр. Можно задать значение по умолчанию, которое вернётся, если параметр конфигурации отсутствует:
$value = config('app.timezone');
$value = config('app.timezone', $default);
Вы можете установить переменные конфигурации во время выполнения, передав массив пар ключ / значение. Однако учтите, что эта функция влияет только на значение конфигурации для текущего запроса и не обновляет ваши реальные значения конфигурации:
config(['app.debug' => true]);
#cookie() {.collection-method}
Функция cookie создаёт новый экземпляр cookie:
$cookie = cookie('name', 'value', $minutes);
#csrf_field() {.collection-method}
Функция csrf_field генерирует HTML-поле hidden с значением CSRF-токена. Например, с использованием синтаксиса Blade:
{{ csrf_field() }}
#csrf_token() {.collection-method}
Функция csrf_token возвращает значение текущего CSRF-токена:
$token = csrf_token();
#decrypt() {.collection-method}
Функция decrypt расшифровывает переданное значение. Её можно использовать как альтернативу фасаду Crypt:
$password = decrypt($value);
#dd() {.collection-method}
Функция dd выводит переданные переменные и завершает выполнение скрипта:
dd($value);
dd($value1, $value2, $value3, ...);
Если вы не хотите прерывать выполнение скрипта, используйте функцию dump.
#dispatch() {.collection-method}
Функция dispatch помещает указанный job в очередь заданий Laravel job queue:
dispatch(new App\Jobs\SendEmails);
#dispatch_sync() {.collection-method}
Функция dispatch_sync помещает указанное задание в очередь sync для немедленной обработки:
dispatch_sync(new App\Jobs\SendEmails);
#dump() {.collection-method}
Функция dump выводит переданные переменные:
dump($value);
dump($value1, $value2, $value3, ...);
Если нужно остановить выполнение скрипта после вывода переменных, используйте функцию dd.
#encrypt() {.collection-method}
Функция encrypt шифрует переданное значение. Вы можете использовать эту функцию вместо фасада Crypt:
$secret = encrypt('my-secret-value');
#env() {.collection-method}
Функция env получает значение переменной окружения или возвращает значение по умолчанию:
$env = env('APP_ENV');
$env = env('APP_ENV', 'production');
Если вы выполняете команду config:cache в процессе деплоя, убедитесь, что функция env вызывается только из файлов конфигурации. После кэширования конфигурации файл .env загружаться не будет, и все вызовы функции env вернут null.
#event() {.collection-method}
Функция event отправляет указанный событие его слушателям:
event(new UserRegistered($user));
#fake() {.collection-method}
Функция fake разрешает синглтон Faker из контейнера, что удобно при создании фейковых данных в фабриках моделей, сидерах базы данных, тестах и прототипировании представлений:
@for($i = 0; $i < 10; $i++)
<dl>
<dt>Name</dt>
<dd>{{ fake()->name() }}</dd>
<dt>Email</dt>
<dd>{{ fake()->unique()->safeEmail() }}</dd>
</dl>
@endfor
По умолчанию функция fake использует параметр конфигурации app.faker_locale из файла config/app.php; однако вы можете указать локаль, передав её в функцию fake. Для каждой локали создаётся отдельный синглтон:
fake('nl_NL')->name()
#filled() {.collection-method}
Функция filled определяет, что заданное значение не является «пустым»:
filled(0);
filled(true);
filled(false);
// true
filled('');
filled(' ');
filled(null);
filled(collect());
// false
Для противоположности filled смотрите метод blank.
#info() {.collection-method}
Функция info записывает информацию в лог вашего приложения:
info('Полезная информация!');
В функцию также можно передать массив контекстных данных:
info('Попытка входа пользователя не удалась.', ['id' => $user->id]);
#logger() {.collection-method}
Функция logger используется для записи сообщения уровня debug в лог:
logger('Отладочное сообщение');
В функцию также можно передать массив контекстных данных:
logger('Пользователь вошёл в систему.', ['id' => $user->id]);
Если в функцию не передано значение, будет возвращён экземпляр logger:
logger()->error('Вам здесь нельзя.');
#method_field() {.collection-method}
Функция method_field создаёт HTML-поле hidden с поддельным значением HTTP-метода формы. Например, с использованием синтаксиса Blade:
<form method="POST">
{{ method_field('DELETE') }}
</form>
#now() {.collection-method}
Функция now создаёт новый экземпляр Illuminate\Support\Carbon с текущим временем:
$now = now();
#old() {.collection-method}
Функция old получает значение старого ввода, сохранённое в сессии:
$value = old('value');
$value = old('value', 'default');
Поскольку «значение по умолчанию», передаваемое вторым аргументом в функцию old, часто является свойством модели Eloquent, Laravel позволяет передать всю модель Eloquent вторым аргументом в old. В этом случае Laravel считает, что первый аргумент функции old — это имя свойства модели Eloquent, которое следует использовать как «значение по умолчанию»:
{{ old('name', $user->name) }}
// Эквивалентно...
{{ old('name', $user) }}
#optional() {.collection-method}
Функция optional принимает любой аргумент и позволяет обращаться к свойствам или вызывать методы этого объекта. Если переданный объект равен null, свойства и методы вернут null вместо ошибки:
return optional($user->address)->street;
{!! old('name', optional($user)->name) !!}
Функция optional также принимает замыкание в качестве второго аргумента. Замыкание будет вызвано, если значение, переданное первым аргументом, не равно null:
return optional(User::find($id), function (User $user) {
return $user->name;
});
#policy() {.collection-method}
Метод policy получает экземпляр политики для указанного класса:
$policy = policy(App\Models\User::class);
#redirect() {.collection-method}
Функция redirect возвращает HTTP-ответ с перенаправлением или возвращает экземпляр redirector, если вызвана без аргументов:
return redirect($to = null, $status = 302, $headers = [], $https = null);
return redirect('/home');
return redirect()->route('route.name');
#report() {.collection-method}
Функция report отправит исключение вашему обработчику исключений:
report($e);
Функция report также принимает строку в качестве аргумента. Если передать строку, функция создаст исключение с этой строкой в качестве сообщения:
report('Что-то пошло не так.');
#report_if() {.collection-method}
Функция report_if отправит исключение вашему обработчику исключений, если заданное условие истинно (true):
report_if($shouldReport, $e);
report_if($shouldReport, 'Что-то пошло не так.');
#report_unless() {.collection-method}
Функция report_unless отправит исключение вашему обработчику исключений, если переданное условие равно false:
report_unless($reportingDisabled, $e);
report_unless($reportingDisabled, 'Что-то пошло не так.');
#request() {.collection-method}
Функция request возвращает текущий экземпляр запроса или получает значение поля ввода из текущего запроса:
$request = request();
$value = request('key', $default);
#rescue() {.collection-method}
Функция rescue выполняет переданное замыкание и перехватывает любые исключения, возникшие во время его выполнения. Все перехваченные исключения будут отправлены вашему обработчику исключений; однако обработка запроса продолжится:
return rescue(function () {
return $this->method();
});
Вы также можете передать второй аргумент в функцию rescue. Этот аргумент будет «значением по умолчанию», которое вернётся, если при выполнении замыкания возникнет исключение:
return rescue(function () {
return $this->method();
}, false);
return rescue(function () {
return $this->method();
}, function () {
return $this->failure();
});
В функцию rescue можно передать аргумент report, чтобы определить, следует ли отправлять исключение в отчёт через функцию report:
return rescue(function () {
return $this->method();
}, report: function (Throwable $throwable) {
return $throwable instanceof InvalidArgumentException;
});
#resolve() {.collection-method}
Функция resolve разрешает заданное имя класса или интерфейса в экземпляр с помощью контейнера служб:
$api = resolve('HelpSpot\API');
#response() {.collection-method}
Функция response создаёт экземпляр response или получает экземпляр фабрики ответов:
return response('Hello World', 200, $headers);
return response()->json(['foo' => 'bar'], 200, $headers);
#retry() {.collection-method}
Функция retry пытается выполнить переданный колбэк до тех пор, пока не будет достигнут максимальный порог попыток. Если колбэк не выбрасывает исключение, возвращается его результат. Если колбэк выбрасывает исключение, попытка повторяется автоматически. Если количество попыток превышено, исключение выбрасывается.
return retry(5, function () {
// Попытаться 5 раз с паузой 100 мс между попытками...
}, 100);
Если вы хотите вручную вычислить количество миллисекунд для паузы между попытками, можно передать замыкание в качестве третьего аргумента функции retry:
use Exception;
return retry(5, function () {
// ...
}, function (int $attempt, Exception $exception) {
return $attempt * 100;
});
Для удобства можно передать массив в качестве первого аргумента функции retry. Этот массив будет использоваться для определения количества миллисекунд ожидания между попытками:
return retry([100, 200], function () {
// Подождать 100 мс при первой попытке, 200 мс при второй...
});
Чтобы повторять попытку только при определённых условиях, можно передать замыкание в качестве четвёртого аргумента функции retry:
use Exception;
return retry(5, function () {
// ...
}, 100, function (Exception $exception) {
return $exception instanceof RetryException;
});
#session() {.collection-method}
Функция session может использоваться для получения или установки значений сессии:
$value = session('key');
Вы можете задать значения, передав массив пар ключ / значение в функцию:
session(['chairs' => 7, 'instruments' => 3]);
Если в функцию не передано значение, будет возвращён хранилище сессии:
$value = session()->get('key');
session()->put('key', $value);
#tap() {.collection-method}
Функция tap принимает два аргумента: произвольное значение $value и замыкание. Значение $value передаётся в замыкание, а затем возвращается самой функцией tap. Возвращаемое значение замыкания не имеет значения:
$user = tap(User::first(), function (User $user) {
$user->name = 'taylor';
$user->save();
});
Если в функцию tap не передано замыкание, можно вызвать любой метод у переданного $value. Возвращаемым значением вызванного метода всегда будет $value, независимо от того, что метод возвращает в своей реализации. Например, метод update в Eloquent обычно возвращает целое число. Однако, мы можем заставить метод вернуть сам модель, вызвав update через функцию tap цепочкой:
$user = tap($user)->update([
'name' => $name,
'email' => $email,
]);
Чтобы добавить метод tap в класс, можно подключить трейт Illuminate\Support\Traits\Tappable к классу. Метод tap этого трейта принимает единственным аргументом замыкание. Сам экземпляр объекта будет передан в замыкание и затем возвращён методом tap:
return $user->tap(function (User $user) {
// ...
});
#throw_if() {.collection-method}
Функция throw_if выбрасывает указанное исключение, если заданное логическое выражение возвращает true:
throw_if(! Auth::user()->isAdmin(), AuthorizationException::class);
throw_if(
! Auth::user()->isAdmin(),
AuthorizationException::class,
'Вам не разрешён доступ к этой странице.'
);
#throw_unless() {.collection-method}
Функция throw_unless выбрасывает указанное исключение, если заданное логическое выражение оценивается как false:
throw_unless(Auth::user()->isAdmin(), AuthorizationException::class);
throw_unless(
Auth::user()->isAdmin(),
AuthorizationException::class,
'Вам не разрешён доступ к этой странице.'
);
#today() {.collection-method}
Функция today создаёт новый экземпляр Illuminate\Support\Carbon для текущей даты:
$today = today();
#trait_uses_recursive() {.collection-method}
Функция trait_uses_recursive возвращает все трейты, используемые трейтом:
$traits = trait_uses_recursive(\Illuminate\Notifications\Notifiable::class);
#transform() {.collection-method}
Функция transform выполняет замыкание над заданным значением, если значение не является пустым, и возвращает результат выполнения замыкания:
$callback = function (int $value) {
return $value * 2;
};
$result = transform(5, $callback);
// 10
В качестве третьего аргумента функции можно передать значение по умолчанию или замыкание. Это значение будет возвращено, если переданное значение пустое:
$result = transform(null, $callback, 'The value is blank');
// Значение пустое
#validator() {.collection-method}
Функция validator создаёт новый экземпляр валидатора с заданными аргументами. Её можно использовать как альтернативу фасаду Validator:
$validator = validator($data, $rules, $messages);
#value() {.collection-method}
Функция value возвращает переданное ей значение. Однако, если передать в функцию замыкание, оно будет выполнено, и вернётся его возвращаемое значение:
$result = value(true);
// true
$result = value(function () {
return false;
});
// false
Дополнительные аргументы можно передать в функцию value. Если первый аргумент — замыкание, дополнительные параметры будут переданы в это замыкание как аргументы, иначе они игнорируются:
$result = value(function (string $name) {
return $name;
}, 'Taylor');
// 'Taylor'
#view() {.collection-method}
Функция view получает экземпляр view:
return view('auth.login');
#with() {.collection-method}
Функция with возвращает переданное ей значение. Если в качестве второго аргумента передано замыкание, оно будет выполнено, и вернётся его возвращаемое значение:
$callback = function (mixed $value) {
return is_numeric($value) ? $value * 2 : 0;
};
$result = with(5, $callback);
// 10
$result = with(null, $callback);
// 0
$result = with(5, null);
// 5
#Другие утилиты
#Тестирование производительности
Иногда нужно быстро проверить производительность отдельных частей приложения. В таких случаях можно использовать вспомогательный класс Benchmark, чтобы измерить количество миллисекунд, за которое выполняются заданные колбэки:
<?php
use App\Models\User;
use Illuminate\Support\Benchmark;
Benchmark::dd(fn () => User::find(1)); // 0.1 мс
Benchmark::dd([
'Сценарий 1' => fn () => User::count(), // 0.5 мс
'Сценарий 2' => fn () => User::all()->count(), // 20.0 мс
]);
По умолчанию указанные колбэки будут выполнены один раз (одна итерация), а их продолжительность отобразится в браузере или консоли.
Чтобы вызвать колбэк несколько раз, можно указать количество итераций, в течение которых колбэк должен вызываться, вторым аргументом метода. При выполнении колбэка несколько раз класс Benchmark вернёт среднее количество миллисекунд, затраченных на выполнение колбэка за все итерации:
Benchmark::dd(fn () => User::count(), iterations: 10); // 0.5 мс
Иногда нужно измерить время выполнения колбэка и при этом получить значение, которое он возвращает. Метод value вернёт кортеж, содержащий возвращённое колбэком значение и количество миллисекунд, затраченных на выполнение колбэка:
[$count, $duration] = Benchmark::value(fn () => User::count());
#Даты
Laravel включает Carbon — мощную библиотеку для работы с датами и временем. Чтобы создать новый экземпляр Carbon, можно вызвать функцию now. Эта функция доступна глобально в вашем приложении Laravel:
$now = now();
Или вы можете создать новый экземпляр Carbon, используя класс Illuminate\Support\Carbon:
use Illuminate\Support\Carbon;
$now = Carbon::now();
Для подробного изучения Carbon и его возможностей обратитесь к официальной документации Carbon.
#Лотерея
Класс lottery в Laravel можно использовать для выполнения колбэков с заданной вероятностью. Это особенно полезно, когда нужно выполнить код только для части входящих запросов.
use Illuminate\Support\Lottery;
Lottery::odds(1, 20)
->winner(fn () => $user->won())
->loser(fn () => $user->lost())
->choose();
Вы можете использовать класс lottery Laravel вместе с другими возможностями Laravel. Например, можно настроить отчётность о медленных запросах только для небольшой части из них. Поскольку класс lottery вызываемый, его экземпляр можно передать в любой метод, принимающий вызываемые объекты (callables):
use Carbon\CarbonInterval;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Lottery;
DB::whenQueryingForLongerThan(
CarbonInterval::seconds(2),
Lottery::odds(1, 100)->winner(fn () => report('Запрос выполняется более 2 секунд.')),
);
#Тестирование лотерей
Laravel предоставляет несколько простых методов, которые позволяют легко тестировать вызовы лотерей в вашем приложении:
// Лотерея всегда выигрывает...
Lottery::alwaysWin();
// Лотерея всегда проигрывает...
Lottery::alwaysLose();
// Лотерея сначала выиграет, потом проиграет, и в конце вернётся к обычному поведению...
Lottery::fix([true, false]);
// Лотерея вернётся к обычному поведению...
Lottery::determineResultsNormally();
#Конвейер
Фасад Pipeline в Laravel предоставляет удобный способ «пропускать» заданный ввод через серию вызываемых классов, замыканий или колбэков, давая каждому классу возможность проверить или изменить ввод и вызвать следующий вызываемый элемент в конвейере:
use Closure;
use App\Models\User;
use Illuminate\Support\Facades\Pipeline;
$user = Pipeline::send($user)
->through([
function (User $user, Closure $next) {
// ...
return $next($user);
},
function (User $user, Closure $next) {
// ...
return $next($user);
},
])
->then(fn (User $user) => $user);
Как видите, каждому вызываемому классу или замыканию в конвейере передаются входные данные и замыкание $next. Вызов замыкания $next запускает следующий вызываемый элемент в конвейере. Как вы могли заметить, это очень похоже на middleware.
Когда последний вызываемый элемент в конвейере вызывает замыкание $next, будет вызван callable, переданный в метод then. Обычно этот callable просто возвращает переданный ему входной параметр.
Конечно, как уже было сказано, вы не ограничены передачей замыканий в pipeline. Можно также передавать вызываемые классы. Если указано имя класса, он будет создан через контейнер служб Laravel, что позволяет внедрять зависимости в вызываемый класс:
$user = Pipeline::send($user)
->through([
GenerateProfilePhoto::class,
ActivateSubscription::class,
SendWelcomeEmail::class,
])
->then(fn (User $user) => $user);
#Сон
Класс Sleep в Laravel — это лёгкая оболочка над встроенными функциями PHP sleep и usleep, обеспечивающая лучшую тестируемость и удобный для разработчика API для работы со временем:
use Illuminate\Support\Sleep;
$waiting = true;
while ($waiting) {
Sleep::for(1)->second();
$waiting = /* ... */;
}
Класс Sleep предоставляет различные методы для работы с разными единицами времени:
// Приостановить выполнение на 90 секунд...
Sleep::for(1.5)->minutes();
// Приостановить выполнение на 2 секунды...
Sleep::for(2)->seconds();
// Приостановить выполнение на 500 миллисекунд...
Sleep::for(500)->milliseconds();
// Приостановить выполнение на 5 000 микросекунд...
Sleep::for(5000)->microseconds();
// Приостановить выполнение до заданного времени...
Sleep::until(now()->addMinute());
// Псевдоним для встроенной функции PHP "sleep"...
Sleep::sleep(2);
// Псевдоним для встроенной функции PHP "usleep"...
Sleep::usleep(5000);
Чтобы легко объединять единицы времени, можно использовать метод and:
Sleep::for(1)->second()->and(10)->milliseconds();
#Тестирование Sleep
При тестировании кода, использующего класс Sleep или встроенные функции sleep в PHP, выполнение теста приостанавливается. Как можно ожидать, это значительно замедляет выполнение всего набора тестов. Например, представьте, что вы тестируете следующий код:
$waiting = /* ... */;
$seconds = 1;
while ($waiting) {
Sleep::for($seconds++)->seconds();
$waiting = /* ... */;
}
Обычно тестирование этого кода заняло бы как минимум одну секунду. К счастью, класс Sleep позволяет «подделать» ожидание, чтобы тесты выполнялись быстро:
public function test_it_waits_until_ready()
{
Sleep::fake();
// ...
}
При подмене класса Sleep реальная пауза выполнения пропускается, что значительно ускоряет тест.
После подмены класса Sleep можно делать проверки ожидаемых «пауза», которые должны были произойти. Чтобы показать это, представим, что мы тестируем код, который приостанавливает выполнение три раза, увеличивая паузу на одну секунду каждый раз. С помощью метода assertSequence можно проверить, что код «спал» нужное время, при этом тест остаётся быстрым:
public function test_it_checks_if_ready_four_times()
{
Sleep::fake();
// ...
Sleep::assertSequence([
Sleep::for(1)->second(),
Sleep::for(2)->seconds(),
Sleep::for(3)->seconds(),
]);
}
Конечно, класс Sleep предлагает множество других утверждений, которые можно использовать при тестировании:
use Carbon\CarbonInterval as Duration;
use Illuminate\Support\Sleep;
// Проверить, что sleep был вызван 3 раза...
Sleep::assertSleptTimes(3);
// Проверить длительность сна...
Sleep::assertSlept(function (Duration $duration): bool {
return /* ... */;
}, times: 1);
// Проверить, что класс Sleep никогда не вызывался...
Sleep::assertNeverSlept();
// Проверить, что даже если Sleep был вызван, выполнение не приостанавливалось...
Sleep::assertInsomniac();
Иногда полезно выполнять действие каждый раз, когда в коде приложения происходит имитация сна. Для этого можно передать колбэк в метод whenFakingSleep. В следующем примере мы используем хелперы для работы со временем Laravel, чтобы мгновенно продвинуть время на длительность каждого сна:
use Carbon\CarbonInterval as Duration;
$this->freezeTime();
Sleep::fake();
Sleep::whenFakingSleep(function (Duration $duration) {
// Продвинуть время при имитации сна...
$this->travel($duration->totalMilliseconds)->milliseconds();
});
Laravel использует класс Sleep внутри, когда приостанавливает выполнение. Например, хелпер retry применяет класс Sleep во время паузы, что улучшает тестируемость при использовании этого хелпера.