lss / yareport
又一个报告编写器
Requires
- php: >=8.0
- psr/http-message: ^1.0
- thecodingmachine/safe: ^2
Requires (Dev)
- nesbot/carbon: ^2.53
- nyholm/psr7: ^1.4
- phpoffice/phpspreadsheet: ^1.18
- phpstan/phpstan: ^1
- phpstan/phpstan-phpunit: ^1
- phpstan/phpstan-strict-rules: ^1
- phpunit/phpunit: ^9.1
This package is auto-updated.
Last update: 2024-09-27 05:03:51 UTC
README
这是一个报告编写器,您可以
- 定义您想要的列
- 从某个地方获取数据(例如数据库查询)
- 以不同的格式呈现数据,例如json、csv、html,或提取电子邮件地址
这基于我在20世纪90年代末最初编写的一个库。从那时起,我在许多项目中使用了它,并随着PHP的成熟而不断更新
- PHP >= 8.0,具有严格的类型
- phpstan --level=max
- 高单元测试覆盖率
- 经过多年战斗测试
- 尽可能轻量级
安装
composer require lss/yareport
另请参阅 lss/yadbal,这是一个与该工具兼容的数据库抽象层。您需要一些额外的胶水代码(请参阅示例文件夹)
用法
创建报告
$report = new Report(); $report->addColumn((new Column('name', 'Name', 'Personal name'))->setSortOrder(['name'])); $report->addColumn((new EmailColumn('email', 'Email'))->setSortOrder(['email'])); $report->addColumn((new MoneyColumn('rate', 'Hourly Rate'))->setCurrencySymbol('$')->setSortOrder(['rate', 'name'])); $report->addColumn(new IntegerColumn('weight', 'Weight (kg)', 'before eating')); $report->addColumn((new BooleanColumn('is_active', 'Is Active'))->setNoHtml('Nope')->setYesHtml('Yep')); $report->addColumn((new CalculatedColumn('menu', ''))->setRenderHtml(fn() => '*menu*'));
然后在多种格式中呈现它
逗号分隔值
$csvString = (new CSVRender())->render($report, $data); return new Response(200, ['Content-Type' => 'text/csv'], $csvString);
JSON
$jsonArray = (new JsonRender())->render($report, $data); return new Response(200, ['Content-Type' => 'text/json'], json_encode($jsonArray));
电子邮件
$emailAddresses = (new EmailRender())->render($report, $data, fn(array $row): string => $row['name'] ?? ''); // eg as a response to an ajax request return new Response(200, ['Content-Type' => 'text/plain'], join(', ', $emailAddresses));
按用户自定义
列可以是必需的、可见的或隐藏的。《ReportSerializer》允许您定义一个具有默认列的标准报告,所有人都可以看到。如果您创建了一种自定义报告的方法(添加额外的可选列、更改列顺序、更改标题等),则《ReportSerializer》允许您为每个用户保存到某个位置,然后重新加载,以便用户看到基于标准模板的自己的报告版本。序列化器很健壮,如果从代码中添加或删除列,并且按用户配置的配置引用了旧列,则它们将被静默忽略
提示
您可能希望所有 MoneyColumn 都以相同的方式配置。还有其他列类型。创建一个 ReportBuilder 或 ColumnFactory 类,创建并配置每个列类型,就像您想要的。例如,我有一个 BulkActionsCheckbox 列类型,它将复选框添加到html表的左侧,还有一个 MenuColumn,它放在html表的右侧。我在很多地方使用这些,并不想重复自己
这些类设计得易于扩展,具有许多受保护的方法定义。我不保证维护受保护方法的向后兼容性,但如果有任何变化,迁移应该是相当痛苦的(因为我还必须在所有代码中执行相同的迁移)。变化不太可能。我已经使用这个库很多年了,现在它相当稳定。主要内部更改或公共接口更改将遵循semver。