← Anterior · Voltar ao README · Próximo →
Criar feeds
A maneira mais prática de criar as classes necessárias é usar o plugin Laravel Idea para o PhpStorm.


Para criar uma classe de feed, use o comando make:feed no console:
php artisan make:feed <name>
Isso criará um arquivo de feed, por exemplo, app/Feeds/UserFeed.php.
Esse comando também pode criar as classes de item e de informações junto com a classe do feed. Para isso, use as opções --item e --info.
# Create a feed class and info class
php artisan make:feed <name> --info
# Create a feed class and item class
php artisan make:feed <name> --item
# Create a feed class, item class, and info class
php artisan make:feed <name> --item --info
Também existem opções abreviadas:
# Create a feed class and item class
php artisan make:feed <name> -t
# Create a feed class and info class
php artisan make:feed <name> -i
# Create a feed class, item class, and info class
php artisan make:feed <name> -it
Ao criar um feed, uma operação ou migração também será criada para adicioná-lo ao banco de dados.
Se o projeto usa o Laravel Deploy Operations, uma classe de operação será criada. Caso contrário, será criada uma classe de migração.
Isso é necessário para adicionar e gerenciar as informações do feed no banco de dados.
Preencher feeds
Feed
Preencha a classe principal do feed. Exemplo:
namespace App\Feeds;
use App\Feeds\Items\UserFeedItem;
use App\Models\User;
use DragonCode\LaravelFeed\Feeds\Feed;
use DragonCode\LaravelFeed\Feeds\Items\FeedItem;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class UserFeed extends Feed
{
public function builder(): Builder
{
return User::query()
->whereNotNull('email_verified_at')
->where('created_at', '>', now()->subYear());
}
public function item(Model $model): FeedItem
{
return new UserFeedItem($model);
}
}
Item do feed
Preencha a classe de item do feed. Exemplo:
namespace App\Feeds\Items;
use DragonCode\LaravelFeed\Feeds\Items\FeedItem;
/** @property-read \App\Models\User $model */
class UserFeedItem extends FeedItem
{
public function toArray(): array
{
return [
'name' => $this->model->name,
'email' => $this->model->email,
];
}
}
Valores opcionais
Para omitir um campo quando seu valor não estiver disponível, retorne uma instância de DragonCode\LaravelFeed\Data\OptionalData como valor:
namespace App\Feeds\Items;
use DragonCode\LaravelFeed\Data\OptionalData;
use DragonCode\LaravelFeed\Feeds\Items\FeedItem;
class UserFeedItem extends FeedItem
{
public function toArray(): array
{
return [
'id' => $this->model->id,
'name' => $this->model->name,
'cityId' => $this->model->city?->id ?? new OptionalData,
'createdAt' => $this->model->created_at,
'updatedAt' => $this->model->updated_at ?? new OptionalData,
];
}
}
Os campos opcionais são removidos de objetos JSON e JSON Lines e de elementos XML e RSS, inclusive de campos aninhados comuns. O CSV mantém a posição da coluna e grava um campo vazio.
Se a aplicação usa o Spatie Laravel Data, você pode retornar Spatie\LaravelData\Optional. As duas classes de valor opcional são processadas automaticamente.
use Spatie\LaravelData\Optional;
'updatedAt' => $this->model->updated_at ?? Optional::create(),
Arquivos de saída separados
Gerar arquivos separados para diferentes condições de negócio é um cenário avançado de saída. Leia o guia de arquivos de saída separados e depois use a receita de vários arquivos de feed por alvo como exemplo completo.
Formato do arquivo
A lista de formatos disponíveis está na página Formatos compatíveis.
Você pode gerar feeds em formatos diferentes. Uma classe de feed só pode ser exportada corretamente para o formato ao qual se destina, devido ao uso de diretivas e a outras particularidades do formato.
Para aplicar o formato necessário, basta sobrescrever a propriedade $format na classe do feed:
namespace App\Feeds;
use DragonCode\LaravelFeed\Enums\FeedFormatEnum;
use DragonCode\LaravelFeed\Feeds\Feed;
use Illuminate\Database\Eloquent\Builder;
class UserFeed extends Feed
{
protected FeedFormatEnum $format = FeedFormatEnum::Json;
public function builder(): Builder
{
//
}
}