Laravel Head: керування Meta Tags, Open Graph та JSON-LD

Перекладено ШІ 0 Laravel News 05 серпня, 2026

Команда розробників презентувала Laravel Head — офіційний пакет для зручного керування метаданими сторінок через гнучкий fluent API. Інструмент автоматизує роботу з SEO, Open Graph та JSON-LD для застосунків на Blade, Livewire та Inertia.

Laravel Head — це новий офіційний пакет від команди Laravel, представлений Тейлором Отвеллом на конференції Laracon US 2026. Він пропонує зручний fluent API для керування вмістом тегу <head>: заголовками, метаописами, канонічними URL, тегами Open Graph, директивами robots, структурованими даними JSON-LD та підказками ресурсів. Пакет сумісний із застосунками на Blade, Livewire та Inertia.

Основні можливості пакета:

  • П’ятирівнева система пріоритетів — дані за замовчуванням, метадані груп маршрутів, конкретних маршрутів, рантайму та помилок об’єднуються поочередно.
  • Метадані на рівні маршрутів — метод withHead() для маршрутів, груп, ресурсів та синглтонів зберігає дані у вигляді масивів і не заважає кешуванню маршрутів.
  • Open Graph та картки X (Twitter) — методи og(), ogImage(), ogVideo() та ogAudio(). Теги Twitter автоматично генеруються на основі заголовка, опису та зображення.
  • Схеми JSON-LD — конструктори для article, product, offer, breadcrumbs, faq та інших типів, а також можливість реєстрації власних схем.
  • Продуктивність та індексація — підтримка preload(), prefetch(), preconnect(), dnsPrefetch(), paginate(), alternates() та feed().
  • Браузерні метадані — колірні теми з підтримкою media queries, фавіконки, Apple touch icons та метод pwa() для прогресивних вебзастосунків.
  • Метадані сторінок помилок — налаштування заголовків, описів та інструкцій для robots залежно від HTTP-статусу в одному service provider.

# П’ятирівнева обробка метаданих

Метадані сторінки формуються з п’яти шарів, від найнижчого до найвищого пріоритету. Вищі шари точково замінюють значення нижчих: наприклад, заголовок, встановлений у контролері, замінить заголовок маршруту, але залишить його опис незмінним.

Глобальні налаштування для всього сайту задаються у service provider:

use Laravel\Head\Enums\OgType;
use Laravel\Head\Facades\Head;
use Laravel\Head\HeadBuilder;
 
Head::defaults(function (HeadBuilder $head) {
    $head
        ->title('Laravel', suffix: ' - Laravel')
        ->description('Build something great.')
        ->canonical()
        ->og(siteName: 'Laravel', type: OgType::Website)
        ->searchableByRobots()
        ->preconnect('https://fonts.example.com');
});

Суфікс, вказаний у налаштуваннях за замовчуванням, автоматично додається до заголовків на вищих рівнях. Так, Head::title('About') перетвориться на About - Laravel. Якщо потрібно проігнорувати префікс чи суфікс, використовуйте параметр exact: true. Виклик canonical() без аргументів використовує поточний URL і нормалізує його до https (це можна вимкнути через forceHttps: false).

Директиви robots приймають рядки, enum RobotsRule або їх комбінацію. Скорочення searchableByRobots() та hiddenFromRobots() встановлюють значення all та none відповідно.

# Метадані у маршрутах

Якщо метадані сторінки відомі заздалегідь, їх можна прикріпити безпосередньо до маршруту за допомогою withHead():

Route::view('/contact', 'contact')
    ->name('contact')
    ->withHead(
        title: 'Contact Us',
        description: 'Get in touch.',
    );

Метод працює для груп на будь-якому рівні вкладеності, а також для ресурсів та синглтонів:

Route::withHead(robots: 'noindex, nofollow')
    ->prefix('admin')
    ->name('admin.')
    ->group(function () {
        Route::get('/dashboard', DashboardController::class)
            ->name('dashboard')
            ->withHead(title: 'Dashboard');
    });

Технічно withHead() записує дані через стандартний API метаданих маршрутів Laravel, тому сумісність із кешуванням зберігається. Аргументи обмежені вбудованими властивостями для підтримки статичного аналізу, а кастомні розширення передаються через масив extensions.

Динамічні дані, що залежать від контексту запиту, встановлюються через facade у рантаймі:

public function show(Post $post)
{
    Head::title($post->title)
        ->description($post->description)
        ->when($post->isDraft(), fn ($head) => $head->hiddenFromRobots());
 
    return view('posts.show', ['post' => $post]);
}

Для полів з одним значенням застосовується останній виклик. Поля, що повторюються, зберігають кілька записів, але використання того самого ключа оновить існуючий запис (наприклад, у ogImage() ключем є URL).

# Open Graph, картки X та схеми

Загальні title та description документа автоматично заповнюють og:title та og:description, якщо ті не вказані окремо. Якщо в налаштуваннях за замовчуванням зареєстровано тип картки Twitter, відповідні теги сформуються на основі тих самих даних:

use Laravel\Head\Enums\TwitterCard;
 
Head::defaults(fn (HeadBuilder $head) => $head->twitter(
    card: TwitterCard::SummaryWithLargeImage,
));

Для роботи зі структурованими даними використовується окремий facade Schema з підтримкою вкладеності:

use Laravel\Head\Enums\OfferAvailability;
use Laravel\Head\Facades\Schema;
 
Head::schema(
    Schema::product()
        ->name($product->name)
        ->offers(
            Schema::offer()
                ->price($product->price)
                ->currency('USD')
                ->availability(OfferAvailability::InStock)
        )
);

Breadcrumbs та FAQ підтримують масове додавання елементів. Невідомі методи створюють універсальний об’єкт схеми, а для складних випадків можна реєструвати власні класи з атрибутом #[SchemaType]. Помилки у JSON-LD викликають виняток під час розробки та записуються в лог у продакшені.

# Робота з Blade, Livewire та Inertia

У Blade та Livewire для виводу тегів використовується директива @head у макеті:

<head>
    <meta charset="utf-8">
    @head
</head>

Оскільки директива рендериться синхронно, метадані мають бути визначені до виводу макета. У Livewire кожен візит через wire:navigate автоматично отримує оновлений head для нового маршруту.

Найбільше інтегрована Inertia. Пакет передає метадані як масив рядків у проп head для кожної сторінки:

{
    "props": {
        "head": [
            "<title data-inertia=\"title\">Dashboard - Laravel</title>",
            "<meta data-inertia=\"description\" name=\"description\" content=\"Your application overview.\">"
        ]
    }
}

В Inertia 3.5+ з’явилася опція serverHead, яку слід активувати у createInertiaApp(). Це дозволяє пошуковим роботам бачити метатеги без виконання JavaScript, а Inertia автоматично синхронізує їх при навігації. Клієнтський компонент <Head> у такому разі більше не потрібен.

Глобальні теги, що не змінюються (viewport, фавіконки тощо), можна винести в Head::inertiaGlobals() — вони рендеритимуться без атрибутів відстеження Inertia і не будуть оновлюватися після першого завантаження.

# Встановлення

Laravel Head потребує PHP 8.3 та Laravel 13.17 або новіше. Встановлюється через Composer:

composer require laravel/head

Після встановлення достатньо налаштувати дефолтні значення у service provider та додати @head до layout. Якщо потрібні сирі дані замість готової розмітки, використовуйте Head::toArray().

Детальніша інформація доступна в документації та в репозиторії на GitHub.

Популярні

Інше, що варто прочитати

Використання повнотекстового пошуку в Laravel
180 Оновлено 26 червня, 2026

Використання повнотекстового пошуку в Laravel

Laravel пропонує потужні можливості повнотекстового пошуку за допомогою методів whereFullText та orWhereFullText, що дозволяють здійснювати складні запити до бази даних. Дізнайтеся, як реалізувати ефективний пошук для вашого блогу чи системи управління контентом

13 Оновлено 26 червня, 2026

Створення CLI-додатка за допомогою Laravel та Docker

Зазирніть у світ Laravel, де потужний CLI-фреймворк відкриває нові можливості для розробки командного інтерфейсу. Дізнайтеся, як створити просту утиліту для перевірки акцій, яка працює з Docker, та які переваги це може принести у вашому проєкті!

14 Оновлено 26 червня, 2026

Локальні моделі та їх скоупи в Laravel за допомогою атрибута Scope

В Laravel 12 ми отримали можливість використовувати новий підхід для визначення локальних скоупів у моделях Eloquent. Дізнайтеся, як новий атрибут #[Scope] спрощує цей процес і зберігає ваші назви методів незмінними