Pular para o conteúdo principal
Versão: 2.x

← 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,
]);
observação

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;
}
}

Veja também​