Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас

Хелпери

Вступ

Laravel містить чимало глобальних «хелперів» - PHP-функцій. Багато з них використовує сам фреймворк; проте ви вільні користуватися ними і у власних застосунках, якщо вважаєте їх зручними.

Доступні методи

Масиви та об'єкти

Числа

Шляхи

URL

Різне

Масиви та об'єкти

Arr::accessible()

Метод 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()

Метод Arr::add додає до масиву задану пару ключ / значення, якщо такого ключа в масиві ще немає або він має значення null:

use Illuminate\Support\Arr;

$array = Arr::add(['name' => 'Desk'], 'price', 100);

// ['name' => 'Desk', 'price' => 100]

$array = Arr::add(['name' => 'Desk', 'price' => null], 'price', 100);

// ['name' => 'Desk', 'price' => 100]

Arr::array()

Метод Arr::array дістає значення з глибоко вкладеного масиву за «крапковою» нотацією (так само, як Arr::get()), але викидає InvalidArgumentException, якщо запитане значення не є array:

use Illuminate\Support\Arr;

$array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']];

$value = Arr::array($array, 'languages');

// ['PHP', 'Ruby']

$value = Arr::array($array, 'name');

// throws InvalidArgumentException

Arr::boolean()

Метод Arr::boolean дістає значення з глибоко вкладеного масиву за «крапковою» нотацією (так само, як Arr::get()), але викидає InvalidArgumentException, якщо запитане значення не є boolean:

use Illuminate\Support\Arr;

$array = ['name' => 'Joe', 'available' => true];

$value = Arr::boolean($array, 'available');

// true

$value = Arr::boolean($array, 'name');

// throws InvalidArgumentException

Arr::collapse()

Метод 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()

Метод 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()

Метод Arr::divide повертає два масиви: один з ключами, другий зі значеннями заданого масиву:

use Illuminate\Support\Arr;

[$keys, $values] = Arr::divide(['name' => 'Desk']);

// $keys: ['name']

// $values: ['Desk']

Arr::dot()

Метод Arr::dot сплющує багатовимірний масив в одновимірний, використовуючи «крапкову» нотацію для позначення вкладеності:

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

$flattened = Arr::dot($array);

// ['products.desk.price' => 100]

Arr::every()

Метод Arr::every переконується, що всі значення масиву проходять заданий тест:

use Illuminate\Support\Arr;

$array = [1, 2, 3];

Arr::every($array, fn ($i) => $i > 0);

// true

Arr::every($array, fn ($i) => $i > 2);

// false

Arr::except()

Метод Arr::except вилучає з масиву задані пари ключ / значення:

use Illuminate\Support\Arr;

$array = ['name' => 'Desk', 'price' => 100];

$filtered = Arr::except($array, ['price']);

// ['name' => 'Desk']

Arr::exceptValues()

Метод Arr::exceptValues вилучає з масиву вказані значення:

use Illuminate\Support\Arr;

$array = ['foo', 'bar', 'baz', 'qux'];

$filtered = Arr::exceptValues($array, ['foo', 'baz']);

// ['bar', 'qux']

Ви також можете передати true в аргумент strict, щоб під час фільтрування використовувати строге порівняння типів:

use Illuminate\Support\Arr;

$array = [1, '1', 2, '2'];

$filtered = Arr::exceptValues($array, [1, 2], strict: true);

// ['1', '2']

Arr::exists()

Метод Arr::exists перевіряє, чи існує заданий ключ у переданому масиві:

use Illuminate\Support\Arr;

$array = ['name' => 'John Doe', 'age' => 17];

$exists = Arr::exists($array, 'name');

// true

$exists = Arr::exists($array, 'salary');

// false

Arr::first()

Метод 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()

Метод Arr::flatten сплющує багатовимірний масив в одновимірний:

use Illuminate\Support\Arr;

$array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']];

$flattened = Arr::flatten($array);

// ['Joe', 'PHP', 'Ruby']

Arr::float()

Метод Arr::float дістає значення з глибоко вкладеного масиву за «крапковою» нотацією (так само, як Arr::get()), але викидає InvalidArgumentException, якщо запитане значення не є float:

use Illuminate\Support\Arr;

$array = ['name' => 'Joe', 'balance' => 123.45];

$value = Arr::float($array, 'balance');

// 123.45

$value = Arr::float($array, 'name');

// throws InvalidArgumentException

Arr::forget()

Метод Arr::forget вилучає задані пари ключ / значення з глибоко вкладеного масиву за «крапковою» нотацією:

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

Arr::forget($array, 'products.desk');

// ['products' => []]

Arr::from()

Метод Arr::from перетворює різні типи вводу на звичайний PHP-масив. Він підтримує низку типів, зокрема масиви, об'єкти та кілька поширених інтерфейсів Laravel - Arrayable, Enumerable, Jsonable та JsonSerializable. Крім того, він обробляє екземпляри Traversable і WeakMap:

use Illuminate\Support\Arr;

Arr::from((object) ['foo' => 'bar']); // ['foo' => 'bar']

class TestJsonableObject implements Jsonable
{
    public function toJson($options = 0)
    {
        return json_encode(['foo' => 'bar']);
    }
}

Arr::from(new TestJsonableObject); // ['foo' => 'bar']

Arr::get()

Метод 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()

Метод 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']);

// false

Arr::hasAll()

Метод Arr::hasAll визначає, чи існують у заданому масиві всі вказані ключі, за «крапковою» нотацією:

use Illuminate\Support\Arr;

$array = ['name' => 'Taylor', 'language' => 'PHP'];

Arr::hasAll($array, ['name']); // true
Arr::hasAll($array, ['name', 'language']); // true
Arr::hasAll($array, ['name', 'IDE']); // false

Arr::hasAny()

Метод Arr::hasAny перевіряє, чи існує в масиві хоч один елемент із заданого набору, за «крапковою» нотацією:

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::integer()

Метод Arr::integer дістає значення з глибоко вкладеного масиву за «крапковою» нотацією (так само, як Arr::get()), але викидає InvalidArgumentException, якщо запитане значення не є int:

use Illuminate\Support\Arr;

$array = ['name' => 'Joe', 'age' => 42];

$value = Arr::integer($array, 'age');

// 42

$value = Arr::integer($array, 'name');

// throws InvalidArgumentException

Arr::isAssoc()

Метод Arr::isAssoc повертає true, якщо заданий масив є асоціативним. Масив вважається «асоціативним», якщо він не має послідовних числових ключів, що починаються з нуля:

use Illuminate\Support\Arr;

$isAssoc = Arr::isAssoc(['product' => ['name' => 'Desk', 'price' => 100]]);

// true

$isAssoc = Arr::isAssoc([1, 2, 3]);

// false

Arr::isList()

Метод 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()

Метод 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, and Livewire

Arr::keyBy()

Метод Arr::keyBy робить заданий ключ ключем масиву. Якщо кілька елементів мають однаковий ключ, у новому масиві залишиться тільки останній:

use Illuminate\Support\Arr;

$array = [
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
];

$keyed = Arr::keyBy($array, 'product_id');

/*
    [
        'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
        'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
    ]
*/

Arr::last()

Метод 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()

Метод 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::mapSpread()

Метод Arr::mapSpread проходить масив, передаючи значення кожного вкладеного елемента до заданого замикання. Замикання вільне змінити елемент і повернути його, утворюючи так новий масив змінених елементів:

use Illuminate\Support\Arr;

$array = [
    [0, 1],
    [2, 3],
    [4, 5],
    [6, 7],
    [8, 9],
];

$mapped = Arr::mapSpread($array, function (int $even, int $odd) {
    return $even + $odd;
});

/*
    [1, 5, 9, 13, 17]
*/

Arr::mapWithKeys()

Метод Arr::mapWithKeys проходить масив і передає кожне значення до заданого колбека. Колбек має повернути асоціативний масив з єдиною парою ключ / значення:

use Illuminate\Support\Arr;

$array = [
    [
        'name' => 'John',
        'department' => 'Sales',
        'email' => 'john@example.com',
    ],
    [
        'name' => 'Jane',
        'department' => 'Marketing',
        '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()

Метод Arr::only повертає із заданого масиву лише вказані пари ключ / значення:

use Illuminate\Support\Arr;

$array = ['name' => 'Desk', 'price' => 100, 'orders' => 10];

$slice = Arr::only($array, ['name', 'price']);

// ['name' => 'Desk', 'price' => 100]

Arr::onlyValues()

Метод Arr::onlyValues повертає з масиву лише вказані значення:

use Illuminate\Support\Arr;

$array = ['foo', 'bar', 'baz', 'qux'];

$filtered = Arr::onlyValues($array, ['foo', 'baz']);

// ['foo', 'baz']

Ви також можете передати true в аргумент strict, щоб під час фільтрування використовувати строге порівняння типів:

use Illuminate\Support\Arr;

$array = [1, '1', 2, '2'];

$filtered = Arr::onlyValues($array, [1, 2], strict: true);

// [1, 2]

Arr::partition()

Метод Arr::partition можна поєднати з деструктуризацією масивів PHP, щоб відділити елементи, які проходять заданий тест, від тих, які його не проходять:

<?php

use Illuminate\Support\Arr;

$numbers = [1, 2, 3, 4, 5, 6];

[$underThree, $equalOrAboveThree] = Arr::partition($numbers, function (int $i) {
    return $i < 3;
});

dump($underThree);

// [1, 2]

dump($equalOrAboveThree);

// [3, 4, 5, 6]

Arr::pluck()

Метод 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()

Метод Arr::prepend додає елемент на початок масиву:

use Illuminate\Support\Arr;

$array = ['one', 'two', 'three', 'four'];

$array = Arr::prepend($array, 'zero');

// ['zero', 'one', 'two', 'three', 'four']

За потреби ви можете вказати ключ, який слід використати для значення:

use Illuminate\Support\Arr;

$array = ['price' => 100];

$array = Arr::prepend($array, 'Desk', 'name');

// ['name' => 'Desk', 'price' => 100]

Arr::prependKeysWith()

Метод Arr::prependKeysWith додає заданий префікс до всіх назв ключів асоціативного масиву:

use Illuminate\Support\Arr;

$array = [
    'name' => 'Desk',
    'price' => 100,
];

$keyed = Arr::prependKeysWith($array, 'product.');

/*
    [
        'product.name' => 'Desk',
        'product.price' => 100,
    ]
*/

Arr::pull()

Метод 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::push()

Метод Arr::push додає елемент до масиву за «крапковою» нотацією. Якщо за заданим ключем масиву немає, його буде створено:

use Illuminate\Support\Arr;

$array = [];

Arr::push($array, 'office.furniture', 'Desk');

// $array: ['office' => ['furniture' => ['Desk']]]

Arr::query()

Метод 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()

Метод Arr::random повертає випадкове значення з масиву:

use Illuminate\Support\Arr;

$array = [1, 2, 3, 4, 5];

$random = Arr::random($array);

// 4 - (retrieved randomly)

Необов'язковим другим аргументом ви можете вказати кількість елементів, які слід повернути. Зверніть увагу: якщо передати цей аргумент, буде повернуто масив, навіть коли потрібен лише один елемент:

use Illuminate\Support\Arr;

$items = Arr::random($array, 2);

// [2, 5] - (retrieved randomly)

Arr::reject()

Метод Arr::reject вилучає елементи з масиву за допомогою заданого замикання:

use Illuminate\Support\Arr;

$array = [100, '200', 300, '400', 500];

$filtered = Arr::reject($array, function (string|int $value, int $key) {
    return is_string($value);
});

// [0 => 100, 2 => 300, 4 => 500]

Arr::select()

Метод Arr::select вибирає з масиву масив значень:

use Illuminate\Support\Arr;

$array = [
    ['id' => 1, 'name' => 'Desk', 'price' => 200],
    ['id' => 2, 'name' => 'Table', 'price' => 150],
    ['id' => 3, 'name' => 'Chair', 'price' => 300],
];

Arr::select($array, ['name', 'price']);

// [['name' => 'Desk', 'price' => 200], ['name' => 'Table', 'price' => 150], ['name' => 'Chair', 'price' => 300]]

Arr::set()

Метод Arr::set встановлює значення в глибоко вкладеному масиві за «крапковою» нотацією:

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

Arr::set($array, 'products.desk.price', 200);

// ['products' => ['desk' => ['price' => 200]]]

Arr::shuffle()

Метод Arr::shuffle випадково перемішує елементи масиву:

use Illuminate\Support\Arr;

$array = Arr::shuffle([1, 2, 3, 4, 5]);

// [3, 2, 5, 1, 4] - (generated randomly)

Arr::sole()

Метод Arr::sole дістає з масиву єдине значення за допомогою заданого замикання. Якщо заданий тест проходить більше ніж одне значення масиву, буде викинуто виняток Illuminate\Support\MultipleItemsFoundException. Якщо тест не проходить жодне значення, буде викинуто виняток Illuminate\Support\ItemNotFoundException:

use Illuminate\Support\Arr;

$array = ['Desk', 'Table', 'Chair'];

$value = Arr::sole($array, fn (string $value) => $value === 'Desk');

// 'Desk'

Arr::some()

Метод Arr::some переконується, що заданий тест проходить щонайменше одне значення масиву:

use Illuminate\Support\Arr;

$array = [1, 2, 3];

Arr::some($array, fn ($i) => $i > 2);

// true

Arr::sort()

Метод Arr::sort сортує масив за його значеннями:

use Illuminate\Support\Arr;

$array = ['Desk', 'Table', 'Chair'];

$sorted = Arr::sort($array);

// ['Chair', 'Desk', 'Table']

Ви також можете відсортувати масив за результатами заданого замикання:

use Illuminate\Support\Arr;

$array = [
    ['name' => 'Desk'],
    ['name' => 'Table'],
    ['name' => 'Chair'],
];

$sorted = array_values(Arr::sort($array, function (array $value) {
    return $value['name'];
}));

/*
    [
        ['name' => 'Chair'],
        ['name' => 'Desk'],
        ['name' => 'Table'],
    ]
*/

Arr::sortDesc()

Метод Arr::sortDesc сортує масив за його значеннями у спадному порядку:

use Illuminate\Support\Arr;

$array = ['Desk', 'Table', 'Chair'];

$sorted = Arr::sortDesc($array);

// ['Table', 'Desk', 'Chair']

Ви також можете відсортувати масив за результатами заданого замикання:

use Illuminate\Support\Arr;

$array = [
    ['name' => 'Desk'],
    ['name' => 'Table'],
    ['name' => 'Chair'],
];

$sorted = array_values(Arr::sortDesc($array, function (array $value) {
    return $value['name'];
}));

/*
    [
        ['name' => 'Table'],
        ['name' => 'Desk'],
        ['name' => 'Chair'],
    ]
*/

Arr::sortRecursive()

Метод 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::string()

Метод Arr::string дістає значення з глибоко вкладеного масиву за «крапковою» нотацією (так само, як Arr::get()), але викидає InvalidArgumentException, якщо запитане значення не є string:

use Illuminate\Support\Arr;

$array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']];

$value = Arr::string($array, 'name');

// Joe

$value = Arr::string($array, 'languages');

// throws InvalidArgumentException

Arr::take()

Метод 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()

Метод 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()

Метод Arr::toCssStyles умовно збирає рядок CSS-стилів. Метод приймає масив CSS-оголошень, де ключ масиву містить CSS-оголошення, яке ви хочете додати, а значення є булевим виразом. Якщо елемент масиву має числовий ключ, він завжди потрапить до зібраного рядка 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-компонента, а також директиви Blade @class.

Arr::undot()

Метод Arr::undot розгортає одновимірний масив з «крапковою» нотацією на багатовимірний:

use Illuminate\Support\Arr;

$array = [
    'user.name' => 'Kevin Malone',
    'user.occupation' => 'Accountant',
];

$array = Arr::undot($array);

// ['user' => ['name' => 'Kevin Malone', 'occupation' => 'Accountant']]

Arr::where()

Метод 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()

Метод Arr::whereNotNull вилучає із заданого масиву всі значення null:

use Illuminate\Support\Arr;

$array = [0, null];

$filtered = Arr::whereNotNull($array);

// [0 => 0]

Arr::wrap()

Метод Arr::wrap загортає задане значення в масив. Якщо задане значення вже є масивом, його буде повернуто без змін:

use Illuminate\Support\Arr;

$string = 'Laravel';

$array = Arr::wrap($string);

// ['Laravel']

Якщо задане значення - null, буде повернуто порожній масив:

use Illuminate\Support\Arr;

$array = Arr::wrap(null);

// []

data_fill()

Функція data_fill встановлює відсутнє значення у вкладеному масиві чи об'єкті за «крапковою» нотацією:

$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' => 'Desk 1', 'price' => 100],
        ['name' => 'Desk 2'],
    ],
];

data_fill($data, 'products.*.price', 200);

/*
    [
        'products' => [
            ['name' => 'Desk 1', 'price' => 100],
            ['name' => 'Desk 2', 'price' => 200],
        ],
    ]
*/

data_get()

Функція 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' => 'Desk 1', 'price' => 100],
    'product-two' => ['name' => 'Desk 2', 'price' => 150],
];

data_get($data, '*.name');

// ['Desk 1', 'Desk 2'];

Плейсхолдери {first} та {last} дозволяють дістати перший чи останній елементи масиву:

$flight = [
    'segments' => [
        ['from' => 'LHR', 'departure' => '9:00', 'to' => 'IST', 'arrival' => '15:00'],
        ['from' => 'IST', 'departure' => '16:00', 'to' => 'PKX', 'arrival' => '20:00'],
    ],
];

data_get($flight, 'segments.{first}.arrival');

// 15:00

data_set()

Функція data_set встановлює значення у вкладеному масиві чи об'єкті за «крапковою» нотацією:

$data = ['products' => ['desk' => ['price' => 100]]];

data_set($data, 'products.desk.price', 200);

// ['products' => ['desk' => ['price' => 200]]]

Ця функція також приймає підстановки у вигляді зірочок і встановить значення в цілі відповідно:

$data = [
    'products' => [
        ['name' => 'Desk 1', 'price' => 100],
        ['name' => 'Desk 2', 'price' => 150],
    ],
];

data_set($data, 'products.*.price', 200);

/*
    [
        'products' => [
            ['name' => 'Desk 1', 'price' => 200],
            ['name' => 'Desk 2', 'price' => 200],
        ],
    ]
*/

За замовчуванням будь-які наявні значення перезаписуються. Якщо ви хочете встановити значення, лише коли його ще немає, передайте четвертим аргументом функції false:

$data = ['products' => ['desk' => ['price' => 100]]];

data_set($data, 'products.desk.price', 200, overwrite: false);

// ['products' => ['desk' => ['price' => 100]]]

data_forget()

Функція data_forget вилучає значення з вкладеного масиву чи об'єкта за «крапковою» нотацією:

$data = ['products' => ['desk' => ['price' => 100]]];

data_forget($data, 'products.desk.price');

// ['products' => ['desk' => []]]

Ця функція також приймає підстановки у вигляді зірочок і вилучить значення в цілі відповідно:

$data = [
    'products' => [
        ['name' => 'Desk 1', 'price' => 100],
        ['name' => 'Desk 2', 'price' => 150],
    ],
];

data_forget($data, 'products.*.price');

/*
    [
        'products' => [
            ['name' => 'Desk 1'],
            ['name' => 'Desk 2'],
        ],
    ]
*/

head()

Функція head повертає перший елемент заданого масиву. Якщо масив порожній, буде повернуто false:

$array = [100, 200, 300];

$first = head($array);

// 100

last()

Функція last повертає останній елемент заданого масиву. Якщо масив порожній, буде повернуто false:

$array = [100, 200, 300];

$last = last($array);

// 300

Числа

Number::abbreviate()

Метод Number::abbreviate повертає зручний для читання формат переданого числового значення зі скороченням одиниць:

use Illuminate\Support\Number;

$number = Number::abbreviate(1000);

// 1K

$number = Number::abbreviate(489939);

// 490K

$number = Number::abbreviate(1230000, precision: 2);

// 1.23M

Number::clamp()

Метод 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()

Метод Number::currency повертає рядкове представлення заданого значення у вигляді валюти:

use Illuminate\Support\Number;

$currency = Number::currency(1000);

// $1,000.00

$currency = Number::currency(1000, in: 'EUR');

// €1,000.00

$currency = Number::currency(1000, in: 'EUR', locale: 'de');

// 1.000,00 €

$currency = Number::currency(1000, in: 'EUR', locale: 'de', precision: 0);

// 1.000 €

Number::defaultCurrency()

Метод Number::defaultCurrency повертає валюту за замовчуванням, яку використовує клас Number:

use Illuminate\Support\Number;

$currency = Number::defaultCurrency();

// USD

Number::defaultLocale()

Метод Number::defaultLocale повертає локаль за замовчуванням, яку використовує клас Number:

use Illuminate\Support\Number;

$locale = Number::defaultLocale();

// en

Number::fileSize()

Метод Number::fileSize повертає рядкове представлення заданої кількості байтів у вигляді розміру файлу:

use Illuminate\Support\Number;

$size = Number::fileSize(1024);

// 1 KB

$size = Number::fileSize(1024 * 1024);

// 1 MB

$size = Number::fileSize(1024, precision: 2);

// 1.00 KB

Number::forHumans()

Метод Number::forHumans повертає зручний для читання формат переданого числового значення:

use Illuminate\Support\Number;

$number = Number::forHumans(1000);

// 1 thousand

$number = Number::forHumans(489939);

// 490 thousand

$number = Number::forHumans(1230000, precision: 2);

// 1.23 million

Number::format()

Метод 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()

Метод Number::ordinal повертає порядкове представлення числа:

use Illuminate\Support\Number;

$number = Number::ordinal(1);

// 1st

$number = Number::ordinal(2);

// 2nd

$number = Number::ordinal(21);

// 21st

Number::pairs()

Метод Number::pairs генерує масив пар чисел (піддіапазонів) на основі заданого діапазону й кроку. Цей метод стане в пригоді, коли треба розділити великий діапазон чисел на менші, зручні піддіапазони - наприклад, для пагінації чи пакетної обробки. Метод pairs повертає масив масивів, де кожен внутрішній масив представляє пару (піддіапазон) чисел:

use Illuminate\Support\Number;

$result = Number::pairs(25, 10);

// [[0, 9], [10, 19], [20, 25]]

$result = Number::pairs(25, 10, offset: 0);

// [[0, 10], [10, 20], [20, 25]]

Number::parse()

Метод Number::parse розбирає локалізований числовий рядок за допомогою PHP-класу NumberFormatter:

use Illuminate\Support\Number;

$result = Number::parse('10,123', locale: 'en');

// 10123.0

$result = Number::parse('10,123', locale: 'fr');

// 10.123

Number::parseInt()

Метод Number::parseInt розбирає рядок на ціле число відповідно до вказаної локалі:

use Illuminate\Support\Number;

$result = Number::parseInt('10.123');

// (int) 10

$result = Number::parseInt('10,123', locale: 'fr');

// (int) 10

Number::parseFloat()

Метод Number::parseFloat розбирає рядок на число з рухомою комою відповідно до вказаної локалі:

use Illuminate\Support\Number;

$result = Number::parseFloat('10');

// (float) 10.0

$result = Number::parseFloat('10', locale: 'fr');

// (float) 10.0

Number::percentage()

Метод 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()

Метод Number::spell перетворює задане число на рядок зі слів:

use Illuminate\Support\Number;

$number = Number::spell(102);

// one hundred and two

$number = Number::spell(88, locale: 'fr');

// quatre-vingt-huit

Аргумент after дозволяє вказати значення, після якого всі числа слід писати словами:

$number = Number::spell(10, after: 10);

// 10

$number = Number::spell(11, after: 10);

// eleven

Аргумент until дозволяє вказати значення, до якого всі числа слід писати словами:

$number = Number::spell(5, until: 10);

// five

$number = Number::spell(10, until: 10);

// 10

Number::spellOrdinal()

Метод Number::spellOrdinal повертає порядкове представлення числа у вигляді рядка зі слів:

use Illuminate\Support\Number;

$number = Number::spellOrdinal(1);

// first

$number = Number::spellOrdinal(2);

// second

$number = Number::spellOrdinal(21);

// twenty-first

Number::trim()

Метод Number::trim вилучає всі кінцеві нулі після десяткової крапки заданого числа:

use Illuminate\Support\Number;

$number = Number::trim(12.0);

// 12

$number = Number::trim(12.30);

// 12.3

Number::useLocale()

Метод Number::useLocale глобально задає локаль чисел за замовчуванням, що впливає на форматування чисел і валюти під час наступних викликів методів класу Number:

use Illuminate\Support\Number;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Number::useLocale('de');
}

Number::withLocale()

Метод Number::withLocale виконує задане замикання із вказаною локаллю, а після виконання колбека відновлює оригінальну локаль:

use Illuminate\Support\Number;

$number = Number::withLocale('de', function () {
    return Number::format(1500);
});

Number::useCurrency()

Метод Number::useCurrency глобально задає валюту чисел за замовчуванням, що впливає на форматування валюти під час наступних викликів методів класу Number:

use Illuminate\Support\Number;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Number::useCurrency('GBP');
}

Number::withCurrency()

Метод Number::withCurrency виконує задане замикання із вказаною валютою, а після виконання колбека відновлює оригінальну валюту:

use Illuminate\Support\Number;

$number = Number::withCurrency('GBP', function () {
    // ...
});

Шляхи

app_path()

Функція app_path повертає повний шлях до каталогу app вашого застосунку. Ви також можете скористатися функцією app_path, щоб згенерувати повний шлях до файлу відносно каталогу застосунку:

$path = app_path();

$path = app_path('Http/Controllers/Controller.php');

base_path()

Функція base_path повертає повний шлях до кореневого каталогу вашого застосунку. Ви також можете скористатися функцією base_path, щоб згенерувати повний шлях до заданого файлу відносно кореня проєкту:

$path = base_path();

$path = base_path('vendor/bin');

config_path()

Функція config_path повертає повний шлях до каталогу config вашого застосунку. Ви також можете скористатися функцією config_path, щоб згенерувати повний шлях до заданого файлу в каталозі конфігурації застосунку:

$path = config_path();

$path = config_path('app.php');

database_path()

Функція database_path повертає повний шлях до каталогу database вашого застосунку. Ви також можете скористатися функцією database_path, щоб згенерувати повний шлях до заданого файлу в каталозі бази даних:

$path = database_path();

$path = database_path('factories/UserFactory.php');

lang_path()

Функція lang_path повертає повний шлях до каталогу lang вашого застосунку. Ви також можете скористатися функцією lang_path, щоб згенерувати повний шлях до заданого файлу в цьому каталозі:

$path = lang_path();

$path = lang_path('en/messages.php');

За замовчуванням каркас застосунку Laravel не містить каталогу lang. Якщо ви хочете налаштувати мовні файли Laravel, опублікуйте їх командою Artisan lang:publish.

public_path()

Функція public_path повертає повний шлях до каталогу public вашого застосунку. Ви також можете скористатися функцією public_path, щоб згенерувати повний шлях до заданого файлу в каталозі public:

$path = public_path();

$path = public_path('css/app.css');

resource_path()

Функція resource_path повертає повний шлях до каталогу resources вашого застосунку. Ви також можете скористатися функцією resource_path, щоб згенерувати повний шлях до заданого файлу в каталозі resources:

$path = resource_path();

$path = resource_path('sass/app.scss');

storage_path()

Функція storage_path повертає повний шлях до каталогу storage вашого застосунку. Ви також можете скористатися функцією storage_path, щоб згенерувати повний шлях до заданого файлу в каталозі storage:

$path = storage_path();

$path = storage_path('app/file.txt');

URL

action()

Функція action генерує URL для заданої дії контролера:

use App\Http\Controllers\HomeController;

$url = action([HomeController::class, 'index']);

Якщо метод приймає параметри маршруту, передайте їх другим аргументом:

$url = action([UserController::class, 'profile'], ['id' => 1]);

asset()

Функція 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()

Функція 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()

Функція secure_asset генерує URL для ресурсу через HTTPS:

$url = secure_asset('img/photo.jpg');

secure_url()

Функція secure_url генерує повний HTTPS-URL до заданого шляху. Додаткові сегменти URL можна передати другим аргументом функції:

$url = secure_url('user/profile');

$url = secure_url('user/profile', [1]);

to_action()

Функція to_action генерує HTTP-відповідь із перенаправленням для заданої дії контролера:

use App\Http\Controllers\UserController;

return to_action([UserController::class, 'show'], ['user' => 1]);

За потреби ви можете передати третім і четвертим аргументами методу to_action HTTP-статус, який слід призначити перенаправленню, і будь-які додаткові заголовки відповіді:

return to_action(
    [UserController::class, 'show'],
    ['user' => 1],
    302,
    ['X-Framework' => 'Laravel']
);

to_route()

Функція to_route генерує HTTP-відповідь із перенаправленням для заданого іменованого маршруту:

return to_route('users.show', ['user' => 1]);

За потреби ви можете передати третім і четвертим аргументами методу to_route HTTP-статус, який слід призначити перенаправленню, і будь-які додаткові заголовки відповіді:

return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);

uri()

Функція uri генерує плавний екземпляр URI для заданого URI:

$uri = uri('https://example.com')
    ->withPath('/users')
    ->withQuery(['page' => 1]);

Якщо функції uri передано масив із парою «контролер - метод», яку можна викликати, функція створить екземпляр Uri для шляху маршруту цього методу контролера:

use App\Http\Controllers\UserController;

$uri = uri([UserController::class, 'show'], ['user' => $user]);

Якщо контролер викликаємий, ви можете просто передати назву його класу:

use App\Http\Controllers\UserIndexController;

$uri = uri(UserIndexController::class);

Якщо значення, передане функції uri, збігається з іменем іменованого маршруту, буде згенеровано екземпляр Uri для шляху цього маршруту:

$uri = uri('users.show', ['user' => $user]);

url()

Функція url генерує повний URL до заданого шляху:

$url = url('user/profile');

$url = url('user/profile', [1]);

Якщо шлях не передано, повертається екземпляр Illuminate\Routing\UrlGenerator:

$current = url()->current();

$full = url()->full();

$previous = url()->previous();

Докладніше про роботу з функцією url читайте в документації з генерації URL.

Різне

abort()

Функція abort викидає HTTP-виняток, який відрендерить обробник винятків:

abort(403);

Ви також можете передати повідомлення винятку й власні заголовки HTTP-відповіді, які слід надіслати браузеру:

abort(403, 'Unauthorized.', $headers);

abort_if()

Функція abort_if викидає HTTP-виняток, якщо заданий булевий вираз дає true:

abort_if(! Auth::user()->isAdmin(), 403);

Як і методу abort, ви можете передати функції третім аргументом текст відповіді винятку, а четвертим - масив власних заголовків відповіді.

abort_unless()

Функція abort_unless викидає HTTP-виняток, якщо заданий булевий вираз дає false:

abort_unless(Auth::user()->isAdmin(), 403);

Як і методу abort, ви можете передати функції третім аргументом текст відповіді винятку, а четвертим - масив власних заголовків відповіді.

app()

Функція app повертає екземпляр сервіс-контейнера:

$container = app();

Ви можете передати назву класу чи інтерфейсу, щоб розв'язати його з контейнера:

$api = app('HelpSpot\API');

auth()

Функція auth повертає екземпляр автентифікатора. Ви можете скористатися нею як альтернативою фасаду Auth:

$user = auth()->user();

За потреби ви можете вказати, до якого гарда хочете звернутися:

$user = auth('admin')->user();

back()

Функція back генерує HTTP-відповідь із перенаправленням на попереднє місце користувача:

return back($status = 302, $headers = [], $fallback = '/');

return back();

bcrypt()

Функція bcrypt хешує задане значення алгоритмом Bcrypt. Ви можете скористатися цією функцією як альтернативою фасаду Hash:

$password = bcrypt('my-secret-password');

blank()

Функція blank визначає, чи є задане значення «порожнім»:

blank('');
blank('   ');
blank(null);
blank(collect());

// true

blank(0);
blank(true);
blank(false);

// false

Протилежність blank - функція filled.

broadcast()

Функція broadcast надсилає задану подію її слухачам:

broadcast(new UserRegistered($user));

broadcast(new UserRegistered($user))->toOthers();

broadcast_if()

Функція broadcast_if надсилає задану подію її слухачам, якщо заданий булевий вираз дає true:

broadcast_if($user->isActive(), new UserRegistered($user));

broadcast_if($user->isActive(), new UserRegistered($user))->toOthers();

broadcast_unless()

Функція broadcast_unless надсилає задану подію її слухачам, якщо заданий булевий вираз дає false:

broadcast_unless($user->isBanned(), new UserRegistered($user));

broadcast_unless($user->isBanned(), new UserRegistered($user))->toOthers();

cache()

Функція cache дозволяє отримувати значення з кешу. Якщо заданого ключа в кеші немає, буде повернуто необов'язкове значення за замовчуванням:

$value = cache('key');

$value = cache('key', 'default');

Ви можете додавати елементи до кешу, передавши функції масив пар ключ / значення. Також слід передати кількість секунд або тривалість, протягом якої закешоване значення вважатиметься дійсним:

cache(['key' => 'value'], 300);

cache(['key' => 'value'], now()->plus(seconds: 10));

class_uses_recursive()

Функція class_uses_recursive повертає всі трейти, які використовує клас, включно з трейтами всіх його батьківських класів:

$traits = class_uses_recursive(App\Models\User::class);

collect()

Функція collect створює екземпляр колекції із заданого значення:

$collection = collect(['Taylor', 'Abigail']);

config()

Функція config отримує значення змінної конфігурації. До значень конфігурації звертаються за «крапковим» синтаксисом, який містить назву файлу та потрібну опцію. Ви також можете передати значення за замовчуванням, яке буде повернуто, якщо опції конфігурації не існує:

$value = config('app.timezone');

$value = config('app.timezone', $default);

Ви можете задавати змінні конфігурації під час виконання, передавши масив пар ключ / значення. Проте зауважте: ця функція впливає лише на значення конфігурації для поточного запиту й не оновлює ваших справжніх значень конфігурації:

config(['app.debug' => true]);

context()

Функція context отримує значення з поточного контексту. Ви також можете передати значення за замовчуванням, яке буде повернуто, якщо ключа контексту не існує:

$value = context('trace_id');

$value = context('trace_id', $default);

Ви можете задавати значення контексту, передавши масив пар ключ / значення:

use Illuminate\Support\Str;

context(['trace_id' => Str::uuid()->toString()]);

Функція cookie створює новий екземпляр cookie:

$cookie = cookie('name', 'value', $minutes);

csrf_field()

Функція csrf_field генерує HTML-поле hidden зі значенням CSRF-токена. Наприклад, із синтаксисом Blade:

{{ csrf_field() }}

csrf_token()

Функція csrf_token дістає значення поточного CSRF-токена:

$token = csrf_token();

decrypt()

Функція decrypt розшифровує задане значення. Ви можете скористатися цією функцією як альтернативою фасаду Crypt:

$password = decrypt($value);

Протилежність decrypt - функція encrypt.

dd()

Функція dd виводить задані змінні та припиняє виконання скрипта:

dd($value);

dd($value1, $value2, $value3, ...);

Якщо ви не хочете зупиняти виконання скрипта, скористайтеся натомість функцією dump.

dispatch()

Функція dispatch кладе задане завдання до черги завдань Laravel:

dispatch(new App\Jobs\SendEmails);

dispatch_sync()

Функція dispatch_sync кладе задане завдання до черги sync, тож воно обробляється негайно:

dispatch_sync(new App\Jobs\SendEmails);

dump()

Функція dump виводить задані змінні:

dump($value);

dump($value1, $value2, $value3, ...);

Якщо ви хочете припинити виконання скрипта після виведення змінних, скористайтеся натомість функцією dd.

encrypt()

Функція encrypt шифрує задане значення. Ви можете скористатися цією функцією як альтернативою фасаду Crypt:

$secret = encrypt('my-secret-value');

Протилежність encrypt - функція decrypt.

env()

Функція env дістає значення змінної середовища або повертає значення за замовчуванням:

$env = env('APP_ENV');

$env = env('APP_ENV', 'production');

Якщо під час розгортання ви виконуєте команду config:cache, переконайтеся, що викликаєте функцію env лише у файлах конфігурації. Щойно конфігурацію закешовано, файл .env не завантажується, і всі виклики функції env повертатимуть зовнішні змінні середовища - на рівні сервера чи системи - або null.

event()

Функція event диспетчеризує задану подію її слухачам:

event(new UserRegistered($user));

fake()

Функція 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. Зазвичай цю опцію задають через змінну середовища APP_FAKER_LOCALE. Ви також можете вказати локаль, передавши її функції fake. Для кожної локалі буде розв'язано окремий сінглтон:

fake('nl_NL')->name()

filled()

Функція filled визначає, чи не є задане значення «порожнім»:

filled(0);
filled(true);
filled(false);

// true

filled('');
filled('   ');
filled(null);
filled(collect());

// false

Протилежність filled - функція blank.

info()

Функція info запише інформацію до логу вашого застосунку:

info('Some helpful information!');

Функції також можна передати масив контекстних даних:

info('User login attempt failed.', ['id' => $user->id]);

literal()

Функція literal створює новий екземпляр stdClass, де задані іменовані аргументи стають властивостями:

$obj = literal(
    name: 'Joe',
    languages: ['PHP', 'Ruby'],
);

$obj->name; // 'Joe'
$obj->languages; // ['PHP', 'Ruby']

logger()

Функція logger дозволяє записати до логу повідомлення рівня debug:

logger('Debug message');

Функції також можна передати масив контекстних даних:

logger('User has logged in.', ['id' => $user->id]);

Якщо функції не передано значення, буде повернуто екземпляр логера:

logger()->error('You are not allowed here.');

method_field()

Функція method_field генерує HTML-поле hidden, яке містить підмінене значення HTTP-дієслова форми. Наприклад, із синтаксисом Blade:

<form method="POST">
    {{ method_field('DELETE') }}
</form>

now()

Функція now створює новий екземпляр Illuminate\Support\Carbon для поточного часу:

$now = now();

old()

Функція old дістає значення старого вводу, збереженого в сесії:

$value = old('value');

$value = old('value', 'default');

Оскільки «значення за замовчуванням», яке передають другим аргументом функції old, часто є атрибутом моделі Eloquent, Laravel дозволяє просто передати другим аргументом усю модель Eloquent. У такому разі Laravel вважатиме, що перший аргумент функції old - це назва атрибута Eloquent, який слід узяти за «значення за замовчуванням»:

{{ old('name', $user->name) }}

// Is equivalent to...

{{ old('name', $user) }}

once()

Функція once виконує заданий колбек і кешує результат у пам'яті на час запиту. Будь-які наступні виклики функції once з тим самим колбеком повертатимуть раніше закешований результат:

function random(): int
{
    return once(function () {
        return random_int(1, 1000);
    });
}

random(); // 123
random(); // 123 (cached result)
random(); // 123 (cached result)

Коли функцію once виконано зсередини екземпляра об'єкта, закешований результат буде унікальним для цього екземпляра:

<?php

class NumberService
{
    public function all(): array
    {
        return once(fn () => [1, 2, 3]);
    }
}

$service = new NumberService;

$service->all();
$service->all(); // (cached result)

$secondService = new NumberService;

$secondService->all();
$secondService->all(); // (cached result)

optional()

Функція 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()

Метод policy дістає екземпляр політики для заданого класу:

$policy = policy(App\Models\User::class);

redirect()

Функція redirect повертає HTTP-відповідь із перенаправленням або, якщо викликана без аргументів, екземпляр редиректора:

return redirect($to = null, $status = 302, $headers = [], $secure = null);

return redirect('/home');

return redirect()->route('route.name');

report()

Функція report повідомить про виняток через ваш обробник винятків:

report($e);

Функція report також приймає рядок як аргумент. Коли функції передано рядок, вона створить виняток із цим рядком як повідомленням:

report('Something went wrong.');

report_if()

Функція report_if повідомить про виняток через ваш обробник винятків, якщо заданий булевий вираз дає true:

report_if($shouldReport, $e);

report_if($shouldReport, 'Something went wrong.');

report_unless()

Функція report_unless повідомить про виняток через ваш обробник винятків, якщо заданий булевий вираз дає false:

report_unless($reportingDisabled, $e);

report_unless($reportingDisabled, 'Something went wrong.');

request()

Функція request повертає поточний екземпляр запиту або дістає значення поля вводу з поточного запиту:

$request = request();

$value = request('key', $default);

rescue()

Функція 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()

Функція resolve розв'язує задану назву класу чи інтерфейсу в екземпляр через сервіс-контейнер:

$api = resolve('HelpSpot\API');

response()

Функція response створює екземпляр відповіді або отримує екземпляр фабрики відповідей:

return response('Hello World', 200, $headers);

return response()->json(['foo' => 'bar'], 200, $headers);

retry()

Функція retry намагається виконати заданий колбек, доки не буде досягнуто заданої максимальної кількості спроб. Якщо колбек не викидає винятку, буде повернуто його значення. Якщо колбек викидає виняток, спробу буде автоматично повторено. Якщо максимальну кількість спроб перевищено, виняток буде викинуто:

return retry(5, function () {
    // Attempt 5 times while resting 100ms between attempts...
}, 100);

Тривалість паузи також приймає екземпляр CarbonInterval:

use function Illuminate\Support\seconds;

return retry(5, function () {
    // Attempt 5 times while resting 5 seconds between attempts...
}, seconds(5));

Якщо ви хочете вручну обчислювати кількість мілісекунд паузи між спробами, передайте третім аргументом функції retry замикання:

use Exception;

return retry(5, function () {
    // ...
}, function (int $attempt, Exception $exception) {
    return $attempt * 100;
});

Для зручності ви можете передати першим аргументом функції retry масив. За цим масивом визначатиметься, скільки мілісекунд чекати між наступними спробами:

return retry([100, 200], function () {
    // Sleep for 100ms on first retry, 200ms on second retry...
});

Щоб повторювати спроби лише за певних умов, передайте четвертим аргументом функції retry замикання:

use App\Exceptions\TemporaryException;
use Exception;

return retry(5, function () {
    // ...
}, 100, function (Exception $exception) {
    return $exception instanceof TemporaryException;
});

session()

Функція session дозволяє отримувати або задавати значення сесії:

$value = session('key');

Ви можете задавати значення, передавши функції масив пар ключ / значення:

session(['chairs' => 7, 'instruments' => 3]);

Якщо функції не передано значення, буде повернуто сховище сесії:

$value = session()->get('key');

session()->put('key', $value);

tap()

Функція tap приймає два аргументи: довільне $value і замикання. $value буде передано до замикання, а потім повернуто функцією tap. Значення, яке повертає замикання, не має значення:

$user = tap(User::first(), function (User $user) {
    $user->name = 'Taylor';

    $user->save();
});

Якщо функції tap не передано замикання, ви можете викликати будь-який метод на заданому $value. Значенням, яке поверне викликаний метод, завжди буде $value, незалежно від того, що метод справді повертає у своєму описі. Наприклад, метод Eloquent update зазвичай повертає ціле число. Проте ми можемо змусити метод повернути саму модель, зробивши виклик update ланцюжком через функцію tap:

$user = tap($user)->update([
    'name' => $name,
    'email' => $email,
]);

Щоб додати до класу метод tap, додайте до нього трейт Illuminate\Support\Traits\Tappable. Метод tap цього трейта приймає єдиним аргументом Closure. Сам екземпляр об'єкта буде передано до Closure, а потім повернуто методом tap:

return $user->tap(function (User $user) {
    // ...
});

throw_if()

Функція throw_if викидає заданий виняток, якщо заданий булевий вираз дає true:

throw_if(! Auth::user()->isAdmin(), AuthorizationException::class);

throw_if(
    ! Auth::user()->isAdmin(),
    AuthorizationException::class,
    'You are not allowed to access this page.'
);

throw_unless()

Функція throw_unless викидає заданий виняток, якщо заданий булевий вираз дає false:

throw_unless(Auth::user()->isAdmin(), AuthorizationException::class);

throw_unless(
    Auth::user()->isAdmin(),
    AuthorizationException::class,
    'You are not allowed to access this page.'
);

today()

Функція today створює новий екземпляр Illuminate\Support\Carbon для поточної дати:

$today = today();

trait_uses_recursive()

Функція trait_uses_recursive повертає всі трейти, які використовує трейт:

$traits = trait_uses_recursive(\Illuminate\Notifications\Notifiable::class);

transform()

Функція transform виконує замикання над заданим значенням, якщо воно не порожнє, і повертає значення, яке повернуло замикання:

$callback = function (int $value) {
    return $value * 2;
};

$result = transform(5, $callback);

// 10

Третім аргументом функції можна передати значення за замовчуванням або замикання. Його буде повернуто, якщо задане значення порожнє:

$result = transform(null, $callback, 'The value is blank');

// The value is blank

validator()

Функція validator створює новий екземпляр валідатора із заданими аргументами. Ви можете скористатися нею як альтернативою фасаду Validator:

$validator = validator($data, $rules, $messages);

value()

Функція value повертає передане їй значення. Проте, якщо ви передасте функції замикання, воно буде виконане, і буде повернуто його результат:

$result = value(true);

// true

$result = value(function () {
    return false;
});

// false

Функції value можна передати додаткові аргументи. Якщо перший аргумент - замикання, додаткові параметри буде передано замиканню як аргументи, інакше їх буде проігноровано:

$result = value(function (string $name) {
    return $name;
}, 'Taylor');

// 'Taylor'

view()

Функція view дістає екземпляр представлення:

return view('auth.login');

with()

Функція 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

when()

Функція when повертає передане їй значення, якщо задана умова дає true. Інакше повертається null. Якщо другим аргументом функції передано замикання, воно буде виконане, і буде повернуто його результат:

$value = when(true, 'Hello World');

$value = when(true, fn () => 'Hello World');

Функція when насамперед корисна для умовного рендерингу HTML-атрибутів:

<div {!! when($condition, 'wire:poll="calculate"') !!}>
    ...
</div>

Інші утиліти

Бенчмаркінг

Інколи вам може захотітися швидко перевірити швидкодію певних частин застосунку. У таких випадках скористайтеся допоміжним класом Benchmark, щоб виміряти, скільки мілісекунд потрібно заданим колбекам на виконання:

<?php

use App\Models\User;
use Illuminate\Support\Benchmark;

Benchmark::dd(fn () => User::find(1)); // 0.1 ms

Benchmark::dd([
    'Scenario 1' => fn () => User::count(), // 0.5 ms
    'Scenario 2' => fn () => User::all()->count(), // 20.0 ms
]);

За замовчуванням задані колбеки виконуються один раз (одна ітерація), а їхня тривалість відображається в браузері / консолі.

Щоб викликати колбек більше одного разу, вкажіть другим аргументом методу кількість ітерацій. Коли колбек виконується кілька разів, клас Benchmark поверне середню кількість мілісекунд, витрачених на його виконання по всіх ітераціях:

Benchmark::dd(fn () => User::count(), iterations: 10); // 0.5 ms

Інколи вам може захотітися виміряти виконання колбека й водночас отримати значення, яке він повертає. Метод 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();

Laravel також розширює екземпляри Carbon методами plus і minus, які дозволяють легко змінювати дату й час екземпляра:

return now()->plus(minutes: 5);
return now()->plus(hours: 8);
return now()->plus(weeks: 4);

return now()->minus(minutes: 5);
return now()->minus(hours: 8);
return now()->minus(weeks: 4);

Докладний огляд Carbon і його можливостей ви знайдете в офіційній документації Carbon.

Функції інтервалів

Laravel також пропонує функції milliseconds, seconds, minutes, hours, days, weeks, months та years, які повертають екземпляри CarbonInterval, що розширюють PHP-клас DateInterval. Ці функції можна використовувати всюди, де Laravel приймає екземпляр DateInterval:

use Illuminate\Support\Facades\Cache;

use function Illuminate\Support\{minutes};

Cache::put('metrics', $metrics, minutes(10));

Відкладені функції

Хоч завдання в черзі Laravel і дозволяють ставити задачі в чергу на фонову обробку, інколи у вас є прості задачі, які хочеться відкласти, не налаштовуючи й не підтримуючи довгограючого воркера черги.

Відкладені функції дозволяють відкласти виконання замикання до моменту, коли HTTP-відповідь уже надіслано користувачеві, - і застосунок і далі здається швидким та чуйним. Щоб відкласти виконання замикання, просто передайте його функції Illuminate\Support\defer:

use App\Services\Metrics;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use function Illuminate\Support\defer;

Route::post('/orders', function (Request $request) {
    // Create order...

    defer(fn () => Metrics::reportOrder($order));

    return $order;
});

За замовчуванням відкладені функції виконуються, лише якщо HTTP-відповідь, команда Artisan чи завдання в черзі, з яких викликано Illuminate\Support\defer, завершилися успішно. Це означає, що відкладені функції не виконаються, якщо запит дасть HTTP-відповідь 4xx чи 5xx. Якщо ви хочете, щоб відкладена функція виконувалася завжди, додайте до неї ланцюжком метод always:

defer(fn () => Metrics::reportOrder($order))->always();

Якщо у вас встановлено розширення PHP Swoole, функція defer Laravel може конфліктувати з власною глобальною функцією defer від Swoole, що призведе до помилок вебсервера. Обов'язково викликайте хелпер defer Laravel, явно вказавши простір імен: use function Illuminate\Support\defer;

Скасування відкладених функцій

Якщо вам потрібно скасувати відкладену функцію до її виконання, скористайтеся методом forget, щоб скасувати функцію за її іменем. Щоб назвати відкладену функцію, передайте другий аргумент функції Illuminate\Support\defer:

defer(fn () => Metrics::report(), 'reportMetrics');

defer()->forget('reportMetrics');

Вимкнення відкладених функцій у тестах

Пишучи тести, буває корисно вимкнути відкладені функції. Ви можете викликати у своєму тесті withoutDefer, щоб Laravel виконував усі відкладені функції негайно:

test('without defer', function () {
    $this->withoutDefer();

    // ...
});
use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_without_defer(): void
    {
        $this->withoutDefer();

        // ...
    }
}

Якщо ви хочете вимкнути відкладені функції для всіх тестів у тест-кейсі, викличте метод withoutDefer у методі setUp вашого базового класу TestCase:

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    protected function setUp(): void// [tl! add:start]
    {
        parent::setUp();

        $this->withoutDefer();
    }// [tl! add:end]
}

Лотерея

Клас лотереї Laravel дозволяє виконувати колбеки на основі заданих шансів. Це особливо корисно, коли ви хочете виконувати код лише для певного відсотка вхідних запитів:

use Illuminate\Support\Lottery;

Lottery::odds(1, 20)
    ->winner(fn () => $user->won())
    ->loser(fn () => $user->lost())
    ->choose();

Ви можете поєднувати клас лотереї Laravel з іншими можливостями фреймворку. Наприклад, ви можете хотіти повідомляти обробнику винятків лише про невеликий відсоток повільних запитів. А оскільки клас лотереї є викликаємим, ми можемо передати його екземпляр до будь-якого методу, який приймає щось викликаєме:

use Carbon\CarbonInterval;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Lottery;

DB::whenQueryingForLongerThan(
    CarbonInterval::seconds(2),
    Lottery::odds(1, 100)->winner(fn () => report('Querying > 2 seconds.')),
);

Тестування лотерей

Laravel надає кілька простих методів, які дозволяють легко тестувати виклики лотереї у вашому застосунку:

// Lottery will always win...
Lottery::alwaysWin();

// Lottery will always lose...
Lottery::alwaysLose();

// Lottery will win then lose, and finally return to normal behavior...
Lottery::fix([true, false]);

// Lottery will return to normal behavior...
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, буде викликано колбек, переданий методу then. Зазвичай цей колбек просто повертає заданий ввід. Для зручності, якщо ви просто хочете повернути ввід після обробки, скористайтеся методом thenReturn.

Звісно, як уже зазначалося, ви не обмежені замиканнями в конвеєрі. Ви можете передавати й викликаємі класи. Якщо передано назву класу, його буде створено через сервіс-контейнер Laravel, що дозволяє впровадити залежності у викликаємий клас:

$user = Pipeline::send($user)
    ->through([
        GenerateProfilePhoto::class,
        ActivateSubscription::class,
        SendWelcomeEmail::class,
    ])
    ->thenReturn();

Метод withinTransaction можна викликати на конвеєрі, щоб автоматично огорнути всі його кроки однією транзакцією бази даних:

$user = Pipeline::send($user)
    ->withinTransaction()
    ->through([
        ProcessOrder::class,
        TransferFunds::class,
        UpdateInventory::class,
    ])
    ->thenReturn();

Sleep

Клас Sleep Laravel - це легка обгортка над нативними функціями PHP sleep та usleep, яка забезпечує кращу тестованість і водночас надає зручний для розробника API для роботи з часом:

use Illuminate\Support\Sleep;

$waiting = true;

while ($waiting) {
    Sleep::for(1)->second();

    $waiting = /* ... */;
}

Клас Sleep пропонує різноманітні методи для роботи з різними одиницями часу:

// Return a value after sleeping...
$result = Sleep::for(1)->second()->then(fn () => 1 + 1);

// Sleep while a given value is true...
Sleep::for(1)->second()->while(fn () => shouldKeepSleeping());

// Pause execution for 90 seconds...
Sleep::for(1.5)->minutes();

// Pause execution for 2 seconds...
Sleep::for(2)->seconds();

// Pause execution for 500 milliseconds...
Sleep::for(500)->milliseconds();

// Pause execution for 5,000 microseconds...
Sleep::for(5000)->microseconds();

// Pause execution until a given time...
Sleep::until(now()->plus(minutes: 1));

// Alias of PHP's native "sleep" function...
Sleep::sleep(2);

// Alias of PHP's native "usleep" function...
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 дозволяє «підмінити» паузи, тож наш набір тестів лишається швидким:

it('waits until ready', function () {
    Sleep::fake();

    // ...
});
public function test_it_waits_until_ready()
{
    Sleep::fake();

    // ...
}

Коли клас Sleep підмінено, справжню паузу у виконанні буде пропущено, і тест стане значно швидшим.

Щойно клас Sleep підмінено, можна робити перевірки очікуваних «пауз». Щоб проілюструвати це, уявімо, що ми тестуємо код, який зупиняє виконання тричі, і кожна пауза довша на секунду. Методом assertSequence ми можемо перевірити, що наш код «спав» належний час, і водночас лишити тест швидким:

it('checks if ready three times', function () {
    Sleep::fake();

    // ...

    Sleep::assertSequence([
        Sleep::for(1)->second(),
        Sleep::for(2)->seconds(),
        Sleep::for(3)->seconds(),
    ]);
}
public function test_it_checks_if_ready_three_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;

// Assert that sleep was called 3 times...
Sleep::assertSleptTimes(3);

// Assert against the duration of sleep...
Sleep::assertSlept(function (Duration $duration): bool {
    return /* ... */;
}, times: 1);

// Assert that the Sleep class was never invoked...
Sleep::assertNeverSlept();

// Assert that, even if Sleep was called, no execution paused occurred...
Sleep::assertInsomniac();

Інколи буває корисно виконувати якусь дію щоразу, коли трапляється підмінена пауза. Для цього передайте колбек методу whenFakingSleep. У прикладі нижче ми користуємося хелперами маніпуляції часом Laravel, щоб миттєво просувати час на тривалість кожної паузи:

use Carbon\CarbonInterval as Duration;

$this->freezeTime();

Sleep::fake();

Sleep::whenFakingSleep(function (Duration $duration) {
    // Progress time when faking sleep...
    $this->travel($duration->totalMilliseconds)->milliseconds();
});

Оскільки просування часу - поширена потреба, метод fake приймає аргумент syncWithCarbon, який тримає Carbon синхронізованим під час пауз у тесті:

Sleep::fake(syncWithCarbon: true);

$start = now();

Sleep::for(1)->second();

$start->diffForHumans(); // 1 second ago

Laravel використовує клас Sleep усередині, коли зупиняє виконання. Наприклад, хелпер retry під час пауз користується класом Sleep, що покращує тестованість роботи з цим хелпером.

Timebox

Клас Timebox Laravel гарантує, що заданий колбек завжди виконується фіксований час, навіть якщо насправді завершується раніше. Це особливо корисно для криптографічних операцій і перевірок автентифікації користувачів, де зловмисники могли б скористатися різницею в часі виконання, щоб вивідати чутливу інформацію.

Якщо виконання перевищує фіксовану тривалість, Timebox не має ефекту. Розробник сам має обрати достатньо довгу фіксовану тривалість, щоб урахувати найгірші сценарії.

Метод call приймає замикання й ліміт часу в мікросекундах, після чого виконує замикання й чекає, доки не буде досягнуто ліміту:

use Illuminate\Support\Timebox;

(new Timebox)->call(function ($timebox) {
    // ...
}, microseconds: 10000);

Якщо всередині замикання викинуто виняток, цей клас дотримається заданої затримки й перевикине виняток після неї.

URI

Клас Uri Laravel надає зручний і плавний інтерфейс для створення URI та роботи з ними. Цей клас обгортає функціональність пакета League URI й безшовно інтегрується із системою маршрутизації Laravel.

Створити екземпляр Uri легко за допомогою статичних методів:

use App\Http\Controllers\UserController;
use App\Http\Controllers\InvokableController;
use Illuminate\Support\Uri;

// Generate a URI instance from the given string...
$uri = Uri::of('https://example.com/path');

// Generate URI instances to paths, named routes, or controller actions...
$uri = Uri::to('/dashboard');
$uri = Uri::route('users.show', ['user' => 1]);
$uri = Uri::signedRoute('users.show', ['user' => 1]);
$uri = Uri::temporarySignedRoute('user.index', now()->plus(minutes: 5));
$uri = Uri::action([UserController::class, 'index']);
$uri = Uri::action(InvokableController::class);

// Generate a URI instance from the current request URL...
$uri = $request->uri();

Щойно ви маєте екземпляр URI, ви можете плавно його змінювати:

$uri = Uri::of('https://example.com')
    ->withScheme('http')
    ->withHost('test.com')
    ->withPort(8000)
    ->withPath('/users')
    ->withQuery(['page' => 2])
    ->withFragment('section-1');

Огляд URI

Клас Uri також дозволяє легко оглядати різні складові URI:

$scheme = $uri->scheme();
$authority = $uri->authority();
$host = $uri->host();
$port = $uri->port();
$path = $uri->path();
$segments = $uri->pathSegments();
$query = $uri->query();
$fragment = $uri->fragment();

Робота з рядками запиту

Клас Uri пропонує кілька методів для роботи з рядком запиту URI. Метод withQuery дозволяє злити додаткові параметри до наявного рядка запиту:

$uri = $uri->withQuery(['sort' => 'name']);

Метод withQueryIfMissing дозволяє злити додаткові параметри до наявного рядка запиту, якщо заданих ключів у ньому ще немає:

$uri = $uri->withQueryIfMissing(['page' => 1]);

Метод replaceQuery дозволяє повністю замінити наявний рядок запиту новим:

$uri = $uri->replaceQuery(['page' => 1]);

Метод pushOntoQuery дозволяє додати додаткові параметри до параметра рядка запиту, який має значення-масив:

$uri = $uri->pushOntoQuery('filter', ['active', 'pending']);

Метод withoutQuery дозволяє вилучити параметри з рядка запиту:

$uri = $uri->withoutQuery(['page']);

Генерація відповідей з URI

Метод redirect дозволяє згенерувати екземпляр RedirectResponse до заданого URI:

$uri = Uri::of('https://example.com');

return $uri->redirect();

Або ж ви можете просто повернути екземпляр Uri з маршруту чи дії контролера - і буде автоматично згенеровано відповідь із перенаправленням на цей URI:

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Uri;

Route::get('/redirect', function () {
    return Uri::to('/index')
        ->withQuery(['sort' => 'name']);
});