Zum Inhalt springen

Priorität des Resolvers

SEOResolver führt sechs Ebenen zusammen, um Titel, Beschreibung, Canonical, Robots und Bilder zu bestimmen. Höhere Ebenen gewinnen. null überschreibt keinen Wert einer niedrigeren Ebene.

Die sechs Ebenen

Von der niedrigsten zur höchsten Priorität:

#EbeneQuelleTypischer Einsatz
1Website-Konfigurationconfig/seo.php: site_name, title_suffix, default_og_image, default_robots, …Markenweite Vorgaben
2Globale Datenbankvorgabenseo_defaults ohne ModelltypÄnderbare Website-Vorgaben ohne Deployment
3Vorgaben je Modelltypseo_defaults für eine ModellklasseGemeinsames OG-Bild für alle Produkte
4Routenvorgabenseo_defaults für einen RoutennamenStatische Seiten wie home oder contact ohne Modell
5Berechnete WerteAttribute des ModellsTitel aus title, Beschreibung aus excerpt oder body
6Explizite Werteseo_meta des Modells über saveSEO()Von Redakteuren eingetragene Werte
php
use Rankbeam\Seo\Facades\SEO;

$seo = SEO::resolve($post);          // model page: layers 1-3 + 5-6
$seo = SEO::forRoute('contact');     // route page: layers 1-2 + 4

Das Ergebnis ist ein unveränderliches SEOData-Wertobjekt für alle Renderer: Blade, Array und Inertia.

Berechnete Fallbacks: Ebene 5

Fehlt ein expliziter Wert, leitet der Resolver ihn vom Modell ab:

  • Titel: Attribut title oder name.
  • Beschreibung: erstes Attribut mit aussagekräftigem Text aus seo.computed.description_fields. Standardreihenfolge: excerpt, summary, description, intro, lead, teaser, content, body, text, article. HTML wird entfernt, Entities werden dekodiert und der Text an einer Wortgrenze gekürzt, ohne Auslassungszeichen. seo.computed.description_max_length ist standardmäßig 160.
  • Robots: optionaler getSEORobots()-Hook oder Attribut is_indexable, wie unten beschrieben.
  • URL-Werte: Canonical und og:url aus getUrlForSEO().

Robots und Indexierbarkeit steuern

Der Resolver unterstützt noindex je Modell. HasSEO schreibt keine Robots-Methode vor; der Hook ist optional. Die Quellen gelten in dieser Reihenfolge:

PrioritätQuelleBeispiel
1Explizites seo_meta.robots$page->saveSEO(['robots' => 'noindex,follow'])
2getSEORobots(): ?string am ModellGibt 'noindex, nofollow' zurück oder null für den nächsten Fallback
3Attribut is_indexable, Spalte oder AccessorFalsch ⇒ noindex, nofollow; wahr ⇒ index, follow
php
class Page extends Model
{
    use HasSEO;

    // Option A: let the resolver derive robots from a boolean flag.
    //   Schema::table('pages', fn ($t) => $t->boolean('is_indexable')->default(true));

    // Option B: compute it from your own state.
    public function getSEORobots(): ?string
    {
        return $this->status === 'draft' ? 'noindex, nofollow' : null;
    }
}

// Option C: set it explicitly per page (wins over A and B).
$page->saveSEO(['robots' => 'noindex, follow']);

Tatsächliche Ausgabe

Vor der Ausgabe im <head> greift die Emissionsregel: <meta name="robots"> wird nur ausgegeben, wenn die Direktive von default_robots abweicht, standardmäßig index,follow.

  • Eine indexierbare Seite mit index, follow erhält keinen Robots-Tag. Ohne Tag gilt bereits index,follow.
  • Eine nicht indexierbare Seite erhält <meta name="robots" content="noindex, nofollow">.
  • Andere abweichende Direktiven wie noindex, max-snippet:-1 oder unavailable_after werden unverändert ausgegeben, einschließlich eingegebener Leerzeichen.

Mit seo.robots.emit_default = true wird der Tag immer ausgegeben. Details: Robots-Ausgaberegeln (EN).

Regeln nach der Auflösung

Diese Schritte gelten unabhängig von der Quelle:

  • Titelsuffix: title_suffix wird angehängt, sofern der Titel nicht bereits damit endet. Enthält eine Routenvorlage schon die Marke, sollte sie mit diesem Suffix enden, um Ergebnisse wie „Brand — X | Brand“ zu vermeiden.
  • Canonical-Query: Bei abgeleiteten Canonicals aus Modell- oder aktueller URL werden Query-Parameter entfernt, außer den Einträgen in canonical.query_whitelist (EN), etwa page für paginierte Archive. Explizit gesetzte Canonicals bleiben unverändert.
  • Absolute Social-Bilder: og:image und twitter:image werden als absolute URLs ausgegeben, auch wenn ein relativer Pfad gespeichert wurde.

Die maßgebliche Ebene erkennen

Das Filament-Paket zeigt je Feld die Quelle: manuell, Inhalt, Modelltypvorgabe, globale Vorgabe, Website-Konfiguration oder URL. SEOWarningEvaluator bietet dieselbe Unterscheidung zwischen manuellen Werten und Fallbacks für eigene Verwaltungsanzeigen.

rankbeam/laravel-seo steht unter der MIT-Lizenz.