Helpers

Introduction

Laravel includes a variety of global “helper” PHP functions. Many of these functions are used by the framework itself; however, you are free to use them in your own applications if you find them convenient.

Available Methods

Arrays & Objects

Numbers

Paths

URLs

Miscellaneous

Arrays & Objects

Arr::accessible() {.collection-method .first-collection-method}

The Arr::accessible method determines if the given value is array 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' => 'Desk', 'price' => 100]

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

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

Arr::array() {.collection-method}

Arr::array 메서드는 ‘dot’ 표기법을 사용하여 깊게 중첩된 배열에서 값을 가져옵니다(Arr::get()와 동일하게), 하지만 요청한 값이 array가 아닌 경우 InvalidArgumentException를 발생시킵니다:

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() {.collection-method}

Arr::boolean 메서드는 ‘dot’ 표기법을 사용하여 깊게 중첩된 배열에서 값을 가져옵니다(Arr::get()와 동일하게), 하지만 요청한 값이 boolean이 아닌 경우 InvalidArgumentException를 발생시킵니다:

use Illuminate\Support\Arr;

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

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

// true

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

// throws InvalidArgumentException

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 방법은 다차원 배열을 단일 레벨 배열로 평탄화하며, 깊이를 나타내기 위해 “점(dot)” 표기법을 사용합니다:

use Illuminate\Support\Arr;

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

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

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

Arr::every() {.collection-method}

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() {.collection-method}

Arr::except 방법은 배열에서 주어진 키 / 값 쌍을 제거합니다:

use Illuminate\Support\Arr;

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

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

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

Arr::exceptValues() {.collection-method}

Arr::exceptValues 메서드는 배열에서 지정된 값을 제거합니다:

use Illuminate\Support\Arr;

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

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

// ['bar', 'qux']

필터링할 때 엄격한 타입 비교를 사용하려면 strict 인수에 true를 전달할 수도 있습니다:

use Illuminate\Support\Arr;

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

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

// ['1', '2']

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');

// false

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::float() {.collection-method}

Arr::float 메서드는 ‘dot’ 표기법을 사용하여 깊게 중첩된 배열에서 값을 가져옵니다(Arr::get()와 동일하게), 하지만 요청한 값이 float이 아닌 경우 InvalidArgumentException를 발생시킵니다:

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() {.collection-method}

Arr::forget 메서드는 ‘점(dot)’ 표기법을 사용하여 깊게 중첩된 배열에서 주어진 키/값 쌍을 제거합니다:

use Illuminate\Support\Arr;

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

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

// ['products' => []]

Arr::from() {.collection-method}

Arr::from 메서드는 다양한 입력 유형을 일반 PHP 배열로 변환합니다. 배열, 객체 및 Arrayable, Enumerable, Jsonable, JsonSerializable와 같은 여러 일반적인 Laravel 인터페이스를 포함한 다양한 입력 유형을 지원합니다. 또한 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() {.collection-method}

Arr::get 메서드는 ‘점(dot)’ 표기법을 사용하여 깊게 중첩된 배열에서 값을 가져옵니다:

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 메서드는 ‘닷(dots)’ 표기법을 사용하여 주어진 항목이 배열에 존재하는지 여부를 확인합니다:

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() {.collection-method}

Arr::hasAll 메서드는 지정된 모든 키가 주어진 배열에 존재하는지 “점(dot)” 표기법을 사용하여 확인합니다:

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() {.collection-method}

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() {.collection-method}

Arr::integer 메서드는 ‘dot’ 표기법을 사용하여 깊게 중첩된 배열에서 값을 가져옵니다(Arr::get()와 동일하게), 하지만 요청한 값이 int가 아닌 경우 InvalidArgumentException를 발생시킵니다:

use Illuminate\Support\Arr;

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

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

// 42

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

// throws InvalidArgumentException

Arr::isAssoc() {.collection-method}

Arr::isAssoc 메서드는 주어진 배열이 연관 배열인 경우 true를 반환합니다. 배열은 0부터 시작하는 연속된 숫자 키가 없으면 “연관 배열”로 간주됩니다:

use Illuminate\Support\Arr;

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

// true

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

// false

Arr::isList() {.collection-method}

Arr::isList 메서드는 주어진 배열의 키가 0부터 시작하는 연속적인 정수인 경우 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, and Livewire

Arr::keyBy() {.collection-method}

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() {.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::mapSpread() {.collection-method}

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() {.collection-method}

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() {.collection-method}

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() {.collection-method}

Arr::onlyValues 메서드는 배열에서 지정된 값만 반환합니다:

use Illuminate\Support\Arr;

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

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

// ['foo', 'baz']

필터링할 때 엄격한 타입 비교를 사용하려면 strict 인수에 true를 전달할 수도 있습니다:

use Illuminate\Support\Arr;

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

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

// [1, 2]

Arr::partition() {.collection-method}

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() {.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');

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

필요한 경우 값에 사용해야 하는 키를 지정할 수 있습니다:

use Illuminate\Support\Arr;

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

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

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

Arr::prependKeysWith() {.collection-method}

Arr::prependKeysWith는 연관 배열의 모든 키 이름 앞에 지정된 접두사를 붙입니다:

use Illuminate\Support\Arr;

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

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

/*
    [
        'product.name' => 'Desk',
        '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::push() {.collection-method}

Arr::push 메서드는 “점” 표기법을 사용하여 배열에 항목을 추가합니다. 지정된 키에 배열이 존재하지 않는 경우, 배열이 생성됩니다:

use Illuminate\Support\Arr;

$array = [];

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

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

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 - (retrieved randomly)

선택적 두 번째 인수로 반환할 항목의 수를 지정할 수도 있습니다. 이 인수를 제공하면 하나의 항목만 필요하더라도 배열이 반환된다는 점에 유의하세요:

use Illuminate\Support\Arr;

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

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

Arr::reject() {.collection-method}

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() {.collection-method}

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() {.collection-method}

Arr::set 메서드는 ‘점(dot)’ 표기법을 사용하여 깊게 중첩된 배열 내에서 값을 설정합니다:

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] - (generated randomly)

Arr::sole() {.collection-method}

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() {.collection-method}

Arr::some 방법은 배열의 값 중 적어도 하나가 주어진 참/거짓 테스트를 통과하는지 확인합니다:

use Illuminate\Support\Arr;

$array = [1, 2, 3];

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

// true

Arr::sort() {.collection-method}

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() {.collection-method}

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() {.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::string() {.collection-method}

Arr::string 메서드는 ‘dot’ 표기법을 사용하여 깊게 중첩된 배열에서 값을 가져옵니다(Arr::get()와 동일하게), 하지만 요청된 값이 string가 아닌 경우 InvalidArgumentException를 발생시킵니다:

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() {.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 스타일 문자열을 조건부로 컴파일합니다. 이 메서드는 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 컴포넌트의 속성 백과 병합할 수 있게 해주고, @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' => 'Accountant']]

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 함수는 ‘점’ 표기법을 사용하여 중첩 배열이나 객체 내에 결측값을 설정합니다:

$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() {.collection-method}

data_get 함수는 ‘점(dot)’ 표기법을 사용하여 중첩 배열이나 객체에서 값을 가져옵니다:

$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() {.collection-method}

data_set 함수는 ‘점(dot)’ 표기법을 사용하여 중첩 배열이나 객체 내에 값을 설정합니다:

$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() {.collection-method}

data_forget 함수는 ‘점(dot)’ 표기법을 사용하여 중첩 배열이나 객체 내의 값을 제거합니다:

$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() {.collection-method}

head 함수는 주어진 배열의 첫 번째 요소를 반환합니다. 배열이 비어 있으면 false가 반환됩니다:

$array = [100, 200, 300];

$first = head($array);

// 100

last() {.collection-method}

last 함수는 주어진 배열의 마지막 요소를 반환합니다. 배열이 비어 있으면 false가 반환됩니다:

$array = [100, 200, 300];

$last = last($array);

// 300

숫자

Number::abbreviate() {.collection-method}

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() {.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.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() {.collection-method}

Number::defaultCurrency 메서드는 Number 클래스에서 사용되는 기본 통화를 반환합니다:

use Illuminate\Support\Number;

$currency = Number::defaultCurrency();

// USD

Number::defaultLocale() {.collection-method}

Number::defaultLocale 메서드는 Number 클래스에서 사용 중인 기본 로케일을 반환합니다:

use Illuminate\Support\Number;

$locale = Number::defaultLocale();

// en

Number::fileSize() {.collection-method}

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() {.collection-method}

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() {.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);

// 1st

$number = Number::ordinal(2);

// 2nd

$number = Number::ordinal(21);

// 21st

Number::pairs() {.collection-method}

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() {.collection-method}

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() {.collection-method}

Number::parseInt 메서드는 지정된 로케일에 따라 문자열을 정수로 파싱합니다:

use Illuminate\Support\Number;

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

// (int) 10

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

// (int) 10

Number::parseFloat() {.collection-method}

Number::parseFloat 메서드는 지정된 로케일에 따라 문자열을 부동 소수점으로 구문 분석합니다:

use Illuminate\Support\Number;

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

// (float) 10.0

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

// (float) 10.0

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

// 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() {.collection-method}

Number::spellOrdinal 메서드는 숫자의 서수 표현을 단어 문자열로 반환합니다:

use Illuminate\Support\Number;

$number = Number::spellOrdinal(1);

// first

$number = Number::spellOrdinal(2);

// second

$number = Number::spellOrdinal(21);

// twenty-first

Number::trim() {.collection-method}

Number::trim 방법은 주어진 숫자의 소수점 뒤에 있는 모든 불필요한 0을 제거합니다:

use Illuminate\Support\Number;

$number = Number::trim(12.0);

// 12

$number = Number::trim(12.30);

// 12.3

Number::useLocale() {.collection-method}

Number::useLocale 메서드는 기본 숫자 로케일을 전역적으로 설정하며, 이는 이후 Number 클래스의 메서드를 호출할 때 숫자와 통화가 형식화되는 방식에 영향을 줍니다:

use Illuminate\Support\Number;

/**
 * Bootstrap any application services.
 */
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);
});

Number::useCurrency() {.collection-method}

Number::useCurrency 방법은 기본 숫자 통화를 전역적으로 설정하며, 이는 이후 Number 클래스의 메서드 호출에서 통화가 어떻게 형식화되는지에 영향을 줍니다:

use Illuminate\Support\Number;

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

Number::withCurrency() {.collection-method}

Number::withCurrency 메서드는 지정된 통화를 사용하여 주어진 클로저를 실행한 다음, 콜백이 실행된 후 원래의 통화를 복원합니다:

use Illuminate\Support\Number;

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

경로

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');

[!NOTE] 기본적으로, Laravel 애플리케이션 스켈레톤에는 lang 디렉토리가 포함되어 있지 않습니다. Laravel의 언어 파일을 사용자 정의하려면, lang:publish Artisan 명령을 통해 이를 발행할 수 있습니다.

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 함수를 사용하여 스토리지 디렉토리 내의 지정된 파일에 대한 완전한 경로를 생성할 수 있습니다:

$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 함수는 요청의 현재 스킴(HTTP 또는 HTTPS)을 사용하여 자산의 URL을 생성합니다:

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

자산 URL 호스트는 .env 파일에서 ASSET_URL 변수를 설정하여 구성할 수 있습니다. 이는 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 함수는 HTTPS를 사용하여 자산의 URL을 생성합니다:

$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_action() {.collection-method}

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() {.collection-method}

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() {.collection-method}

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() {.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();

url 함수 사용에 대한 자세한 정보는 URL 생성 문서를 참조하세요.

기타

abort() {.collection-method}

abort 함수는 HTTP 예외를 발생시키며, 이는 예외 처리기에 의해 처리됩니다:

abort(403);

브라우저로 전송되어야 하는 예외 메시지와 사용자 정의 HTTP 응답 헤더도 제공할 수 있습니다:

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

abort_if() {.collection-method}

abort_if 함수는 주어진 불리언 표현식이 true로 평가되면 HTTP 예외를 발생시킵니다:

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

abort 방식과 마찬가지로, 예외의 응답 텍스트를 세 번째 인수로 제공하고 맞춤 응답 헤더 배열을 네 번째 인수로 함수에 제공할 수도 있습니다.

abort_unless() {.collection-method}

abort_unless 함수는 주어진 불리언 표현식이 false로 평가되면 HTTP 예외를 발생시킵니다:

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

abort 방법과 마찬가지로, 예외의 응답 텍스트를 세 번째 인수로 제공하고 사용자 정의 응답 헤더 배열을 네 번째 인수로 함수에 전달할 수도 있습니다.

app() {.collection-method}

app 함수는 서비스 컨테이너 인스턴스를 반환합니다:

$container = app();

컨테이너에서 해결하기 위해 클래스나 인터페이스 이름을 전달할 수 있습니다:

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

auth() {.collection-method}

auth 함수는 인증기 인스턴스를 반환합니다. Auth 퍼사드를 대안으로 사용할 수 있습니다:

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

필요한 경우 액세스하려는 가드 인스턴스를 지정할 수 있습니다:

$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('   ');
blank(null);
blank(collect());

// true

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

// false

blank의 역은 filled 함수를 참조하십시오.

broadcast() {.collection-method}

broadcast 함수는 주어진 event를 수신자에게 broadcasts합니다:

broadcast(new UserRegistered($user));

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

broadcast_if() {.collection-method}

broadcast_if 함수는 주어진 이벤트를 해당 불리언 표현식이 true로 평가될 경우 리스너들에게 방송합니다:

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

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

broadcast_unless() {.collection-method}

broadcast_unless 함수는 주어진 이벤트를 해당 불리언 표현식이 false로 평가될 경우 리스너들에게 방송합니다:

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

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

cache() {.collection-method}

cache 함수는 캐시에서 값을 가져오는 데 사용할 수 있습니다. 주어진 키가 캐시에 존재하지 않는 경우, 선택적 기본 값이 반환됩니다:

$value = cache('key');

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

함수에 키/값 쌍 배열을 전달하여 항목을 캐시에 추가할 수 있습니다. 또한 캐시된 값이 유효하다고 간주될 시간(초)이나 기간을 전달해야 합니다:

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

cache(['key' => 'value'], now()->plus(seconds: 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]);

context() {.collection-method}

context 함수는 현재 컨텍스트에서 값을 가져옵니다. 컨텍스트 키가 존재하지 않는 경우 반환될 기본값을 제공할 수도 있습니다:

$value = context('trace_id');

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

키/값 쌍의 배열을 전달하여 컨텍스트 값을 설정할 수 있습니다:

use Illuminate\Support\Str;

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

cookie 함수는 새로운 쿠키 인스턴스를 생성합니다:

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

csrf_field() {.collection-method}

csrf_field 함수는 CSRF 토큰의 값을 포함하는 HTML hidden 입력 필드를 생성합니다. 예를 들어, Blade 문법을 사용하는 경우:

{{ csrf_field() }}

csrf_token() {.collection-method}

csrf_token 함수는 현재 CSRF 토큰의 값을 가져옵니다:

$token = csrf_token();

decrypt() {.collection-method}

decrypt 함수는 주어진 값을 복호화합니다. 이 함수를 Crypt 파사드의 대안으로 사용할 수 있습니다:

$password = decrypt($value);

decrypt의 역함수는 encrypt 함수를 참조하십시오.

dd() {.collection-method}

dd 함수는 주어진 변수를 덤프하고 스크립트 실행을 종료합니다:

dd($value);

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

스크립트 실행을 중단하고 싶지 않다면 대신 dump 함수를 사용하세요.

dispatch() {.collection-method}

dispatch 함수는 주어진 작업을 Laravel 작업 큐에 푸시합니다:

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');

encrypt의 역은 decrypt 함수를 참조하십시오.

env() {.collection-method}

env 함수는 환경 변수의 값을 가져오거나 기본 값을 반환합니다:

$env = env('APP_ENV');

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

[!WARNING] 배포 과정에서 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 함수는 config/app.php 구성에서 app.faker_locale 구성 옵션을 사용합니다. 일반적으로 이 구성 옵션은 APP_FAKER_LOCALE 환경 변수를 통해 설정됩니다. 또한 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('Some helpful information!');

문맥 데이터 배열도 함수에 전달될 수 있습니다:

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

literal() {.collection-method}

literal 함수는 주어진 이름 있는 인수를 속성으로 하여 새로운 stdClass 인스턴스를 생성합니다:

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

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

logger() {.collection-method}

logger 함수는 로그에 debug 수준의 메시지를 작성하는 데 사용할 수 있습니다:

logger('Debug message');

문맥 데이터 배열도 함수에 전달될 수 있습니다:

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

함수에 값이 전달되지 않으면 로거 인스턴스가 반환됩니다:

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

method_field() {.collection-method}

method_field 함수는 폼의 HTTP 동사의 스푸핑된 값을 포함하는 HTML hidden 입력 필드를 생성합니다. 예를 들어, 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은 old 함수에 두 번째 인수로 전체 Eloquent 모델을 단순히 전달할 수 있도록 허용합니다. 이렇게 하면 Laravel은 old 함수에 제공된 첫 번째 인수가 “기본값”으로 간주되어야 하는 Eloquent 속성의 이름이라고 가정합니다.

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

// Is equivalent to...

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

once() {.collection-method}

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() {.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 응답을 반환하거나, 인수 없이 호출될 경우 리디렉터 인스턴스를 반환합니다:

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

return redirect('/home');

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

report() {.collection-method}

report 함수는 예외 처리기를 사용하여 예외를 보고합니다:

report($e);

report 함수는 문자열을 인수로 받는 것도 가능합니다. 함수에 문자열이 주어지면, 함수는 주어진 문자열을 메시지로 하는 예외를 생성합니다:

report('Something went wrong.');

report_if() {.collection-method}

report_if 함수는 주어진 불리언 표현식이 true로 평가되면 예외 처리기를 사용하여 예외를 보고합니다:

report_if($shouldReport, $e);

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

report_unless() {.collection-method}

report_unless 함수는 주어진 불리언 표현식이 false로 평가되면 예외 처리기를 사용하여 예외를 보고합니다:

report_unless($reportingDisabled, $e);

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

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

예외가 report 함수를 통해 보고되어야 하는지 결정하기 위해 rescue 함수에 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 함수는 응답 인스턴스를 생성하거나 응답 팩토리의 인스턴스를 가져옵니다:

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

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

retry() {.collection-method}

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() {.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가 됩니다. 예를 들어, Eloquent update 메서드는 일반적으로 정수를 반환합니다. 그러나 tap 함수를 통해 update 메서드 호출을 체인하면 메서드가 모델 자체를 반환하도록 강제할 수 있습니다:

$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() {.collection-method}

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() {.collection-method}

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() {.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');

// The value is blank

validator() {.collection-method}

validator 함수는 주어진 인수로 새로운 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 함수는 뷰 인스턴스를 가져옵니다:

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

when() {.collection-method}

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();

또는 Illuminate\Support\Carbon 클래스를 사용하여 새로운 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 함수를 제공하며, 이 함수들은 PHP의 DateInterval 클래스를 확장한 CarbonInterval 인스턴스를 반환합니다. 이러한 함수는 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;
});

기본적으로, 지연된 함수는 Illuminate\Support\defer가 호출된 HTTP 응답, Artisan 명령어 또는 큐 작업이 성공적으로 완료된 경우에만 실행됩니다. 이는 요청이 4xx 또는 5xx HTTP 응답을 반환할 경우 지연된 함수가 실행되지 않음을 의미합니다. 지연된 함수가 항상 실행되도록 하려면, 지연된 함수에 always 메서드를 연결할 수 있습니다:

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

[!WARNING] Swoole PHP 확장이 설치되어 있는 경우, Laravel의 defer 함수가 Swoole의 자체 글로벌 defer 함수와 충돌하여 웹 서버 오류가 발생할 수 있습니다. Laravel의 defer 헬퍼를 호출할 때는 명시적으로 네임스페이스를 지정해야 합니다: use function Illuminate\Support\defer;

지연 함수 취소하기

실행되기 전에 지연 함수를 취소해야 하는 경우, forget 메서드를 사용하여 함수 이름으로 함수를 취소할 수 있습니다. 지연 함수의 이름을 지정하려면, Illuminate\Support\defer 함수에 두 번째 인수를 제공하십시오:

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

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

테스트에서 지연 함수 비활성화

테스트를 작성할 때 지연 함수를 비활성화하는 것이 유용할 수 있습니다. 테스트에서 withoutDefer를 호출하여 Laravel이 모든 지연 함수를 즉시 실행하도록 지시할 수 있습니다:```php tab=Pest test(‘without defer’, function () { $this->withoutDefer();

// ... }); ```

```php tab=PHPUnit use Tests\TestCase;

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

    // ...
} } ```

테스트 케이스 내의 모든 테스트에 대해 연기된 함수를 비활성화하려면, 기반 TestCase 클래스의 setUp 메서드에서 withoutDefer 메서드를 호출할 수 있습니다:

<?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의 로터리 클래스를 다른 Laravel 기능과 결합할 수 있습니다. 예를 들어, 느린 쿼리의 일부만 예외 처리기에 보고하고 싶을 수 있습니다. 그리고 로터리 클래스는 호출 가능(callable)이므로, 호출 가능(callable)을 허용하는 어떤 메서드에도 클래스 인스턴스를 전달할 수 있습니다:

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();

파이프라인

Laravel의 Pipeline 파사드는 주어진 입력을 일련의 호출 가능한 클래스, 클로저 또는 콜러블을 통해 “파이프”하는 편리한 방법을 제공하며, 각 클래스가 입력을 검사하거나 수정하고 파이프라인의 다음 콜러블을 호출할 기회를 제공합니다:

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 클로저를 호출하면 파이프라인에서 다음 호출 가능 객체가 호출됩니다. 아마 눈치채셨겠지만, 이는 미들웨어와 매우 유사합니다.

파이프라인의 마지막 호출 가능 객체가 $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();

수면

Laravel의 Sleep 클래스는 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 클래스나 PHP의 기본 sleep 함수를 사용하는 코드를 테스트할 때, 테스트가 실행을 일시 중지합니다. 예상할 수 있듯이, 이는 테스트 스위트를 상당히 느리게 만듭니다. 예를 들어, 다음 코드를 테스트한다고 가정해 보십시오:

$waiting = /* ... */;

$seconds = 1;

while ($waiting) {
    Sleep::for($seconds++)->seconds();

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

일반적으로, 이 코드를 테스트하는 데 적어도 1초는 걸립니다. 다행히도, Sleep 클래스는 테스트 스위트가 빠르게 유지되도록 ‘잠자는 척’할 수 있게 해줍니다:```php tab=Pest it(‘waits until ready’, function () { Sleep::fake();

// ... }); ```

```php tab=PHPUnit public function test_it_waits_until_ready() { Sleep::fake();

// ... } ```

Sleep 클래스를 가짜로 만들면 실제 실행 중단이 우회되어 테스트가 훨씬 빨라집니다.

Sleep 클래스를 가짜로 만들면 발생했어야 하는 예상 “대기”에 대해 검증(assertion)을 수행할 수 있습니다. 이를 설명하기 위해, 실행을 세 번 중단하고 각 중단이 1초씩 증가하는 코드를 테스트한다고 가정해 보겠습니다. assertSequence 메서드를 사용하면 테스트를 빠르게 유지하면서 코드가 올바른 시간 동안 “대기”했는지 검증할 수 있습니다:```php tab=Pest it(‘checks if ready three times’, function () { Sleep::fake();

// ...

Sleep::assertSequence([
    Sleep::for(1)->second(),
    Sleep::for(2)->seconds(),
    Sleep::for(3)->seconds(),
]); } ```

```php tab=PHPUnit 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 메서드는 테스트 중에 일시 중지할 때 Carbon이 동기 상태를 유지하도록 syncWithCarbon 인수를 허용합니다:

Sleep::fake(syncWithCarbon: true);

$start = now();

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

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

Laravel은 실행을 일시 중지할 때마다 내부적으로 Sleep 클래스를 사용합니다. 예를 들어, retry 헬퍼는 대기할 때 Sleep 클래스를 사용하여, 해당 헬퍼를 사용할 때 테스트 가능성을 향상시킵니다.

시간 제한(Timebox)

Laravel의 Timebox 클래스는 주어진 콜백이 실제 실행이 더 빨리 완료되더라도 항상 일정한 시간 동안 실행되도록 보장합니다. 이는 특히 암호화 작업 및 사용자 인증 검사에서 유용하며, 공격자가 실행 시간의 변화를 이용해 민감한 정보를 추론할 수 있는 경우에 중요합니다.

실행이 고정 시간을 초과하더라도 Timebox는 아무런 효과가 없습니다. 고정 시간을 최악의 상황을 감안하여 충분히 길게 설정하는 것은 개발자의 책임입니다.

call 메서드는 클로저와 마이크로초 단위의 시간 제한을 받아, 클로저를 실행하고 시간 제한에 도달할 때까지 기다립니다:

use Illuminate\Support\Timebox;

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

클로저 내에서 예외가 발생하면, 이 클래스는 정의된 지연 시간을 준수하고 지연 후 예외를 다시 던집니다.

URI

Laravel의 Uri 클래스는 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 메서드는 주어진 URI에 대해 RedirectResponse 인스턴스를 생성하는 데 사용될 수 있습니다:

$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']);
});
서브목차