its-mieger/lara-ext

该包已被 弃用 且不再维护。作者建议使用 mehr-it/lara-ext 包代替。

laravel 通用用例的有用扩展

2.6.0 2019-10-24 11:04 UTC

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`