PHPackages                             think.studio/nova-seo-entity - 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. think.studio/nova-seo-entity

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

think.studio/nova-seo-entity
============================

Related entity to manage SEO data.

4.4.0(2y ago)026MITPHPPHP ^8.1

Since Oct 17Pushed 2y ago1 watchersCompare

[ Source](https://github.com/dev-think-one/nova-seo-entity)[ Packagist](https://packagist.org/packages/think.studio/nova-seo-entity)[ Docs](https://github.com/dev-think-one/nova-seo-entity)[ RSS](/packages/thinkstudio-nova-seo-entity/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (8)Versions (16)Used By (0)

Laravel nova SEO Entity relationship
====================================

[](#laravel-nova-seo-entity-relationship)

[![Packagist License](https://camo.githubusercontent.com/3c628f5f0f4372f15eb3ddc8421e7c3661544126561304588904c41d45cbea25/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f7468696e6b2e73747564696f2f6e6f76612d73656f2d656e746974793f636f6c6f723d253233346463373166)](https://camo.githubusercontent.com/3c628f5f0f4372f15eb3ddc8421e7c3661544126561304588904c41d45cbea25/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f7468696e6b2e73747564696f2f6e6f76612d73656f2d656e746974793f636f6c6f723d253233346463373166)[![Packagist Version](https://camo.githubusercontent.com/74ca3d42849acd6d55998a556b72f5759f0c213b99e71406a83e99b9f3961901/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f7468696e6b2e73747564696f2f6e6f76612d73656f2d656e74697479)](https://packagist.org/packages/think.studio/nova-seo-entity)[![Total Downloads](https://camo.githubusercontent.com/666a0f2e6424a88356e743108fb5b830ec8e11205a78c7199d3b59ca14d0df31/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f7468696e6b2e73747564696f2f6e6f76612d73656f2d656e74697479)](https://packagist.org/packages/think.studio/nova-seo-entity)[![Build Status](https://camo.githubusercontent.com/475555eb8a3edfcdbfeb7067593e0c75d41bc63c5c9a4b2f0366975e549f7ca5/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6465762d7468696e6b2d6f6e652f6e6f76612d73656f2d656e746974792f6261646765732f6275696c642e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/dev-think-one/nova-seo-entity/build-status/main)[![Code Coverage](https://camo.githubusercontent.com/550df6d368084f163b4fa06a5b52b98b06e5d58cd6a3fb2a05825aa886fe51b8/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6465762d7468696e6b2d6f6e652f6e6f76612d73656f2d656e746974792f6261646765732f636f7665726167652e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/dev-think-one/nova-seo-entity/?branch=main)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/07c16cac338bc79147e91900f6b740d96357e5479b43dc5f7e6f7b05eba2d84b/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6465762d7468696e6b2d6f6e652f6e6f76612d73656f2d656e746974792f6261646765732f7175616c6974792d73636f72652e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/dev-think-one/nova-seo-entity/?branch=main)

Add to any model relation with SEO data.

NovaPackageV1V1,V2V4V3,V4Installation
------------

[](#installation)

You can install the package via composer:

```
composer require think.studio/nova-seo-entity

# optional publish configs
php artisan vendor:publish --provider="NovaSeoEntity\ServiceProvider" --tag="config"
# as current package wrap "artesaos/seotools" package, will be useful publish internal config:
php artisan vendor:publish --provider="Artesaos\SEOTools\Providers\SEOToolsServiceProvider"

# publish translations
php artisan vendor:publish --provider="NovaSeoEntity\ServiceProvider" --tag="lang"
```

Usage
-----

[](#usage)

### Add seo table

[](#add-seo-table)

```
php artisan make:migration create_cms_seo_table
```

```
public function up()
{
    Schema::create(config('nova-seo-entity.table'), function (Blueprint $table) {
        \NovaSeoEntity\Database\MigrationHelper::defaultColumns($table);
    });
}

public function down()
{
    Schema::dropIfExists(config('nova-seo-entity.table'));
}
```

### Amend models

[](#amend-models)

```
class Article extends Model implements \NovaSeoEntity\Contracts\WithSeoEntity
{
    use \NovaSeoEntity\Models\Traits\HasSeoEntity;
    // ...

    /**
     * Example how set default value for nova "creation" screen
     */
    public function getNewInstanceSeoValueForDescription( ): ?string {
        return Str::limit( WysiwygHelper::html2Text( $this->content ), 150 );
    }

    /**
     * Override canonical value if not set
     */
    public function getSEOCanonicalFieldValue( mixed $value ): mixed {
        return $value ?: ($this->slug ? route( 'front.article.single', $this->slug ) : null);
    }

}
```

### Amend nova resource

[](#amend-nova-resource)

Add new field to your resource

```
MorphOne::make('SEO', 'seo_info', SEOInfo::class),
```

### Amend app service provider

[](#amend-app-service-provider)

You can add resource from package or extend it in your app.

```
// NovaServiceProvider.php
use NovaSeoEntity\Nova\Resources\SEOInfo;

public function boot() {
    // ...

    SEOInfo::morphToTypes([
        \App\Nova\Resources\CMS\Article::class,
        \App\Nova\Resources\CMS\Page::class
        // ...
    ]);

    parent::boot();
}

protected function resources() {
    parent::resources();
    // ...
    Nova::resources( [
        SEOInfo::class,
        // ...
    ] );
}
```

### Add related filesystem disk (or change default disc in config file)

[](#add-related-filesystem-disk-or-change-default-disc-in-config-file)

```
'cms-images'  => [
    'driver'     => 'local',
    'root'       => storage_path('app/public/cms-images'),
    'url'        => env('APP_URL').'/storage/cms-images',
    'visibility' => 'public',
],
```

### Display meta data

[](#display-meta-data)

```

    {!! \Artesaos\SEOTools\Facades\SEOTools::generate(!config('app.debug')) !!}

```

### Implement

[](#implement)

```
$article = Article::find($articleId);

// Get seoinfo with default value
$article?->seo_info_forced->seoPrepare();

// Get seoinfo without defaults
// $article?->seo_info?->seoPrepare();
```

Useful links
------------

[](#useful-links)

Facebook: [sharing](https://developers.facebook.com/docs/sharing/webmasters/), [best practices](https://developers.facebook.com/docs/sharing/best-practices#images). Facebook [debuger](https://developers.facebook.com/tools/debug)

Twitter: [summary card](https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/summary), [summary card with large image](https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/summary-card-with-large-image). Twitter [validator](https://cards-dev.twitter.com/validator)

JsonLd: [intro](https://developers.google.com/search/docs/advanced/structured-data/intro-structured-data), [recommendations](https://developers.google.com/search/docs/advanced/structured-data/sd-policies), [image license](https://developers.google.com/search/docs/advanced/structured-data/image-license-metadata), [example](https://developers.google.com/search/docs/advanced/structured-data/article)

Credits
-------

[](#credits)

- [![Think Studio](https://camo.githubusercontent.com/8e541bece07d503c85a126b5294865faa00e27371048772f566a0cce8c01fd3a/68747470733a2f2f7961726f736c617777772e6769746875622e696f2f696d616765732f73706f6e736f72732f7061636b616765732f6c6f676f2d7468696e6b2d73747564696f2e706e67)](https://think.studio/)

###  Health Score

28

—

LowBetter than 54% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity67

Established project with proven stability

 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 ~49 days

Recently: every ~86 days

Total

15

Last Release

988d ago

Major Versions

1.1.0 → 2.0.02022-07-05

2.0.0 → 3.0.02022-07-07

3.0.0 → 4.0.02022-09-09

PHP version history (2 changes)1.0.0PHP ^8.0

2.0.0PHP ^8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/53f93fa87d58f33d106de6bd5e2946f8a345ebfaee146360746056cb134a15a0?d=identicon)[think.studio](/maintainers/think.studio)

---

Top Contributors

[![yaroslawww](https://avatars.githubusercontent.com/u/23663794?v=4)](https://github.com/yaroslawww "yaroslawww (25 commits)")

---

Tags

laravelseonova

###  Code Quality

TestsPHPUnit

Static AnalysisPsalm

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/thinkstudio-nova-seo-entity/health.svg)

```
[![Health](https://phpackages.com/badges/thinkstudio-nova-seo-entity/health.svg)](https://phpackages.com/packages/thinkstudio-nova-seo-entity)
```

###  Alternatives

[optimistdigital/nova-sortable

This Laravel Nova package allows you to reorder models in a Nova resource's index view using drag &amp; drop.

2872.1M6](/packages/optimistdigital-nova-sortable)[outl1ne/nova-sortable

This Laravel Nova package allows you to reorder models in a Nova resource's index view using drag &amp; drop.

2861.8M9](/packages/outl1ne-nova-sortable)[optimistdigital/nova-multiselect-field

A multiple select field for Laravel Nova.

3403.5M7](/packages/optimistdigital-nova-multiselect-field)[digital-creative/conditional-container

Provides an easy way to conditionally show and hide fields in your Nova resources.

116593.8k4](/packages/digital-creative-conditional-container)[sbine/route-viewer

A Laravel Nova tool to view your registered routes.

57215.9k](/packages/sbine-route-viewer)[markwalet/nova-modal-response

A Laravel Nova asset for Modal responses on an action.

14720.0k](/packages/markwalet-nova-modal-response)

PHPackages © 2026

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