Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Seo Laravel Package

ralphjsmit/laravel-seo

Laravel SEO made easy: generates valid meta tags out of the box (title, meta, OpenGraph, Twitter, structured data, favicon, robots, alternates). Store SEO per model, render with seo()->for($model), or provide dynamic SEOData without saving.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:

    composer require ralphjsmit/laravel-seo
    php artisan vendor:publish --tag="seo-migrations"
    php artisan vendor:publish --tag="seo-config"
    php artisan migrate
    
  2. Configure: Update config/seo.php with your site’s metadata (e.g., site_name, favicon, robots defaults).

  3. First Use Case: Add the HasSEO trait to a model (e.g., Post):

    use RalphJSmit\Laravel\SEO\Support\HasSEO;
    
    class Post extends Model
    {
        use HasSEO;
    }
    

    Render SEO tags in Blade:

    {!! seo()->for($post) !!}
    

Implementation Patterns

Core Workflow

  1. Model Association:

    • Attach HasSEO to Eloquent models to auto-create SEO records.
    • Use $model->seo to access/update SEO data:
      $post->seo->update(['title' => 'Updated Title']);
      
  2. Dynamic SEO Data:

    • Override getDynamicSEOData() to fetch SEO fields dynamically:
      public function getDynamicSEOData(): SEOData
      {
          return new SEOData(
              title: $this->title,
              description: $this->excerpt,
              image: $this->featuredImagePath,
          );
      }
      
  3. Controller Integration:

    • Pass SEOData directly from controllers:
      return view('page', [
          'SEOData' => new SEOData(title: 'Custom Title'),
      ]);
      
  4. Blade Rendering:

    • Use seo()->for($model) or seo($SEOData) in layouts.

Advanced Patterns

  • Structured Data:

    $schema = new SchemaCollection([
        new ArticleSchema(
            headline: $post->title,
            datePublished: $post->published_at,
        ),
    ]);
    return new SEOData(schema: $schema);
    
  • Locale Handling:

    return new SEOData(locale: 'fr', alternates: [new AlternateTag(hreflang: 'fr', href: route('post.fr', $post))]);
    
  • Conditional SEO:

    if ($post->isDraft()) {
        return new SEOData(robots: 'noindex');
    }
    

Gotchas and Tips

Pitfalls

  1. Image Paths:

    • Ensure image paths in SEOData are relative to public_path() (e.g., 'images/post.jpg').
    • Debug with secure_url($path) to verify accessibility.
  2. Title Suffix:

    • The title suffix (from config/seo.php) is not applied to homepage unless manually added.
  3. Robots Tag:

    • If robots.force_default is true, manual overrides via SEOData are ignored.
  4. Dynamic Data Priority:

    • getDynamicSEOData() overrides static SEO model data. Use SEODataTransformer for global overrides:
      SEOManager::SEODataTransformer(fn ($data) => $data->markAsNoIndex());
      

Debugging Tips

  • Inspect Output:
    dd(seo()->for($post)->render());
    
  • Check Config: Run php artisan config:clear if changes to seo.php aren’t reflected.

Extension Points

  1. Custom Schema: Extend SchemaCollection or create new schema classes (e.g., FAQSchema).

  2. SEODataTransformer: Modify SEO data globally via closures:

    SEOManager::SEODataTransformer(fn ($data) => $data->setSiteName('My Site'));
    
  3. Fallback Logic: Override SEOManager::getFallbackSEOData() for custom defaults.

  4. Alternate Tags: Use AlternateTag for hreflang support:

    new SEOData(alternates: [new AlternateTag(hreflang: 'es', href: route('post.es', $post))]);
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge
l3aro/rating-star-for-filament
leek/filament-subtenant-scope
anil/file-picker
broqit/fields-ai