Перейти до основного вмісту

← Попередня · Назад до 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 і наступні частини. Таке розділення за кількістю записів застосовується незалежно для кожної цілі.

Дивіться також​