czim / laravel-listify
将任何模型转换为列表。流行的 Lookitsatravis Listify 包的重建。
Requires
- php: >=7.1.3
Requires (Dev)
- orchestra/testbench: ^3.0|^4.0
- phpunit/phpunit: ~7.0|~8.0
README
这是出于个人原因对 Lookitsatravis 的 Listify 进行从头重建。它使用与 Listify 相同的接口,因此从那个切换到这个包不会破坏任何东西。
版本兼容性
变更日志
为什么?
Listify 很 好,但有一些不足之处
- 一个非常小的不足是代码规范,我认为它需要做一些认真的清理。
- 更令人烦恼的是对
private
方法属性的重度依赖,这使得无法使用灵活的继承方法与 Listify 一起使用。 - 在功能上,Listify 不适合可变作用域。属于作用域太受限(没有可空的远程键列),任何基于字符串的作用域都是不可变的。为了我的目的,我需要一个可调用的作用域,它能很好地处理作用域的交换,并将
null
作用域视为从列表中删除项目。
安装
通过 Composer
$ composer require czim/laravel-listify
用法
对于一般功能,原始 Listify 接口在很大程度上是相同的。有关参考,请参阅 原始文档。
一些例外情况适用
- 现在您可以使用可调用的作用域,它可能返回用于(原始)
where
子句的任何字符串。对 Listify 字符串作用域的原始限制仍然适用。但是,现在null
是一个可接受的作用域,它将保持或从任何列表中删除记录(其position
将保持为NULL
)。 - 现在您可以为 BelongsTo 作用域使用可空的远程键。没有相关远程键的记录不会添加到列表中。
虽然这不是必需的,但您可以为使用该特质的模型实现 ListifyInterface
以满足您的需求。
与原始 Listify 的区别
没有提供 attach
artisan 命令;您需要自己处理 position
列的迁移。
抛出的异常已经简化。现在抛出 InvalidArgumentException
、UnexpectedValueException
和 BadMethodCallException
而不是自定义异常。不再为 'null 作用域' 或 'null 外键' 抛出异常,因为这些现在是预期和允许的。现在,具有有效 'null 作用域' 的模型将默默地被排除在列表之外。
请注意,此包已与原始 listify PHPUnit 测试进行测试,并在未有意改变行为的地方通过测试。
最后,此特质可以使用继承使用(因为其基本作用域是 protected
而不是 private
)。您可以创建一个 'BaseListifyModel' 并扩展它以避免代码(或设置)重复。
处理全局作用域
当在列表化的模型上使用全局作用域时,这可能会破坏预期的功能,尤其是在全局作用域影响记录排序的情况下。为了处理这种情况,listify 将检查一个方法来根据需要清理作用域。要使用此方法,只需将以下方法的实现添加到您的列表化模型类中
/** * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function cleanListifyScopedQuery($query) { // Return the query builder after applying the necessary cleanup // operations on it. In this example, a global scope ordering the // records by their position column is disabled by using unordered() return $query->unordered(); }
此方法将在 listify 需要访问(及其自己的排序)对模型进行检查和操作时调用。
待办事项
- 字符串(和 QueryBuilder)作用域的工作方式有些奇怪。超出作用域的新记录将带有位置值添加。这些记录被报告为处于列表中,并且在操作它们时可能会发生奇怪的事情。
贡献
请参阅CONTRIBUTING获取详细信息。
致谢
显然,与Listify相关的大部分贡献归功于
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。