Pular para o conteúdo principal

← Anterior · Voltar ao README · Próximo →

Vários arquivos de feed por alvo

Esta receita registra um único ProductFeed e usa alvos de feed para gerar vários arquivos XML. Cada alvo fornece parâmetros que builder() usa em suas próprias condições de consulta e que filename() usa em seu próprio caminho de saída. Os alvos available e unavailable são apenas exemplos: um alvo pode representar qualquer condição de negócio.

Alvos de feed versus perFile()​

perFile() divide o resultado de uma única consulta em arquivos sequenciais com um limite fixo de registros por arquivo. A consulta e as condições de seleção permanecem as mesmas em todos esses arquivos.

FeedTarget executa o feed separadamente para cada alvo. Assim, a aplicação pode usar target() para alterar as condições da consulta e o nome do arquivo de cada saída. Os dois mecanismos podem ser combinados: primeiro selecione um conjunto de dados específico do alvo e depois divida-o pela quantidade de registros.

Este exemplo cria os seguintes arquivos de saída por alvo:

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

Criar o feed​

php artisan make:feed Product

Configurar a saída​

Substitua a classe de feed gerada por:

<?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() enumera as chaves de alvo configuradas nas execuções completas. findTarget() resolve as chaves solicitadas explicitamente sem enumerar todos os alvos. builder() filtra os produtos do alvo ativo, e filename() atribui um caminho exclusivo a cada alvo.

Ativar​

Revise o arquivo de operação ou migração gerado e execute o comando adequado:

# For Laravel Deploy Operations
php artisan operations

# For Laravel Migrations
php artisan migrate

Gerar arquivos​

Passe o ID de registro do feed. O comando gera um arquivo para cada alvo retornado por targets():

php artisan feed:generate 123

Para os alvos available e unavailable, os arquivos são gerados nos seguintes caminhos:

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

Gerar arquivos com filtragem​

Use a opção repetível --target para gerar arquivos somente para os alvos selecionados:

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

Dividir arquivos por quantidade de registros​

Adicione perFile() quando o arquivo de um alvo puder ficar grande demais:

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

Com isso, o alvo available pode gerar products/available-1.xml, products/available-2.xml e os arquivos seguintes. Essa divisão por quantidade de registros é aplicada separadamente a cada alvo.

Veja também​