Введение
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! 🚀