← 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.