Перайсці да асноўнага змесціва

← Папярэдняя · Назад да 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 і наступныя часткі. Такі падзел паводле колькасці запісаў выконваецца асобна для кожнай мэты.

Глядзіце таксама​