Průvodce Blade
Pro klasické aplikace vykreslované na serveru poskytuje balíček sedm direktiv Blade. Obvykle stačí jediná: @seo.
Univerzální direktiva
<!DOCTYPE html>
<html>
<head>
@seo($post)
</head>@seo vyhodnotí model podle pořadí přednosti a vykreslí úplný blok hlavičky: <title>, meta popis, kanonický odkaz, robots, značky Open Graph a Twitter Card a připojená JSON-LD. Značka robots se vypíše jen při odchylce od výchozí hodnoty webu. Nadbytečné index,follow se vynechá, protože už nepřítomnost značky znamená index,follow. Pro vždy vykreslenou značku nastavte seo.robots.emit_default. Viz úplná pravidla vykreslování.
Signatury:
@seo($post) {{-- model page --}}
@seo($seoData) {{-- a hand-built SEOData (model-less page) --}}
@seo($post, 'blog.show') {{-- model + route defaults --}}
@seo($post, null, 'fr') {{-- model + locale --}}
@seo(null) {{-- current page, no model --}}@seo přijímá Model, ručně sestavený SEOData nebo null. Argumenty routy a jazykové verze se použijí pouze pro Model/null. Ručně sestavený SEOData nese vlastní hodnoty.
Stránky rout bez modelu
Pro statické stránky, archivy a další stránky založené na routách:
@seoForRoute('pages.about')
@seoForRoute('contact', 'de') {{-- with locale --}}Hodnoty rout pocházejí z řádků seo_defaults přiřazených k názvu routy.
Stránky bez modelu: ručně sestavený SEOData
Výpisy, výsledky vyhledávání a další obsah sestavený v controlleru často nemají jeden společný model. Vytvořte SEOData a předejte ho přímo do @seo nebo fasády SEO. Není potřeba používat app(TagRenderer::class)->render(...):
use Rankbeam\Seo\Data\SEOData;
return view('search.results', [
'seo' => new SEOData(
title: "Results for \"{$query}\"",
description: "Browse {$count} matches for {$query}.",
ogImage: '/images/search-share.jpg', // relative is fine — see below
),
]);<head>
@seo($seo)
</head>Ručně sestavený SEOData se považuje za explicitní záměr. Každá nastavená hodnota zůstane zachována; při vykreslování se doplní jen chybějící údaje:
- Chybějící
canonical/og:urlse odvodí z aktuální URL. Explicitnícanonicalzůstane beze změny včetně řetězce dotazu. title_suffixse přidá jen tehdy, když v titulku chybí. Pokud už titulek obsahuje token značky, zcela se vynechá; viztitle_suffix_skip_when_contains.- Relativní cesty
og:image/twitter:imagese převedou na absolutní pomocíurl(). Respektuje aktuální schéma a nevynucuje HTTPS. og:site_namealocalese doplní z konfigurace a jazykové verze aplikace.
Databázové pořadí přednosti — globální výchozí hodnoty, hodnoty typu modelu, routy a seo_meta — se do ručně sestaveného SEOData neslučuje. Vykreslí se předané hodnoty s výše uvedeným doplněním chybějících údajů.
Stejná hodnota funguje i přes fasádu:
SEO::render($seoData); // HTML string
SEO::toArray($seoData); // Vue/React structure
SEO::forInertia($seoData); // Inertia Head structurePoužitelný vzor layoutu
Jeden layout pro stránky modelů, rout i ostatní případy:
<head>
@if(isset($seoModel))
@seo($seoModel)
@elseif(isset($seoRoute))
@seoForRoute($seoRoute)
@else
@seo(null)
@endif
</head>Controllery potom předávají 'seoModel' => $post nebo 'seoRoute' => 'blog.index' a do značek nezasahují.
Jednotlivé direktivy
Pokud potřebujete ovládat značky samostatně, například při kombinaci s výstupem jiného balíčku:
| Direktiva | Výstup |
|---|---|
@seoTitle($post) | Pouze <title> |
@seoMeta($post) | Pouze meta popis |
@seoCanonical($post) | Pouze kanonický odkaz, s aktuální URL jako náhradní hodnotou |
@seoRobots($post) | Pouze meta robots, vždy vykreslené. Jde o výslovné zapnutí, takže se neuplatňuje vynechání výchozí hodnoty jako u @seo |
@seoSchema($post) | Pouze JSON-LD <script>, platné v hlavičce i těle |
Všechny přijímají stejný výraz ($model, $route, $locale) jako @seo nebo žádný argument pro aktuální stránku.
Alternativy hreflang
Modely používající HasSEO mohou odkazy hreflang poskytovat přímo přes resolver:
public function getSEOAlternates(): ?array
{
return [
['hreflang' => 'en', 'href' => route('posts.show', ['locale' => 'en', 'post' => $this])],
['hreflang' => 'it', 'href' => route('posts.show', ['locale' => 'it', 'post' => $this])],
];
}Používejte absolutní URL. @seo($post) záznamy vyhodnotí a každý vykreslí jako <link rel="alternate" hreflang="..." href="...">. Kódy se nejprve převedou do tvaru BCP 47 (it_IT → it-IT). Pravidla seo.hreflang mohou přidat odkaz stránky na sebe a x-default. Bezplatný audit označí neplatné, duplicitní záznamy a chybějící odkaz na sebe. Viz vícejazyčný obsah.
Escapování a bezpečnost
Textové hodnoty se escapují pomocí e(). JSON-LD se kóduje s JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP, takže </script> v uživatelském obsahu nemůže předčasně ukončit element skriptu.