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