laravel
5. 深入探讨
助手函数

介绍

Laravel 包含了多种全局的“助手”PHP 函数。许多这些函数被框架本身所使用;然而,如果您觉得方便,也可以在自己的应用程序中使用它们。

可用方法

数组与对象

数字

路径

URL

杂项

数组与对象

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

Arr::accessible 方法用于确定给定的值是否可作为数组访问:

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;

$isAccessible = Arr::accessible(['a' => 1, 'b' => 2]);

// true

$isAccessible = Arr::accessible(new Collection);

// true

$isAccessible = Arr::accessible('abc');

// false

$isAccessible = Arr::accessible(new stdClass);

// false

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

Arr::add 方法在给定的键尚未存在于数组中或其值为 null 时,将给定的键/值对添加到数组中:

use Illuminate\Support\Arr;

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

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

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

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

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

Arr::collapse 方法将一个数组的数组成员合并为一个单一的数组:

use Illuminate\Support\Arr;

$array = Arr::collapse([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);

// [1, 2, 3, 4, 5, 6, 7, 8, 9]

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

Arr::crossJoin 方法对给定的数组进行交叉连接,返回所有可能排列的笛卡尔积:

use Illuminate\Support\Arr;

$matrix = Arr::crossJoin([1, 2], ['a', 'b']);

/*
    [
        [1, 'a'],
        [1, 'b'],
        [2, 'a'],
        [2, 'b'],
    ]
*/

$matrix = Arr::crossJoin([1, 2], ['a', 'b'], ['I', 'II']);

/*
    [
        [1, 'a', 'I'],
        [1, 'a', 'II'],
        [1, 'b', 'I'],
        [1, 'b', 'II'],
        [2, 'a', 'I'],
        [2, 'a', 'II'],
        [2, 'b', 'I'],
        [2, 'b', 'II'],
    ]
*/

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

Arr::divide 方法返回两个数组:一个包含给定数组的键,另一个包含其值:

use Illuminate\Support\Arr;

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

// $keys: ['name']

// $values: ['Desk']

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

Arr::dot 方法将多维数组展平为一个使用“点”符号表示深度的单级数组:

use Illuminate\Support\Arr;

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

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

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

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

Arr::except 方法从数组中移除给定的键/值对:

use Illuminate\Support\Arr;

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

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

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

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

Arr::forget 方法使用“点”符号从深度嵌套的数组中移除给定的键/值对:

use Illuminate\Support\Arr;

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

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

// ['products' => []]

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

Arr::get 方法使用“点”符号从深度嵌套的数组中检索值:

use Illuminate\Support\Arr;

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

$price = Arr::get($array, 'products.desk.price');

// 100

Arr::get 方法还接受一个默认值,如果指定的键不在数组中,将返回该默认值:

use Illuminate\Support\Arr;

$discount = Arr::get($array, 'products.desk.discount', 0);

// 0

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

Arr::has 方法使用“点”符号检查数组中是否存在给定的一个或多个项:

use Illuminate\Support\Arr;

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

$contains = Arr::has($array, 'product.name');

// true

$contains = Arr::has($array, ['product.price', 'product.discount']);

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

Arr::isAssoc 方法如果给定的数组是关联数组,则返回 true。如果数组的键不是从零开始的连续数字键,则该数组被认为是“关联数组”:

use Illuminate\Support\Arr;

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

// true

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

// false

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

Arr::isList 方法如果给定数组的键是从零开始的连续整数,则返回 true

use Illuminate\Support\Arr;

$isList = Arr::isList(['foo', 'bar', 'baz']);

// true

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

// false

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

Arr::join 方法使用字符串连接数组元素。通过该方法的第二个参数,您还可以指定数组最后一个元素的连接字符串:

use Illuminate\Support\Arr;

$array = ['Tailwind', 'Alpine', 'Laravel', 'Livewire'];

$joined = Arr::join($array, ', ');

// Tailwind, Alpine, Laravel, Livewire

$joined = Arr::join($array, ', ', ' and ');

// Tailwind, Alpine, Laravel 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

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函数使用“点”符号从嵌套数组或对象中检索值:

$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函数使用“点”符号在嵌套数组或对象中设置值:

$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函数使用“点”符号从嵌套数组或对象中删除值:

$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函数返回给定数组中的第一个元素:

$array = [100, 200, 300];

$first = head($array);

// 100

last() {.collection-method}

last函数返回给定数组中的最后一个元素:

$array = [100, 200, 300];

$last = last($array);

// 300

数字

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

Number::abbreviate方法以人类可读的格式返回提供的数值,并带有单位的缩写:

use Illuminate\Support\Number;

$number = Number::abbreviate(1000);

// 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 €

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);
 
// [[1, 10], [11, 20], [21, 25]]
 
$result = Number::pairs(25, 10, offset: 0);
 
// [[0, 10], [10, 20], [20, 25]]

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

Number::trim方法从给定数字的小数点后删除任何尾随零数字:

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;

/**
 * 引导任何应用程序服务。
 */
public function boot(): void
{
    Number::useLocale('de');
}

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

Number::withLocale方法使用指定的区域设置执行给定的闭包,然后在回调执行后恢复原始区域设置:

use Illuminate\Support\Number;

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

路径

app_path() {.collection-method}

app_path函数返回应用程序的app目录的完全限定路径。您还可以使用app_path函数生成相对于应用程序目录的文件的完全限定路径:

$path = app_path();

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

base_path() {.collection-method}

base_path函数返回应用程序的根目录的完全限定路径。您还可以使用base_path函数生成相对于项目根目录的给定文件的完全限定路径:

$path = base_path();

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

config_path() {.collection-method}

config_path函数返回应用程序的config目录的完全限定路径。您还可以使用config_path函数生成应用程序配置目录中给定文件的完全限定路径:

$path = config_path();

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

database_path() {.collection-method}

database_path函数返回应用程序的database目录的完全限定路径。您还可以使用database_path函数生成数据库目录中给定文件的完全限定路径:

$path = database_path();

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

lang_path() {.collection-method}

lang_path函数返回应用程序的lang目录的完全限定路径。您还可以使用lang_path函数生成该目录中给定文件的完全限定路径:

$path = lang_path();

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

[!NOTE]
默认情况下,Laravel 应用程序框架不包含lang目录。如果您想要自定义 Laravel 的语言文件,可以通过lang:publish Artisan 命令发布它们。

mix() {.collection-method}

mix函数返回版本化的 Mix 文件的路径:

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

public_path() {.collection-method}

public_path函数返回应用程序的public目录的完全限定路径。您还可以使用public_path函数生成公共目录中给定文件的完全限定路径:

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

您可以通过在.env文件中设置ASSET_URL变量来配置资产 URL 主机。如果您将资产托管在外部服务(如 Amazon S3 或其他 CDN)上,这将非常有用:

// ASSET_URL=http://example.com/assets

$url = asset('img/photo.jpg

literal() {.collection-method}

literal 函数会创建一个新的 stdClass (opens in a new tab) 实例,将给定的具名参数作为属性:

$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 允许您将整个 Eloquent 模型作为 old 函数的第二个参数传递。当这样做时,Laravel 将假定提供给 old 函数的第一个参数是应该被视为“默认值”的 Eloquent 属性的名称:

{{ old('name', $user->name) }}
 
// 等同于...
 
{{ old('name', $user) }}

once() {.collection-method}

once 函数执行给定的回调函数,并在请求期间将结果缓存在内存中。对具有相同回调函数的 once 函数的任何后续调用都将返回先前缓存的结果:

function random(): int
{
    return once(function () {
        return random_int(1, 1000);
    });
}
 
random(); // 123
random(); // 123 (缓存结果)
random(); // 123 (缓存结果)

当从对象实例内部执行 once 函数时,缓存结果将对该对象实例是唯一的:

<?php
 
class NumberService
{
    public function all(): array
    {
        return once(fn () => [1, 2, 3]);
    }
}
 
$service = new NumberService;
 
$service->all();
$service->all(); // (缓存结果)
 
$secondService = new NumberService;
 
$secondService->all();
$secondService->all(); // (缓存结果)

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 = [], $https = null);
 
return redirect('/home');
 
return redirect()->route('route.name');

report() {.collection-method}

report 函数将使用您的 异常处理程序 报告一个异常:

report($e);

report 函数也接受一个字符串作为参数。当向该函数提供一个字符串时,该函数将创建一个以给定字符串作为其消息的异常:

report('Something went wrong.');

report_if() {.collection-method}

如果给定的条件为 truereport_if 函数将使用您的 异常处理程序 报告一个异常:

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

report_unless() {.collection-method}

如果给定的条件为 falsereport_unless 函数将使用您的 异常处理程序 报告一个异常:

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

可以向 rescue 函数提供一个 report 参数,以确定是否应通过 report 函数报告异常:

return rescue(function () {
    return $this->method();
}, report: function (Throwable $throwable) {
    return $throwable instanceof InvalidArgumentException;
});

resolve() {.collection-method}

resolve 函数使用 服务容器 将给定的类或接口名称解析为一个实例:

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

response() {.collection-method}

response 函数创建一个 响应 实例或获取响应工厂的实例:

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

retry() {.collection-method}

retry 函数尝试执行给定的回调函数,直到达到给定的最大尝试阈值。如果回调函数未抛出异常,则将返回其返回值。如果回调函数抛出异常,它将自动重试。如果超过最大尝试次数,则将抛出异常:

return retry(5, function () {
    // 尝试 5 次,每次尝试之间休息 100 毫秒...
}, 100);

如果您想手动计算每次尝试之间的毫秒数,可以将一个闭包作为 retry 函数的第三个参数传递:

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

为了方便起见,您可以将一个数组作为 retry 函数的第一个参数提供。该数组将用于确定后续尝试之间的毫秒数:

return retry([100, 200], function () {
    // 在第一次重试时休息 100 毫秒,在第二次重试时休息 200 毫秒...
});

要仅在特定条件下重试,可以将一个闭包作为 retry 函数的第四个参数传递:

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

session() {.collection-method}

session 函数可用于获取或设置 会话 值:

$value = session('key');

您可以通过将一个键/值对数组传递给该函数来设置值:

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

如果没有向该函数传递值,则将返回会话存储:

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

tap() {.collection-method}

tap 函数接受两个参数:任意的 $value 和一个闭包。$value 将被传递给闭包,然后 tap 函数将返回 $value。闭包的返回值无关紧要:

$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 方法接受一个闭包作为其唯一参数。对象实例本身将被传递给闭包,然后由 tap 方法返回:

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

throw_if() {.collection-method}

如果给定的布尔表达式计算结果为 truethrow_if 函数将抛出给定的异常:

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}

如果给定的布尔表达式计算结果为 falsethrow_unless 函数将抛出给定的异常:

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($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}

如果给定的条件计算结果为 truewhen 函数将返回它所给定的值。否则,将返回 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 毫秒
 
Benchmark::dd([
    'Scenario 1' => fn () => User::count(), // 0.5 毫秒
    'Scenario 2' => fn () => User::all()->count(), // 20.0 毫秒
]);

默认情况下,给定的回调函数将执行一次(一次迭代),并且它们的持续时间将显示在浏览器/控制台中。

要多次调用回调函数,可以将回调函数应被调用的迭代次数作为方法的第二个参数指定。当多次执行回调函数时,Benchmark 类将返回在所有迭代中执行回调函数所需的平均毫秒数:

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

有时,您可能想要在基准测试回调函数的执行时仍然获取回调函数返回的值。value 方法将返回一个包含回调函数返回的值和执行回调函数所需的毫秒数的元组:

[$count, $duration] = Benchmark::value(fn () => User::count());

日期

Laravel 包含 Carbon (opens in a new tab),这是一个强大的日期和时间操作库。要创建一个新的 Carbon 实例,您可以调用 now 函数。这个函数在您的 Laravel 应用程序中全局可用:

$now = now();

或者,您可以使用 Illuminate\Support\Carbon 类创建一个新的 Carbon 实例