Как экспортировать в CSV на основе объекта на основе шаблона? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь экспортировать некоторые модели в CSV на основе шаблонов.

У меня есть CSVWriter

<?php
namespace App\Http\DataExport;
use App\Http\DataExport\WriterInterface;
use App\Http\DataExport\CSVGenerator;
use League\Csv\Writer;

use Storage;

class CSVWriter implements WriterInterface
{
/**
* @var Storage
*/
private $files;
private $generator;

/**
* @param Storage $files
* @return void
*/
public function __construct(Storage $files)
  {
    $this->files = $files;
  }

  /**
  * Write the data to a file and return the path
  *
  * @param string $template
  * @param array $data
  * @return string
  */
  public function write($template, array $data)
  {

    $filename = sprintf('export-%s.csv', time()); //filename to export
    $pathToWrite = '/storage/export-templates/';
    $template = $pathToWrite.sprintf('%s.php', strtolower($template));

    /** New file from template **/
    $writer = Writer::createFromPath($template, 'a+');
    /** New generator from writer template */
    $generator = new CSVGenerator($writer);

    file_put_contents($pathToWrite . $filename, $generator->generate($template, $data));

    $path = sprintf($pathToWrite . '%s', $filename);

    return $path;
  }
}

?>

Использование League CSV У меня есть этот генератор:

<?php
namespace App\Http\DataExport;
use League\Csv\Writer;

class CSVGenerator implements FileGeneratorInterface
{
  /**
  * @var Writer
  */
  private $writer;

  /**
  * @param Writer $writer
  * @return void
  */
  public function __construct(Writer $writer)
  {
    $this->writer = $writer;
  }

  /**
  * Build the template data
  *
  * @param string $template
  * @param array $data
  * @return array
  */
  public function build($template, array $data)
  {
    /* TO CHECK / TODO */

    return call_user_func(require $template, [$data]);
  }

  /**
  * Generate the CSV file
  *
  * @param string $template
  * @param array $data
  * @return Writer
  */
  public function generate($template, array $data)
  {
    return $this->writer->insertAll($this->build($template, $data));
  }

}
?>

data пока что просто продукт:

array:12 [
  "product_id" => 1
  "sku" => "SKU1234567"
  "name" => "Tenis shoes"
  "unique_id" => null
  "organization_id" => 1
  "created_at" => "2018-09-10 08:23:12"
  "updated_at" => "2018-09-10 08:23:12"
  "upc" => "1351125"
  "external_code" => "1596916"
  "vat" => "9"
  "ean" => "215511"
  "deleted_at" => null
]

Он будет писать внутри шаблона (файл php). Внутри CSV напишет целое число, потому что функция insertAll() возвращает количество символов, вставленных в файл.

Что я делаю не так?

...