← Précédent · Retour au README · Suivant →
Eloquent
FeedObserver::saving() s’exécute à chaque appel des méthodes du modèle create(), update() ou save() avec les événements activés. Depuis la PR #335, il affecte $feed->slug = $feed->title uniquement lorsque $feed->isDirty('slug') est faux. SlugCast applique Str::slug() aux slugs générés comme à ceux fournis manuellement. Par exemple, Products devient products.
Un slug explicitement modifié est conservé pour cet enregistrement, même si title change en même temps. Cela ne rend pas le slug personnalisé permanent : lors d’un enregistrement normal ultérieur, un slug inchangé est recalculé à partir de title, même si le titre est inchangé. Affecter le même slug, ou une valeur dont la normalisation donne le slug actuel, ne compte pas comme une modification.
L’observateur lit la propriété title actuelle, avec les accesseurs modernes ou classiques et les setters déjà appliqués. Il ne lit pas le titre brut stocké et ne garantit pas la valeur finale écrite en base. Un accesseur renvoyant Display: Stored: Product Catalog produit display-stored-product-catalog. Placez la mise en forme destinée à l’affichage dans un accesseur séparé.
saveQuietly() et les enregistrements dans withoutEvents() ignorent l’observateur. Modifier ainsi title conserve l’ancien slug, sauf affectation explicite par l’application. Utilisez un enregistrement normal si les événements sont souhaités. Pour un enregistrement silencieux avec la même dérivation que l’observateur :
use DragonCode\LaravelFeed\Models\Feed;
$feed = Feed::query()->findOrFail(42);
$feed->title = 'New Title';
$feed->slug = $feed->title;
$feed->saveQuietly();
Si un écouteur saving exécuté plus tard, ou un écouteur creating ou updating, modifie title, le paquet ne recalcule pas le slug ensuite. Définissez le titre avant l’enregistrement ou via un mutateur. Si un écouteur tardif doit le modifier, affectez $feed->slug = $feed->title juste après dans ce même écouteur ; n’appelez pas save() récursivement. Testez l’ordre des écouteurs dans l’application.
Pour enregistrer un modèle partiellement sélectionné sans slug explicitement modifié, chargez title et tous les attributs nécessaires à son accesseur. L’absence de title ne désactive pas la génération du slug. Les insertions et mises à jour en masse via le constructeur de requêtes n’exécutent pas cet observateur ; gérez explicitement les deux valeurs. Conservez l’observateur et les casts hérités dans les modèles personnalisés.
Conservez des slugs stockés distincts et non vides pour les flux sélectionnés et planifiés. Si les slugs sont dérivés des titres, choisissez des titres qui se normalisent en valeurs distinctes et non vides. Un slug stocké vide ne peut pas être sélectionné. Plusieurs enregistrements non supprimés ayant le même slug provoquent une Illuminate\Database\MultipleRecordsFoundException lors de la recherche ; aucun suffixe n’est ajouté automatiquement.
Modèle d’enregistrement de flux personnalisé
Définissez feeds.model sur un modèle de l’application lorsque les enregistrements de flux nécessitent des colonnes, casts, relations ou méthodes supplémentaires. Le modèle personnalisé doit étendre DragonCode\LaravelFeed\Models\Feed.
namespace App\Models;
use DragonCode\LaravelFeed\Models\Feed as BaseFeed;
class Feed extends BaseFeed
{
protected $fillable = [
'slug',
'class',
'title',
'expression',
'is_active',
'last_activity',
'is_foo',
'is_bar',
];
protected function casts(): array
{
return [
...parent::casts(),
'is_foo' => 'boolean',
'is_bar' => 'boolean',
];
}
}
Enregistrez le modèle dans config/feeds.php :
'model' => App\Models\Feed::class,
Ajoutez les colonnes personnalisées à la table des flux dans une migration de l’application. Conservez dans $fillable chaque attribut autorisé pour l’assignation en masse.
FeedQuery utilise le modèle configuré pour les opérations de création, de recherche, de liste, de mise à jour, de suppression et de restauration. Lors de la création d’un enregistrement, transmettez les valeurs propres à l’application via extra. Elles sont appliquées en dernier et peuvent remplacer les arguments de la méthode :
$feed = app(FeedQuery::class)->create(
class: SomeFeed::class,
title: 'Some',
expression: '0 */12 * * *',
extra: [
'slug' => 'Custom Some',
'is_foo' => true,
'is_bar' => true,
]
);
Cet exemple crée l’enregistrement avec le slug custom-some. Les méthodes du modèle create() et update() acceptent aussi un slug explicite ; modifier title et slug ensemble conserve le slug modifié pour cet enregistrement.
Le modèle de l’application peut également utiliser l’API Eloquent habituelle :
use App\Models\Feed;
$feed = Feed::create([
'class' => SomeFeed::class,
'title' => 'Some',
'expression' => '0 */12 * * *',
'is_active' => true,
'is_foo' => true,
'is_bar' => true,
]);
Le modèle configuré est résolu à l’exécution. L’analyse statique considère le résultat de FeedQuery::create() comme le modèle de base du paquet. Utilisez App\Models\Feed::create() ou un type local explicite lorsque l’autocomplétion des propriétés propres à l’application est nécessaire.
Taille des lots
Les requêtes de base de données utilisent des lots de 1000 éléments par défaut. Vous pouvez modifier cette valeur en remplaçant la méthode chunkSize :
use DragonCode\LaravelFeed\Feeds\Feed;
class UserFeed extends Feed
{
public function chunkSize(): int
{
return 500;
}
}