Laravel Excel父/子类

时间:2018-01-11 20:17:38

标签: php laravel

我在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);
    }
}

http://www.maatwebsite.nl/laravel-excel/docs

1 个答案:

答案 0 :(得分:1)

你想要实现的目标是template pattern design。你可以在哪里拥有一个基本类,它通常不是因为它可以作为一个解析器,所以大多数时候你会想要一个抽象类作为基类。

在该基类中,您可以在案例filenamecolumns中定义一些属性,这些属性将从子类中重写。您可能想要的类结构:

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!