atom1c.ru

Создание сервиса для генерации XML-файлов в Laravel

Введение

XML (Extensible Markup Language) — популярный формат для обмена данными между системами. В Laravel создание XML-файлов может потребоваться, например, для интеграции с внешними API, формирования прайс-листов или экспорта данных. В этой статье мы разработаем сервисный класс, который поможет легко генерировать XML-файлы в Laravel.

Настройка сервиса

Создадим сервисный класс XmlGeneratorService, который будет преобразовывать массив данных в XML и сохранять его в файле.

1. Создание файла сервиса

Перейдите в директорию app/Services/ (если её нет, создайте) и создайте файл XmlGeneratorService.php.

<?php

namespace App\Services;

use Illuminate\Support\Facades\Storage;
use SimpleXMLElement;

class XmlGeneratorService
{
    /**
     * Генерирует XML из массива и сохраняет в файле.
     *
     * @param array $data Данные для XML
     * @param string $filePath Путь к файлу
     * @return string Полный путь к файлу
     */
    public function generateXml(array $data, string $filePath): string
    {
        $xml = new SimpleXMLElement('<root/>');
        $this->arrayToXml($data, $xml);

        $dom = new \DOMDocument('1.0', 'UTF-8');
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        $dom->loadXML($xml->asXML());

        Storage::disk('local')->put($filePath, $dom->saveXML());

        return storage_path("app/{$filePath}");
    }

    /**
     * Преобразует массив в XML рекурсивно.
     */
    private function arrayToXml(array $data, SimpleXMLElement $xml): void
    {
        foreach ($data as $key => $value) {
            $key = is_numeric($key) ? "item{$key}" : $key;
            if (is_array($value)) {
                $subnode = $xml->addChild($key);
                $this->arrayToXml($value, $subnode);
            } else {
                $xml->addChild($key, htmlspecialchars($value));
            }
        }
    }
}

2. Использование сервиса

Теперь мы можем использовать сервис в любом месте Laravel. Например, в контроллере:

use App\Services\XmlGeneratorService;

public function generate(XmlGeneratorService $xmlService): JsonResponse
{
    $data = [
        'title' => 'Пример XML',
        'description' => 'Этот файл создан с помощью Laravel',
        'items' => [
            ['name' => 'Товар 1', 'price' => '100'],
            ['name' => 'Товар 2', 'price' => '200']
        ]
    ];

    $filePath = 'xml/example.xml';
    $fullPath = $xmlService->generateXml($data, $filePath);

    return response()->json([
        'message' => 'XML создан',
        'path' => $fullPath
    ]);
}

3. Результат

После вызова метода мы получим XML-файл следующего вида:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <title>Пример XML</title>
    <description>Этот файл создан с помощью Laravel</description>
    <items>
        <item0>
            <name>Товар 1</name>
            <price>100</price>
        </item0>
        <item1>
            <name>Товар 2</name>
            <price>200</price>
        </item1>
    </items>
</root>

Заключение

С помощью этого сервиса можно легко создавать XML-файлы в Laravel, просто передавая массив данных. Это полезно для работы с API, экспорта данных и других задач. Теперь ваш Laravel-проект готов к генерации XML! 🚀