我在Laravel应用程序中使用了以下名为Laravel-Excel的软件包。链接提供如下。
我希望能够做的是创建一个父类,它将生成我的所有报告,我可以使用子类来定义列标题和创建Excel文档所需的数据。我四处看看是否有人完成了这件事。我没有发现这种情况。关于我到目前为止的任何建议?
<?php
namespace App\Reports;
use Excel;
class Report
{
protected $columnHeadings = [];
protected $dataSet;
public function generate()
{
Excel::create($filename, function ($excel) {
$excel->sheet($sheetname, function ($sheet) {
$sheet->appendRow($this->columnHeadings, null, 'A1', false, false);
$dataSet->each(function($data) use ($sheet) {
});
});
})->download($type);
}
}
答案 0 :(得分:1)
你想要实现的目标是template pattern design
。你可以在哪里拥有一个基本类,它通常不是因为它可以作为一个解析器,所以大多数时候你会想要一个抽象类作为基类。
在该基类中,您可以在案例filename
和columns
中定义一些属性,这些属性将从子类中重写。您可能想要的类结构:
Base Abstract ReportGenerator ->Child MonthlyReport Class ->Child YearlyReport Class
您的案例中的代码:
<?php
namespace App\Reports;
use Excel;
abstract class ReportGenerator
{
protected $columnHeadings = [];
protected $dataSet;
protected $fileName;
public function generate()
{
return Excel::create($this->filename, function ($excel) {
$excel->sheet($sheetname, function ($sheet)use ($headings = $this->columnHeadings) {
$sheet->appendRow($headings, null, 'A1', false, false);
$dataSet->each(function($data) use ($sheet) {
})->download($type);
});
});
}
}
然后在你的孩子班上:
<?php
namespace App\Reports;
use App\Reports\ReportGenerator;
class MonthlyReport extends ReportGenerator {
//set the properties for this specific class so they can override the base properties whenever this class its init.
protected $columnHeadings = [];
protected $dataSet;
protected $fileName ='Monthly Report';
public function __construct(SomeModel $model){
//set the required headings for this specific report
$this->columnHeadings = ['some headings'];
$this->data = $model;
}
public function generateMonthlyReport(){
return $this->generate();
}
}
因此,无论何时您想要生成月度报告,您都可以:
MonthlyReport->generate($someModel);
您可以创建其他类来生成不同的报告但扩展抽象的claass!