PHPackages                             sergeybruhin/page-meta - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. sergeybruhin/page-meta

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

sergeybruhin/page-meta
======================

Laravel Page Meta Package

1.1.0(4w ago)0130MITPHPPHP ^7.4|^8.0

Since Jan 8Pushed 4w ago1 watchersCompare

[ Source](https://github.com/sergeybruhin/page-meta)[ Packagist](https://packagist.org/packages/sergeybruhin/page-meta)[ Docs](https://github.com/sergeybruhin/page-meta)[ RSS](/packages/sergeybruhin-page-meta/feed)WikiDiscussions master Synced 1w ago

READMEChangelog (5)Dependencies (6)Versions (7)Used By (0)

Laravel Page Meta Package
=========================

[](#laravel-page-meta-package)

[![Latest Version on Packagist](https://camo.githubusercontent.com/fb6136127f9c402b02dafa402eca386652925aa581a88f23fe2f527eff6a81a9/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f73657267657962727568696e2f706167652d6d6574612e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/sergeybruhin/page-meta)[![Total Downloads](https://camo.githubusercontent.com/20c161e37417b60599b2af7373f4a5e32176f0c9fbb848cef3c639d9481c39d7/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f73657267657962727568696e2f706167652d6d6574612e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/sergeybruhin/page-meta)

Basic and simple package to help you generate page meta inside your blade layout.

Installation
------------

[](#installation)

You can install the package via composer:

```
composer require sergeybruhin/page-meta
```

---

Head Meta
---------

[](#head-meta)

Generates standard HTML `` meta tags: title, description, author, keywords, robots directives, and canonical URL.

### Controller

[](#controller)

```
$headMeta = PageMeta::headMeta(
    title: 'My Article',
    description: 'Short page description',
);

$headMeta->setTitle('My Article', ' | ')  // appends site name: "My Article | Site Name"
         ->setCanonical(route('blog.show', $post))
         ->setAuthor('Sergey Bruhin')
         ->setKeywords(['laravel', 'php', 'seo'])
         ->noIndex()
         ->noFollow();
```

### Render

[](#render)

```
@include('page-meta::head-meta')
```

Template renders when `$headMeta` is set in the view.

### Output

[](#output)

```
My Article | Site Name

```

### Available methods

[](#available-methods)

MethodDescription`setTitle(string, ?string $separator)`Page title. Pass a separator (e.g. `' | '`) to append `globalSiteName` from config.`setDescription(string)`Meta description.`setAuthor(string)`Meta author.`setCanonical(string)`Canonical URL. Only rendered when set.`setKeywords(string|array)`Meta keywords.`setRobots(string)`Raw robots string, e.g. `'noindex, nofollow'`.`noIndex()`Adds `noindex` to robots.`noFollow()`Adds `nofollow` to robots.`noArchive()`Adds `noarchive` to robots.`noSnippet()`Adds `nosnippet` to robots.### Configuration

[](#configuration)

Publish the config to set your site name:

```
php artisan vendor:publish --provider="SergeyBruhin\PageMeta\Providers\PageMetaServiceProvider" --tag="config"
```

```
// config/page-meta.php
return [
    'globalSiteName' => 'Your Site Name',
];
```

---

Open Graph
----------

[](#open-graph)

### Controller

[](#controller-1)

```
$openGraph = PageMeta::openGraphArticle(
    route('home'),
    $page->name,
    $page->description,
    'Your site name',
);

$openGraph->addImage(
    'https://example.com/image/url.png',
    100,
    100,
    Image::TYPE_WEBP
);

$openGraph->addTags([
    'Some tag',
    'And',
    'Another Tag'
]);

$openGraph->addAuthors([
    'https://example.com/author/some-author',
    'https://example.com/author/another',
]);
```

### Render

[](#render-1)

```
@include('page-meta::open-graph')
```

Template renders when `$openGraph` is set in the view.

---

---

Schema.org (JSON-LD)
--------------------

[](#schemaorg-json-ld)

Unlike Head Meta / Open Graph / Twitter (which render tag-by-tag from a Blade partial), Schema.org nodes are plain data objects that serialize to a nested array via `toArray()`/`JsonSerializable`, then get JSON-encoded once as a single `` tag.

### Controller

[](#controller-2)

```
$organization = PageMeta::schemaOrganization('Your Site', route('home'))
    ->setDescription('Short site description')
    ->setTelephone('+1 555 0100')
    ->setEmail('hello@example.com')
    ->setAddress(
        (new PostalAddress())
            ->setStreetAddress('123 Main St')
            ->setAddressLocality('Springfield')
            ->setAddressCountry('US')
    )
    ->addSameAsMany([
        'https://www.instagram.com/yoursite/',
        'https://www.facebook.com/yoursite/',
    ]);

$website = PageMeta::schemaWebsite('Your Site', route('home'))
    ->setPublisher($organization);

$article = PageMeta::schemaArticle($post->name)
    ->setDescription($post->description)
    ->setImage(new ImageObject($post->cover->url, 1200, 630))
    ->setDatePublished($post->published_at)
    ->setUrl(route('blog.show', $post))
    ->addKeywords($post->tags->pluck('name')->all());

$breadcrumbs = PageMeta::schemaBreadcrumbList($post->breadcrumbs);

$schema = PageMeta::schemaGraph($organization, $website, $article, $breadcrumbs);
```

`schemaGraph()` always wraps its nodes in a single `{"@context": "https://schema.org", "@graph": [...]}` document — even for a single node — so there's one entry point regardless of how many nodes a page needs.

### Render

[](#render-2)

```
@include('page-meta::schema')
```

Template renders when `$schema` is set in the view.

### Available types

[](#available-types)

FactoryTypeNotes`PageMeta::schemaOrganization(name, url, type = 'Organization')``Organization`Pass `Organization::TYPE_LOCAL_BUSINESS` for a `LocalBusiness`-flavored node.`PageMeta::schemaWebsite(name, url)``WebSite``setPublisher(Organization)`.`PageMeta::schemaArticle(headline)``Article``setImage`, `setDatePublished`/`setDateModified`, `setAuthor(Person)`, `setPublisher(Organization)`, `addKeywords`.`PageMeta::schemaBreadcrumbList(array $breadcrumbs = [])``BreadcrumbList`Accepts `[['url' => .., 'name' => ..], ...]` directly.Value objects live under `Meta\Schema\Partials`: `PostalAddress`, `ImageObject`, `Person`, `ListItem`.

Every property is stripped from the output when `null`/empty, so it's safe to build a node from partially-available data.

### Testing (Not yet 💁‍♂️)

[](#testing-not-yet-‍️)

```
composer test
```

### Changelog

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently.

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](CONTRIBUTING.md) for details.

### Security

[](#security)

If you discover any security related issues, please email  instead of using the issue tracker.

Credits
-------

[](#credits)

- [Sergey Bruhin](https://github.com/sergeybruhin)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

45

—

FairBetter than 91% of packages

Maintenance94

Actively maintained with recent releases

Popularity12

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity56

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~256 days

Recently: every ~316 days

Total

6

Last Release

28d ago

Major Versions

0.1.2 → 1.0.02026-04-10

### Community

Maintainers

![](https://www.gravatar.com/avatar/08a6c60ed6a4cdd9dc4104bac89bd503265c085b15e530eb8616cc78b01db33c?d=identicon)[SergeyBruhin](/maintainers/SergeyBruhin)

---

Top Contributors

[![sergeybruhin](https://avatars.githubusercontent.com/u/8505172?v=4)](https://github.com/sergeybruhin "sergeybruhin (8 commits)")

---

Tags

laraveltwitterseoopen-graphsergeybruhinpage-meta

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/sergeybruhin-page-meta/health.svg)

```
[![Health](https://phpackages.com/badges/sergeybruhin-page-meta/health.svg)](https://phpackages.com/packages/sergeybruhin-page-meta)
```

###  Alternatives

[arcanedev/seo-helper

SEO Helper is a framework agnostic package that provides tools &amp; helpers for SEO (Laravel supported).

337472.8k4](/packages/arcanedev-seo-helper)[honeystone/laravel-seo

SEO metadata and JSON-LD package for Laravel.

354102.5k](/packages/honeystone-laravel-seo)[nystudio107/craft-seomatic

SEOmatic facilitates modern SEO best practices &amp; implementation for Craft CMS 5. It is a turnkey SEO system that is comprehensive, powerful, and flexible.

1741.5M69](/packages/nystudio107-craft-seomatic)[lionix/seo-manager

SEO Manager for Laravel Framework

2155.6k](/packages/lionix-seo-manager)[larament/seokit

A complete SEO package for Laravel, covering everything from meta tags to social sharing and structured data.

453.0k](/packages/larament-seokit)[arcanedev/breadcrumbs

A simple way to create breadcrumbs.

114.8k1](/packages/arcanedev-breadcrumbs)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
