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