← 이전 · 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()은 각 대상에 고유한 경로를 지정합니다.
활성화
생성된 operation 또는 마이그레이션 파일을 검토한 다음 적절한 명령을 실행하십시오.
# For Laravel Deploy Operations
php artisan operations
# For Laravel Migrations
php artisan migrate
파일 생성
피드 등록 ID를 전달하십시오. 명령은 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 및 이후 파일을 생성할 수 있습니다. 이 레코드 수 기준 분할은 각 대상에 독립적으로 적용됩니다.