mehr-it / lara-ext
laravel 的助手和宏集合
Requires
- php: >=7.3
- ext-mbstring: *
- ext-pdo: *
- laravel/framework: ^5.8|^6.0|^7.0|^8.0
- mehr-it/buffer: ^1.3
Requires (Dev)
- orchestra/testbench: ^3.8|^4.0|^5.0|^6.0
- phpunit/phpunit: ^7.4|^8.4
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