its-mieger / lara-ext
Requires
- funkjedi/composer-include-files: 1.0.0
- its-mieger/obj: ^1.3
Requires (Dev)
- orchestra/testbench: ~3.7.0
- phpunit/phpunit: ^7.0
README
此库向 Laravel PHP 框架添加了常用功能。它还与 its-mieger/obj
包(帮助对象表现得像原生数据类型)很好地集成到 Laravel 中。
目前包括以下内容
- 集合宏
- 字符串宏
- 额外的辅助工具
- 改进的辅助函数
还包括一个用于 IDE 自动完成的辅助文件。
安装
更新 composer 后,将服务提供者添加到 config/app.php 中的 providers 数组。
如果启用了自动包发现,则不需要这样做。
ItsMieger\LaravelExt\Provider\LaraExtServiceProvider::class,
##集合宏 以下宏扩展了 Illuminate\Support\Collection
宏 | 描述 |
---|---|
diffBy |
具有自定义比较器的 array_diff |
diffAssocBy |
具有自定义比较器的关联数组_diff |
diffObj |
使用对象比较的 array_diff |
diffAssocObj |
使用对象比较的关联数组_diff |
sortCallback |
使用自定义排序函数进行排序 |
sortCallbackDesc |
使用自定义排序函数进行降序排序 |
sortObj |
使用对象比较进行排序 |
sortObjDesc |
使用对象比较进行降序排序 |
compareToValues |
将集合值与另一个集合进行比较 |
compareToValuesAssoc |
将集合值和键与另一个集合进行比较 |
maxBy |
获取返回指定回调的最大值的项 |
minBy |
获取返回指定回调的最小值的项 |
字符串宏
宏 | 描述 |
---|---|
extract |
类似于 explode,但保证结果数组长度,例如: [$a, $b] = Str::extract('a:b:c', ':', 2) |
replaceLineBreaks |
替换字符串中的所有换行符(Linux、Windows 和 Mac(旧的和 OS X)) |
辅助工具
宏 | 描述 |
---|---|
buffer |
创建一个新的 FlushingBuffer 实例 |
chunked |
生成器的 array_chunk() |
mapped |
生成器的 array_map() |
joined |
将两个集合连接起来,并将元组传递给回调 |
cursor_get |
迭代器的 data_get() |
iterator_for |
获取给定值的迭代器 |
group_by_consecutive |
根据给定字段对数据进行分组(需要分组值的连续顺序) |
db_quote_identifier |
引用给定的标识符,用于在原始 SQL 表达式中使用 |
辅助工具改进
data_get
现在,data_get
辅助工具支持从获取器接收数据
data_get('getA()', $target);
data_get('test.getA()', $target);
这对于在许多使用 data_get
的方法中也很方便,例如许多集合方法
$collection->sortBy('getUnitPrice()');
附加辅助工具
buffer()
Flushing buffers 实现了具有给定大小的缓冲区,当缓冲区满时,将自动使用给定的处理函数刷新。
您可以使用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_generator()
函数与chunked()
函数非常相似,但返回一个生成器,该生成器产生由处理函数返回的所有生成器。
$in = function() { /* input generator code */ };
$generator = chunked_generator($in, 500, function($chunk) {
yield /* ... */
});
mapped()
mapped()
函数的行为类似于array_map()
函数,但也可以与生成器一起使用。
$generator = function() { /* generator code */ };
$mappedGenerator = mapped($generator, function($v) { /* mapping code */ });
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 */
});
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
iterator_for()
iterator_for()
助手函数为给定的值创建一个迭代器。迭代器按原样返回,对于数组,返回一个ArrayIterator,所有其他值都作为数组迭代器的第一个元素返回,如果它们不是null。传递null将返回一个EmptyIterator。
$iter = iterator_for(['a', 'b']);
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'] ]
db_quote_identifier()
为在原始SQL表达式中使用引用给定的标识符。
db_quote_identifier('table');
// => `table`
db_quote_identifier('table.field');
// => `table`.`field`