Início rápido
Comece com uma aplicação Laravel 11, 12 ou 13 existente e um banco de dados funcionando. Você precisa de PHP 8.2 ou superior, ou 8.3 para Laravel 13. O núcleo é gratuito sob licença MIT; não exige conta nem licença Pro.
Instalar
Execute os comandos no diretório da aplicação:
composer require rankbeam/laravel-seo
php artisan vendor:publish --tag=seo-config
php artisan migrateO service provider é descoberto automaticamente. A migration cria as tabelas SEO, não os models de conteúdo da aplicação.
Antes do exemplo
Os passos pressupõem um model Post, um post salvo e uma rota posts.show cuja view Blade recebe esse post como $post. Adapte os nomes à sua aplicação. O guia adiciona SEO a uma página existente; ele não cria o blog.
Defina APP_URL no .env com a origem pública do site. Para outras formas de renderização, veja Inertia e JSON (EN) ou Livewire (EN).
1. Adicionar a trait ao model
use Illuminate\Database\Eloquent\Model;
use Rankbeam\Seo\Traits\HasSEO;
class Post extends Model
{
use HasSEO;
public function getUrlForSEO(): string
{
return route('posts.show', $this);
}
}getUrlForSEO() informa ao resolvedor a URL canônica do model. Ela alimenta canonical, og:url e entradas do sitemap.
2. Gerar as tags do head
<!DOCTYPE html>
<html>
<head>
@seo($post)
</head>@seo($post) gera título, descrição, canonical, robots, Open Graph, Twitter Card e JSON-LD associado aos dados resolvidos. Sem valores explícitos, usa os atributos do model e os padrões configurados; veja a prioridade do resolvedor.
3. Salvar valores explícitos
$post->saveSEO([
'title' => 'Custom SEO Title',
'description' => 'Custom meta description',
]);Valores explícitos têm prioridade sobre todas as camadas de fallback. Para metadados traduzidos, informe o idioma: $post->saveSEO(['title' => 'Titre'], 'fr').
Usando seeders
O DatabaseSeeder padrão do Laravel usa WithoutModelEvents, que também desativa o hook de criação automática de HasSEO. Remova essa trait ou chame saveSEO() explicitamente nos seeders.
4. Conferir o resultado
Abra a página pública do post e escolha Exibir código-fonte da página. No <head>, confira se o título contém Custom SEO Title, se a descrição é Custom meta description e se o canonical aponta para a URL pública do post. O sufixo configurado pode aparecer após o título.
Use @seo($post) uma única vez por página. Substitua tags de título e metadados que o layout já produza para evitar duplicatas. Se um valor for inesperado, consulte o guia de explicação (EN) para descobrir sua origem.
5. Adicionar um sitemap, se necessário
// e.g. in AppServiceProvider::boot()
use App\Models\Post;
use Rankbeam\Seo\Facades\SEO;
SEO::sitemaps()->register('posts', Post::class);composer require spatie/laravel-sitemap
php artisan seo:sitemap/sitemap.xml agora serve o índice gerado. O guia de sitemaps descreve todas as opções.
Próximos passos
- Prioridade do resolvedor: como os valores são escolhidos.
- Blade (EN): as sete diretivas.
- Inertia e JSON (EN): saída sem Blade.
- Grafo de schemas (EN): JSON-LD conectado.
- Campos Filament: interface administrativa.