mehr-it/lara-ext

laravel 的助手和宏集合

1.4.0 2022-01-11 06:10 UTC

This package is auto-updated.

Last update: 2024-09-11 11:50:53 UTC


README

此库为 Laravel PHP 框架添加了常用助手和宏。

目前包括以下内容

  • 集合宏
  • 字符串宏
  • 额外助手

还包括一个用于 IDE 自动完成的助手文件。

安装

通过 composer 安装

composer require mehr-it/lara-ext

此包使用 Laravel 的自动包检测

集合宏

以下宏扩展了 Illuminate\Support\Collection

数组宏

以下宏扩展了 Illuminate\Support\Arr

字符串宏

以下宏扩展了 Illuminate\Support\Str

助手

助手

buffer()

缓冲区刷新实现具有给定大小的缓冲区,当缓冲区满时,使用给定的处理函数自动刷新。

您可以使用 buffer-助手创建一个实例。它最多接受三个参数

buffer(10, function(data) { /* send data */ });
buffer(10, function(data) { /* send data */ }, function() { return collect(); });

第一个参数指定缓冲区大小,第二个参数是每次缓冲区满时被调用的处理函数。它接收缓冲区数据作为参数。第三个参数是可选的,用作底层数据结构的解析器。如果省略,则使用简单的数组。

使用 add()-方法将新项目添加到缓冲区。通常您希望最后一次刷新缓冲区,在添加所有数据之后,即使它不满。为此,只需调用 flush()-方法以手动刷新缓冲区

$b = buffer(2, function(data) { /* send data */ });
$b->add(1);
$b->add(2);
$b->add(3);
$b->flush();

如果您想替换缓冲区中给定键的元素,也可以指定一个键。

$b = buffer(2, function(data) { /* send data */ });
$b->add(1, 'key1');
$b->add(2, 'key1');

当然,替换现有元素不会增加缓冲区大小,因此不会引起缓冲区刷新。

chunked()

当处理无法一次性处理的大数据时,本机 array_chunk()-函数非常有用。然而,它并不能解决您可能甚至无法一次性加载所有输入数据的问题。在这里,chunked()-助手函数——它也接受生成器——就派上用场了。请看以下示例

$generator = function() { /* generator code */ };

chunked($generator, 500, function($chunk) {
	/* processing code */
});

chunked_generator()

chunked()-函数非常相似,但 chunked_generator()-函数返回一个生成器,它产生由处理程序返回的所有生成器。

$in = function() { /* input generator code */ };

$generator = chunked_generator($in, 500, function($chunk) {
	yield /* ... */
});

cursor_get()

cursor_get() 助手遍历传递的项目(游标、集合、数组等),并使用 data_get() 为每个项目接收一个值,该值将由返回的生成器返回。您还可以传递一个闭包作为字段参数,该闭包返回每个项目的值

$data = [
	['x' => ['y' => 7]],
	['x' => ['y' => 8]],
];

foreach(cursor_get($data, 'x.y') as $v) {
	echo $v;
}
// => 7
// => 8

group_by_consecutive()

group_by_consecutive() 助手根据给定的键将给定的迭代器或数组中的数据分组。只要一个项的组值与上一个项的组值不匹配,就会开始一个新的组。因此,相同的组值必须连续出现在输入中才能正确地进行输出分组。组值使用严格比较进行比较。

$data = [ ['x' => 15, 'y' => 'a'], ['x' => 16, 'y' => 'a'], ['x' => 17, 'y' => 'b'] ];

$iter = group_by_consecutive($data, 'y');

// => [ ['x' => 15, 'y' => 'a'], ['x' => 16, 'y' => 'a'] ]
// => [ ['x' => 17, 'y' => 'b'] ]

iterator_for()

iterator_for() 助手为给定的值创建一个迭代器。迭代器按原样返回,对于数组返回 ArrayIterator,对于所有其他值,如果它们不是 null,则返回数组迭代器的第一个元素。传递 null 将返回 EmptyIterator。

$iter = iterator_for(['a', 'b']);

joined()

通常您必须通过给定的字段将两个集合连接起来,并想要处理连接的值对。joined() 助手使这项任务变得非常简单

joined($collectionA, 'fieldA', $collectionB, 'fieldB.x', function($a, $b) {
	/* do s.th. here */
});

闭包接收值对。默认情况下,只处理第一个匹配的值对。但您可以通过参数指定此操作。

此辅助函数非常灵活。您可以传入生成器、闭包、任何可遍历的对象甚至模型名称。

joined($collectionA, 'user', User::class, 'username', function($a, $b) {
	/* do s.th. here */
});

这将调用User::whereIn('username', /* .. */)->get()以接收右侧的集合。如果您需要更多的灵活性,您可以传递一个查询构建器。

joined($collectionA, 'user', User::where('active', true), 'username', function($a, $b) {
	/* do s.th. here */
});

mapped()

mapped()函数的行为类似于array_map()函数,但也可以与生成器一起使用。

$generator = function() { /* generator code */ };

$mappedGenerator = mapped($generator, function($v) { /* mapping code */ });

trans_default()

trans_default()辅助函数通过添加默认值的能力扩展了trans()辅助函数,该默认值在无法翻译值时使用。如果备用区域存在翻译,它仍然优先于默认值。

trans_default('app.myTranslationKey', 'The default value');

type_name()

type_name()辅助函数返回给定变量的类名。如果变量不是对象,则返回类型(由gettype()返回,但始终为小写)。

type_name(new MyClass());
// => 'MyClass'

type_name('a');
// => 'string'

type_name(null);
// => 'null'

with_locale()

with_locale()辅助函数暂时将应用程序区域设置设置为指定的值,并在给定回调返回后将其还原。

// locale is 'en'

with_locale('de', function() {

    // locale is 'de'

});

// locale is 'en'

从its-mieger/lara-ext迁移

此包替换了废弃的its-mieger/lara-ext包。但是,此包中删除了一些功能。

  • data_get不再被覆盖,因此不再识别getter。

以下辅助函数已被删除(请参阅实现其功能的包mehr-it/lara-db-ext):

  • db_quote_identifier
  • db_table
  • db_table_raw
  • db_connection
  • db_field
  • db_field_raw

以下集合宏已被删除,因为它们抽象了另一个包的功能,而这不是此库的作用范围:

  • diffObj
  • diffAssocObj
  • sortObjDesc
  • compareToValues
  • compareToValuesAssoc
  • maxBy
  • minBy