介绍
Laravel 包含了多种全局的“助手”PHP 函数。许多这些函数被框架本身所使用;然而,如果您觉得方便,也可以在自己的应用程序中使用它们。
可用方法
数组与对象
Arr::accessible Arr::add Arr::collapse Arr::crossJoin Arr::divide Arr::dot Arr::except Arr::exists Arr::first Arr::flatten Arr::forget Arr::get Arr::has Arr::hasAny Arr::isAssoc Arr::isList Arr::join Arr::keyBy Arr::last Arr::map Arr::mapSpread Arr::mapWithKeys Arr::only Arr::pluck Arr::prepend Arr::prependKeysWith Arr::pull Arr::query Arr::random Arr::set Arr::shuffle Arr::sort Arr::sortDesc Arr::sortRecursive Arr::take Arr::toCssClasses Arr::toCssStyles Arr::undot Arr::where Arr::whereNotNull Arr::wrap data_fill data_get data_set data_forget head last
数字
Number::abbreviate Number::clamp Number::currency Number::fileSize Number::forHumans Number::format Number::ordinal Number::pairs Number::percentage Number::spell Number::trim Number::useLocale Number::withLocale
路径
URL
杂项
abort abort_if abort_unless app auth back bcrypt blank broadcast cache class_uses_recursive collect config context cookie csrf_field csrf_token decrypt dd dispatch dispatch_sync dump encrypt env event fake filled info literal logger method_field now old once optional policy redirect report report_if report_unless request rescue resolve response retry session tap throw_if throw_unless today trait_uses_recursive transform validator value view with when
数组与对象
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}
$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}
如果给定的条件为 true
,report_if
函数将使用您的 异常处理程序 报告一个异常:
report_if($shouldReport, $e);
report_if($shouldReport, 'Something went wrong.');
report_unless()
{.collection-method}
如果给定的条件为 false
,report_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}
如果给定的布尔表达式计算结果为 true
,throw_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}
如果给定的布尔表达式计算结果为 false
,throw_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}
如果给定的条件计算结果为 true
,when
函数将返回它所给定的值。否则,将返回 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
实例