Aller au contenu principal

← Précédent · Retour au README · Suivant →

Plusieurs fichiers de flux ciblés

Cette recette enregistre un seul ProductFeed et utilise des cibles de flux pour générer plusieurs fichiers XML. Chaque cible fournit des paramètres que builder() utilise pour ses propres conditions de requête et que filename() utilise pour son propre chemin de sortie. Les cibles available et unavailable ne sont que des exemples : une cible peut représenter n’importe quelle condition métier.

Cibles de flux et perFile()​

perFile() fractionne le résultat d’une seule requête en fichiers séquentiels après un nombre fixe d’enregistrements. La requête et les conditions de sélection restent identiques pour tous ces fichiers.

FeedTarget exécute le flux séparément pour chaque cible. L’application peut donc utiliser target() pour modifier les conditions de requête et le nom de fichier de chaque sortie. Les deux mécanismes peuvent être combinés : sélectionnez d’abord un jeu de données propre à la cible, puis fractionnez-le selon le nombre d’enregistrements.

Cet exemple crée les fichiers ciblés suivants :

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

Créer le flux​

php artisan make:feed Product

Configurer la sortie​

Remplacez la classe de flux générée par :

<?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() énumère les clés de cible configurées pour les exécutions complètes. findTarget() résout les clés explicitement demandées sans énumérer toutes les cibles. builder() filtre les produits pour la cible active et filename() attribue un chemin unique à chaque cible.

Activer​

Vérifiez le fichier d’opération ou de migration généré, puis exécutez la commande appropriée :

# For Laravel Deploy Operations
php artisan operations

# For Laravel Migrations
php artisan migrate

Générer les fichiers​

Transmettez l’identifiant d’enregistrement du flux. La commande génère un fichier pour chaque cible renvoyée par targets() :

php artisan feed:generate 123

Pour les cibles available et unavailable, les chemins générés sont :

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

Générer les fichiers avec filtrage​

Utilisez l’option répétable --target pour actualiser uniquement les fichiers des cibles sélectionnées :

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

Fractionner les fichiers par nombre d’enregistrements​

Ajoutez perFile() lorsque la sortie d’une cible peut elle aussi devenir trop volumineuse :

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

La cible available peut alors produire products/available-1.xml, products/available-2.xml et les parties suivantes. Ce fractionnement par nombre d’enregistrements s’applique indépendamment à chaque cible.

Voir aussi​