webman 默认不提供 illuminate\support\collection,需手动安装 illuminate/support 并重启服务;推荐用 collect($array) 而非 new collection();支持 map/filter 等方法,但 pluck/groupby/firstwhere 等需注意数据结构;无 paginate 方法,需手动分页;大集合易内存溢出,应避免全量加载。

Webman 里没有 Illuminate\Support\Collection,得自己配
Webman 默认不带 Laravel 风格的集合类,collect()、map()、filter() 这些方法直接调用会报 Call to undefined function collect()。它只提供基础数组工具(如 Arr::),但远不如 Collection 灵活。想用就得手动引入 illuminate/support,且必须确保版本兼容。
- 装包时一定要加
-W:否则composer require illuminate/support可能漏掉symfony/var-dumper或低版本illuminate/contracts,导致运行时报Class Illuminate\Support\Arr not found - 装完必须重启:
php start.php restart,reload不会加载新类自动注册器 - 别用
new Collection()手动实例化——虽然语法合法,但后续链式调用可能因未初始化 helper 函数而失败;推荐统一用collect($array)入口
collect() 返回对象后,常见操作和 Laravel 基本一致
引入成功后,collect() 返回的是标准 Illuminate\Support\Collection 实例,支持绝大多数 Laravel 风格方法,但要注意两点:一是 Webman 没有全局辅助函数自动注册机制,二是部分方法依赖协程环境时行为不同。
-
collect([1,2,3])->map(fn($v) => $v * 2)✅ 正常工作 -
collect(['a' => 1, 'b' => 2])->pluck('a')❌ 报错 ——pluck()要求键值对结构,这里传的是数值索引数组,应写成collect([['k' => 'a', 'v' => 1], ['k' => 'b', 'v' => 2]])->pluck('v', 'k') -
collect($rows)->groupBy('status')✅ 支持,但注意:若$rows是 PDOStatement::fetchAll() 结果(关联数组),没问题;若是 numeric 数组嵌套对象,需先->toArray()再分组 -
collect($data)->firstWhere('id', 123)✅ 可用,但性能不如数据库层 where —— 它是 PHP 内存遍历,大数据量慎用
不能直接用 $collection->paginate(),分页得自己算
Illuminate\Support\Collection 本身不提供分页能力,->paginate() 是 Eloquent Builder 的方法,Collection 上调用会报 Call to undefined method Illuminate\Support\Collection::paginate()。Webman 里没 ORM 自动注入,更不会有 Builder 绑定。
- 手动分页三步走:
$offset = ($page - 1) * $limit→$slice = $collection->slice($offset, $limit)→['data' => $slice->values(), 'total' => $collection->count()] -
->values()必须加:否则返回的仍是带原始键的 Collection,前端 JSON 序列化会变成对象而非数组 - 如果数据源来自数据库查询,强烈建议把分页逻辑下推到 SQL 层(
limit $limit offset $offset),而不是先查全量再collect()后切片 —— 内存和性能双浪费
协程环境下 collect() 不会自动 yield,大集合要小心内存
Collection 是纯内存结构,collect($hugeArray) 会一次性把整个数组载入内存。Webman 虽然支持协程,但 Collection 本身不是协程安全的数据结构,也不会自动 chunk 或 lazy 迭代。
- 遇到上万条记录,别写
collect(Db::table('logs')->get())->filter(...)—— 极易 OOM - 替代方案:用生成器 +
foreach流式处理,或改用Db::cursor()(如果底层驱动支持)逐行读取 - 若真需要集合式操作,先
->take(1000)限制数量,或按业务拆成小批次处理
实际用起来最易忽略的点:你写的每一行 collect(...) 都在吃内存,而 Webman 的优势恰恰是轻量和低开销。集合操作不是不能用,而是得清楚它在哪一层起作用——它解决的是 PHP 数组加工问题,不是替代数据库查询或协程调度。











