Перейти к основному содержимому

← Предыдущая · Назад к README · Следующая →

Несколько целевых файлов фида

Этот рецепт регистрирует один ProductFeed и с помощью целей фида создаёт несколько XML-файлов. Каждая цель передаёт параметры: builder() использует их для индивидуальных условий выборки, а filename() — для отдельного пути. Цели available и unavailable — лишь примеры: целью может быть любое бизнес-условие.

Цели фида и perFile()​

perFile() делит результат одного запроса на последовательные файлы после заданного количества записей. Запрос и условия выборки для этих файлов не меняются.

FeedTarget запускает фид отдельно для каждой цели. Приложение может использовать target(), чтобы менять условия запроса и имя файла для каждого вывода. Механизмы можно сочетать: сначала выбрать целевой набор данных, затем разделить его по количеству записей.

В этом примере создаются следующие целевые файлы:

storage/app/public/products/available.xml
storage/app/public/products/unavailable.xml

Создание фида​

php artisan make:feed Product

Настройка вывода​

Замените сгенерированный класс фида следующим кодом:

<?php

declare(strict_types=1);

namespace App\Feeds;

use App\Models\Product;
use DragonCode\LaravelFeed\Concerns\InteractsWithFeedTargets;
use DragonCode\LaravelFeed\Contracts\HasFeedTargets;
use DragonCode\LaravelFeed\Feeds\Feed;
use DragonCode\LaravelFeed\Feeds\FeedTarget;
use Illuminate\Database\Eloquent\Builder;

class ProductFeed extends Feed implements HasFeedTargets
{
use InteractsWithFeedTargets;

private const TARGETS = [
'available' => ['in_stock' => true],
'unavailable' => ['in_stock' => false],
];

public function targets(): iterable
{
foreach (array_keys(self::TARGETS) as $key) {
yield $this->makeTarget($key);
}
}

public function findTarget(string $key): ?FeedTarget
{
return isset(self::TARGETS[$key]) ? $this->makeTarget($key) : null;
}

public function builder(): Builder
{
return Product::query()->where(
'in_stock',
$this->target()->parameters['in_stock'],
);
}

public function filename(): string
{
return "products/{$this->target()->key}.xml";
}

private function makeTarget(string $key): FeedTarget
{
return new FeedTarget(
key : $key,
parameters: self::TARGETS[$key],
);
}
}

targets() перечисляет настроенные ключи целей для полного запуска. findTarget() находит явно запрошенные ключи без перебора всех целей. builder() фильтрует товары для активной цели, а filename() задаёт каждой цели уникальный путь.

Активация​

Проверьте сгенерированный файл операции или миграции, затем выполните подходящую команду:

# For Laravel Deploy Operations
php artisan operations

# For Laravel Migrations
php artisan migrate

Генерация файлов​

Передайте идентификатор регистрации фида. Команда сгенерирует файл для каждой цели, возвращённой targets():

php artisan feed:generate 123

Для целей available и unavailable файлы будут созданы по следующим путям:

storage/app/public/products/available.xml
storage/app/public/products/unavailable.xml

Генерация файлов с фильтрацией​

Используйте повторяемый параметр --target, чтобы сгенерировать файлы только для выбранных целей:

php artisan feed:generate 123 --target=available
php artisan feed:generate 123 --target=available --target=unavailable

Разделение файлов по количеству записей​

Добавьте perFile(), если файл для одной цели может стать слишком большим:

public function perFile(): int
{
return 50000;
}

Тогда для цели available будут созданы products/available-1.xml, products/available-2.xml и последующие части. Такое разделение по количеству записей применяется независимо для каждой цели.

Смотрите также​