从Web应用程序导出文件时的接口和基本实现

1.1.0 2016-07-05 14:25 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:04:24 UTC


README

Latest Version on Packagist Software License Build Status Code Coverage Quality Score

使用方法

在一段代码示例中它的作用

// A list of users to export.
$users = [
    [
        'username' => 'John Doe',
        'email' => 'john.doe@gmail.com',
    ],
    [
        'username' => 'Jane Doe',
        'email' => 'jane.doe@gmail.com',
    ],
];

// Create a new CSV exporter object.
$exporter = new Madewithlove\Export\Csv\Exporter();

// Create a new custom Transformer object (an anonymous class, only in PHP 7)
$transformer = new class implements Madewithlove\Export\Csv\Transformer, Madewithlove\Export\Csv\WithHeaders {
    public function getHeaders()
    {
        return ['username', 'email'];
    }

    public function transform(array $user)
    {
        return [
            $user['username'],
            $user['email'],
        ];
    }
};

$exporter->setItems($users);
$exporter->setTransformer($transformer);

// New controller being (an anonymous class, only in PHP 7)
$controller = new class {
    use Madewithlove\Export\Http\Psr7Response;

    /**
     * @param Madewithlove\Export\Exporter $exporter
     */
    public function index(Exporter $exporter)
    {
         return $this->fileDownload($exporter->getContent(), 'users.csv');
    }
};

$psrResponse = $controller->index($exporter);

CSV导出器

包含的CSV导出器(Madewithlove\Export\Csv\Exporter)将创建CSV导出文件的文件内容。为此,它使用了league/csv包中的Writer类,但这只是一个实现细节。它遵循Madewithlove\Export\Exporter接口(您可以自由地创建XML或其他导出器实现),并在调用它的getContent()方法时返回文件内容。您可以通过将数组或Iterator(如Generator)传递给setItems($items)方法来定义它应该导出哪些项目。您还可以可选地设置一个Transformer来对给定项目的每一行应用转换。此TransformerLeague\Csv\Writer类使用,并可实现Madewithlove\Export\Csv\WithHeaders协议,以便让写入器知道CSV文件应该有哪些标题。

转换器

转换器对象有一个transform(array $row) : array方法,允许您对每一行进行转换。接口Madewithlove\Export\Csv\WithHeaders定义了一个getHeaders() : array方法,它返回CSV文件中应使用的标题。

此包还包括一些通用用途的转换器实现

可调用转换器

这允许您使用任何可调用(函数)而不必创建实现转换器接口的类。通过使用工厂方法创建一个,或者使用设置方法

use Madewithlove\Export\Csv\Transformers\CallableTransformer;

$transformer = (new CallableTransformer())->setTransformer(function (array $row) {...});

$transformer = CallableTransformer::fromCallable(function (array $row) {...});

空转换器,仅标题

当您不需要对行进行转换,但您希望将标题插入CSV文件时,请使用JustHeaders转换器类

use Madewithlove\Export\Csv\Transformers\JustHeaders;

$transformer = (new JustHeaders())->setHeaders(['username', 'email']);

$transformer = JustHeaders::fromHeaders(['username', 'email']);

标题装饰器

当您已有现有的Transformers对象,但希望它也向CSV文件添加标题时,您无需扩展它。只需用WithHeadersDecorator包装它即可

use Madewithlove\Export\Csv\Transformers\JustHeaders;

$transformer = new WithHeadersDecorator($reusedTransformer, $headers);

$transformer = (new WithHeadersDecorator($reusedTransformer))->setHeaders($headers);

HTTP响应对象

支持Symfony和PSR-7响应对象。在控制器中使用Madewithlove\Export\Http\SymfonyResponseMadewithlove\Export\Http\Psr7Response特性来使用fileDownload($content, $filename)方法创建文件下载响应对象。这需要您安装symfony/http-foundation包或zendframework/zend-diactoros包。

安装

为了通过composer安装它,您应该运行以下命令

composer require madewithlove/export

测试

$ vendor/bin/phpunit

致谢

所有贡献者

许可

MIT许可(MIT)。请参阅许可文件以获取更多信息。