← Anterior · Voltar ao README · Próximo →
Eloquent
FeedObserver::saving() é executado em cada chamada aos métodos do modelo create(), update() ou save() com eventos habilitados. Após o PR #335, ele atribui $feed->slug = $feed->title somente quando $feed->isDirty('slug') é falso. SlugCast aplica Str::slug() tanto aos slugs gerados quanto aos fornecidos manualmente. Por exemplo, Products se torna products.
Um slug alterado explicitamente é preservado naquele salvamento, mesmo quando title muda ao mesmo tempo. Isso não torna o slug personalizado permanente: em um salvamento normal posterior, um slug não alterado é recalculado a partir de title, mesmo que o título não tenha mudado. Atribuir o mesmo slug, ou um valor cuja normalização resulte no slug atual, não conta como alteração.
O observer lê a propriedade title atual, incluindo accessors modernos e clássicos e setters já aplicados. Ele não lê o título bruto armazenado nem garante o valor final gravado no banco. Um accessor que retorna Display: Stored: Product Catalog produz display-stored-product-catalog. Mantenha a formatação de exibição em um accessor separado se ela não deve afetar o slug.
saveQuietly() e salvamentos dentro de withoutEvents() ignoram o observer. Alterar title dessa forma mantém o slug anterior, a menos que a aplicação o atribua explicitamente. Use um salvamento normal quando precisar dos eventos. Para salvar silenciosamente com a mesma derivação do observer:
use DragonCode\LaravelFeed\Models\Feed;
$feed = Feed::query()->findOrFail(42);
$feed->title = 'New Title';
$feed->slug = $feed->title;
$feed->saveQuietly();
Se um listener posterior de saving, ou um listener de creating ou updating, alterar title, o pacote não recalcula o slug depois. Defina o título antes de salvar ou por um mutator. Se um listener posterior precisar alterá-lo, atribua $feed->slug = $feed->title logo após a alteração no mesmo listener; não chame save() recursivamente. Teste a ordem dos listeners na aplicação.
Ao salvar um modelo selecionado parcialmente sem um slug alterado explicitamente, carregue title e todos os atributos exigidos pelo accessor. A ausência de title não desativa a geração do slug. Inserções e atualizações em massa pelo construtor de consultas não executam esse observer; mantenha os dois valores explicitamente. Preserve o observer e os casts herdados em modelos personalizados.
Mantenha os slugs armazenados distintos e não vazios para feeds selecionados e agendados. Ao derivar slugs dos títulos, escolha títulos cuja normalização produza valores distintos e não vazios. Um slug armazenado vazio não pode ser selecionado. Vários registros não excluídos com o mesmo slug causam Illuminate\Database\MultipleRecordsFoundException na busca; nenhum sufixo é adicionado automaticamente.
Modelo personalizado de registro de feeds
Defina feeds.model como um modelo da aplicação quando os registros dos feeds precisarem de colunas, conversões, relacionamentos ou métodos adicionais. O modelo personalizado deve estender 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',
];
}
}
Registre o modelo em config/feeds.php:
'model' => App\Models\Feed::class,
Adicione as colunas personalizadas à tabela de feeds em uma migration da aplicação. Mantenha em $fillable todos os atributos aceitos por atribuição em massa.
FeedQuery usa o modelo configurado nas operações de criação, busca, listagem, atualização, exclusão e restauração. Ao criar um registro, passe os valores específicos da aplicação por extra. Esses valores são aplicados por último e podem substituir os argumentos do método:
$feed = app(FeedQuery::class)->create(
class: SomeFeed::class,
title: 'Some',
expression: '0 */12 * * *',
extra: [
'slug' => 'Custom Some',
'is_foo' => true,
'is_bar' => true,
]
);
Isso cria o registro com o slug custom-some. Os métodos do modelo create() e update() também aceitam um slug explícito; atualizar title e slug juntos preserva o slug alterado naquele salvamento.
O modelo da aplicação também pode usar a API normal do Eloquent:
use App\Models\Feed;
$feed = Feed::create([
'class' => SomeFeed::class,
'title' => 'Some',
'expression' => '0 */12 * * *',
'is_active' => true,
'is_foo' => true,
'is_bar' => true,
]);
O modelo configurado é resolvido em tempo de execução. A análise estática considera o resultado de FeedQuery::create() como o modelo base do pacote. Use App\Models\Feed::create() ou um tipo local explícito quando precisar de autocompletar para propriedades específicas da aplicação.
Tamanho do lote
As consultas ao banco de dados usam lotes de 1000 itens por padrão. Para alterar esse valor, sobrescreva o método chunkSize:
use DragonCode\LaravelFeed\Feeds\Feed;
class UserFeed extends Feed
{
public function chunkSize(): int
{
return 500;
}
}