PHPackages                             tsawler/seotools - 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. tsawler/seotools

ActiveLibrary

tsawler/seotools
================

SEO Tools for Laravel and Lumen

v0.12.2(7y ago)1108MITPHPPHP &gt;=7.0

Since Mar 3Pushed 7y ago1 watchersCompare

[ Source](https://github.com/tsawler/seotools)[ Packagist](https://packagist.org/packages/tsawler/seotools)[ RSS](/packages/tsawler-seotools/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (3)Dependencies (6)Versions (29)Used By (0)

SEOTools - SEO Tools for Laravel and Lumen
==========================================

[](#seotools---seo-tools-for-laravel-and-lumen)

SEOTools is a package for **Laravel 5+** and **Lumen** that provides helpers for some common SEO techniques. This is forked from [artesaos/seotools](https://github.com/artesaos/seotools).

Features
--------

[](#features)

- Friendly Interface
- Ease of set titles and meta tags
- Ease of set metas for twitter and opengraph

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

[](#installation)

### 1 - Dependency

[](#1---dependency)

The first step is using composer to install the package and automatically update your `composer.json` file, you can do this by running:

```
composer require tsawler/seotools
```

> **Note**: If you are using Laravel 5.5 or greater, the steps 2 and 3, for providers and aliases, are unnecessary. SEOTools supports Laravel new [Package Discovery](https://laravel.com/docs/5.5/packages#package-discovery).

### 2 - Provider

[](#2---provider)

You need to update your application configuration in order to register the package so it can be loaded by Laravel, just update your `config/app.php` file adding the following code at the end of your `'providers'` section:

> `config/app.php`

```
// file START ommited
    'providers' => [
        // other providers ommited
        Tsawler\SEOTools\Providers\SEOToolsServiceProvider::class,
    ],
// file END ommited
```

#### Lumen

[](#lumen)

Go to `/bootstrap/app.php` file and add this line:

```
// file START ommited
	$app->register(Tsawler\SEOTools\Providers\SEOToolsServiceProvider::class);
// file END ommited
```

### 3 - Facade

[](#3---facade)

> Facades are not supported in Lumen.

In order to use the `SEOMeta` facade, you need to register it on the `config/app.php` file, you can do that the following way:

```
// file START ommited
    'aliases' => [
        // other Facades ommited
        'SEOMeta'   => Tsawler\SEOTools\Facades\SEOMeta::class,
        'OpenGraph' => Tsawler\SEOTools\Facades\OpenGraph::class,
        'Twitter'   => Tsawler\SEOTools\Facades\TwitterCard::class,
        // or
        'SEO' => Tsawler\SEOTools\Facades\SEOTools::class,
    ],
// file END ommited
```

### 4 Configuration

[](#4-configuration)

#### Publish config

[](#publish-config)

In your terminal type

```
php artisan vendor:publish
```

or

```
php artisan vendor:publish --provider="Tsawler\SEOTools\Providers\SEOToolsServiceProvider"
```

> Lumen does not support this command, for it you should copy the file `src/resources/config/seotools.php` to `config/seotools.php` of your project

In `seotools.php` configuration file you can determine the properties of the default values and some behaviors.

#### seotools.php

[](#seotoolsphp)

- meta
- **defaults** - What values are displayed if not specified any value for the page display. If the value is `false`, nothing is displayed.
- **webmaster** - Are the settings of tags values for major webmaster tools. If you are `null` nothing is displayed.
- opengraph
- **defaults** - Are the properties that will always be displayed and when no other value is set instead. **You can add additional tags** that are not included in the original configuration file.
- twitter
- **defaults** - Are the properties that will always be displayed and when no other value is set instead. **You can add additional tags** that are not included in the original configuration file.

5 - Usage
---------

[](#5---usage)

> Facades are not supported in Lumen.

### Lumen Usage

[](#lumen-usage)

```
$seotools = app('seotools');
$metatags = app('seotools.metatags');
$twitter = app('seotools.twitter');
$opengraph = app('seotools.opengraph');

// The behavior is the same as the facade
// --------

echo app('seotools')->generate();
```

### Meta tags Generator

[](#meta-tags-generator)

With **SEOMeta** you can create meta tags to the `head`

### Opengraph tags Generator

[](#opengraph-tags-generator)

With **OpenGraph** you can create opengraph tags to the `head`

### Twitter for Twitter Cards tags Generator

[](#twitter-for-twitter-cards-tags-generator)

With **Twitter** you can create opengraph tags to the `head`

#### In your controller

[](#in-your-controller)

```
use SEOMeta;
use OpenGraph;
use Twitter;
## or
use SEO;

class CommomController extends Controller
{

    /**
     * @return \Illuminate\View\View
     */
    public function index()
    {
        SEOMeta::setTitle('Home');
        SEOMeta::setDescription('This is my page description');
        SEOMeta::setCanonical('https://codecasts.com.br/lesson');

        OpenGraph::setDescription('This is my page description');
        OpenGraph::setTitle('Home');
        OpenGraph::setUrl('http://current.url.com');
        OpenGraph::addProperty('type', 'articles');

        Twitter::setTitle('Homepage');
        Twitter::setSite('@LuizVinicius73');

        ## Or

        SEO::setTitle('Home');
        SEO::setDescription('This is my page description');
        SEO::opengraph()->setUrl('http://current.url.com');
        SEO::setCanonical('https://codecasts.com.br/lesson');
        SEO::opengraph()->addProperty('type', 'articles');
        SEO::twitter()->setSite('@LuizVinicius73');

        $posts = Post::all();

        return view('myindex', compact('posts'));
    }

    /**
     * @return \Illuminate\View\View
     */
    public function show($id)
    {
        $post = Post::find($id);

        SEOMeta::setTitle($post->title);
        SEOMeta::setDescription($post->resume);
        SEOMeta::addMeta('article:published_time', $post->published_date->toW3CString(), 'property');
        SEOMeta::addMeta('article:section', $post->category, 'property');
        SEOMeta::addKeyword(['key1', 'key2', 'key3']);

        OpenGraph::setDescription($post->resume);
        OpenGraph::setTitle($post->title);
        OpenGraph::setUrl('http://current.url.com');
        OpenGraph::addProperty('type', 'article');
        OpenGraph::addProperty('locale', 'pt-br');
        OpenGraph::addProperty('locale:alternate', ['pt-pt', 'en-us']);

        OpenGraph::addImage($post->cover->url);
        OpenGraph::addImage($post->images->list('url'));
        OpenGraph::addImage(['url' => 'http://image.url.com/cover.jpg', 'size' => 300]);
        OpenGraph::addImage('http://image.url.com/cover.jpg', ['height' => 300, 'width' => 300]);

        // Namespace URI: http://ogp.me/ns/article#
        // article
        OpenGraph::setTitle('Article')
            ->setDescription('Some Article')
            ->setType('article')
            ->setArticle([
                'published_time' => 'datetime',
                'modified_time' => 'datetime',
                'expiration_time' => 'datetime',
                'author' => 'profile / array',
                'section' => 'string',
                'tag' => 'string / array'
            ]);

        // Namespace URI: http://ogp.me/ns/book#
        // book
        OpenGraph::setTitle('Book')
            ->setDescription('Some Book')
            ->setType('book')
            ->setBook([
                'author' => 'profile / array',
                'isbn' => 'string',
                'release_date' => 'datetime',
                'tag' => 'string / array'
            ]);

        // Namespace URI: http://ogp.me/ns/profile#
        // profile
        OpenGraph::setTitle('Profile')
             ->setDescription('Some Person')
            ->setType('profile')
            ->setProfile([
                'first_name' => 'string',
                'last_name' => 'string',
                'username' => 'string',
                'gender' => 'enum(male, female)'
            ]);

        // Namespace URI: http://ogp.me/ns/music#
        // music.song
        OpenGraph::setType('music.song')
            ->setMusicSong([
                'duration' => 'integer',
                'album' => 'array',
                'album:disc' => 'integer',
                'album:track' => 'integer',
                'musician' => 'array'
            ]);

        // music.album
        OpenGraph::setType('music.album')
            ->setMusicAlbum([
                'song' => 'music.song',
                'song:disc' => 'integer',
                'song:track' => 'integer',
                'musician' => 'profile',
                'release_date' => 'datetime'
            ]);

         //music.playlist
        OpenGraph::setType('music.playlist')
            ->setMusicPlaylist([
                'song' => 'music.song',
                'song:disc' => 'integer',
                'song:track' => 'integer',
                'creator' => 'profile'
            ]);

        // music.radio_station
        OpenGraph::setType('music.radio_station')
            ->setMusicRadioStation([
                'creator' => 'profile'
            ]);

        // Namespace URI: http://ogp.me/ns/video#
        // video.movie
        OpenGraph::setType('video.movie')
            ->setVideoMovie([
                'actor' => 'profile / array',
                'actor:role' => 'string',
                'director' => 'profile /array',
                'writer' => 'profile / array',
                'duration' => 'integer',
                'release_date' => 'datetime',
                'tag' => 'string / array'
            ]);

        // video.episode
        OpenGraph::setType('video.episode')
            ->setVideoEpisode([
                'actor' => 'profile / array',
                'actor:role' => 'string',
                'director' => 'profile /array',
                'writer' => 'profile / array',
                'duration' => 'integer',
                'release_date' => 'datetime',
                'tag' => 'string / array',
                'series' => 'video.tv_show'
            ]);

        // video.tv_show
        OpenGraph::setType('video.tv_show')
            ->setVideoTVShow([
                'actor' => 'profile / array',
                'actor:role' => 'string',
                'director' => 'profile /array',
                'writer' => 'profile / array',
                'duration' => 'integer',
                'release_date' => 'datetime',
                'tag' => 'string / array'
            ]);

        // video.other
        OpenGraph::setType('video.other')
            ->setVideoOther([
                'actor' => 'profile / array',
                'actor:role' => 'string',
                'director' => 'profile /array',
                'writer' => 'profile / array',
                'duration' => 'integer',
                'release_date' => 'datetime',
                'tag' => 'string / array'
            ]);

        // og:video
        OpenGraph::addVideo('http://example.com/movie.swf', [
                'secure_url' => 'https://example.com/movie.swf',
                'type' => 'application/x-shockwave-flash',
                'width' => 400,
                'height' => 300
            ]);

        // og:audio
        OpenGraph::addAudio('http://example.com/sound.mp3', [
                'secure_url' => 'https://secure.example.com/sound.mp3',
                'type' => 'audio/mpeg'
            ]);

        return view('myshow', compact('post'));
    }
}
```

#### SEOTrait

[](#seotrait)

```
use Tsawler\SEOTools\Traits\SEOTools as SEOToolsTrait;

class CommomController extends Controller
{
    use SEOToolsTrait;

    /**
     * @return \Illuminate\View\View
     */
    public function index()
    {
        $this->seo()->setTitle('Home');
        $this->seo()->setDescription('This is my page description');
        $this->seo()->opengraph()->setUrl('http://current.url.com');
        $this->seo()->opengraph()->addProperty('type', 'articles');
        $this->seo()->twitter()->setSite('@LuizVinicius73');

        $posts = Post::all();

        return view('myindex', compact('posts'));
    }
}
```

### In Your View

[](#in-your-view)

> **Pro Tip**: Pass the parameter `true` to get minified code and reduce filesize.

```

	{!! SEOMeta::generate() !!}
	{!! OpenGraph::generate() !!}
	{!! Twitter::generate() !!}

	{!! SEO::generate() !!}

	{!! SEO::generate(true) !!}

	{!! app('seotools')->generate() !!}

```

```

    Title - Over 9000 Thousand!

```

#### API (SEOMeta)

[](#api-seometa)

```
SEOMeta::addKeyword($keyword);
SEOMeta::addMeta($meta, $value = null, $name = 'name');
SEOMeta::addAlternateLanguage($lang, $url);
SEOMeta::addAlternateLanguages(array $languages);
SEOMeta::setTitleSeparator($separator);
SEOMeta::setTitle($title);
SEOMeta::setTitleDefault($default);
SEOMeta::setDescription($description);
SEOMeta::setKeywords($keywords);
SEOMeta::setTitleSeparator($separator);
SEOMeta::setCanonical($url);
SEOMeta::setPrev($url);
SEOMeta::setNext($url);
SEOMeta::removeMeta($key);

// You can chain methods
SEOMeta::setTitle($title)
            ->setDescription($description)
            ->setKeywords($keywords)
            ->addKeyword($keyword)
            ->addMeta($meta, $value);

// Retrieving data
SEOMeta::getTitle();
SEOMeta::getTitleSession();
SEOMeta::getTitleSeparator();
SEOMeta::getKeywords();
SEOMeta::getDescription();
SEOMeta::getCanonical($url);
SEOMeta::getPrev($url);
SEOMeta::getNext($url);
SEOMeta::reset();

SEOMeta::generate();
```

#### API (OpenGraph)

[](#api-opengraph)

```
OpenGraph::addProperty($key, $value); // value can be string or array
OpenGraph::addImage($url); // add image url
OpenGraph::addImages($url); // add an array of url images
OpenGraph::setTitle($title); // define title
OpenGraph::setDescription($description);  // define description
OpenGraph::setUrl($url); // define url
OpenGraph::setSiteName($name); //define site_name

// You can chain methods
OpenGraph::addProperty($key, $value)
            ->addImage($url)
            ->addImages($url)
            ->setTitle($title)
            ->setDescription($description)
            ->setUrl($url)
            ->setSiteName($name);

// Generate html tags
OpenGraph::generate();
```

### API (TwitterCard)

[](#api-twittercard)

```
Twitter::addValue($key, $value); // value can be string or array
Twitter::setType($type); // type of twitter card tag
Twitter::setTitle($type); // title of twitter card tag
Twitter::setSite($type); // site of twitter card tag
Twitter::setDescription($type); // description of twitter card tag
Twitter::setUrl($type); // url of twitter card tag
Twitter::addImage($url); // add image url
Twitter::addImages($url); // add an array of url images

// You can chain methods
Twitter::addValue($key, $value)
            ->setType($type)
            ->addImage($url)
            ->addImages($url)
            ->setTitle($title)
            ->setDescription($description)
            ->setUrl($url)
            ->setSite($name);

// Generate html tags
Twitter::generate();
```

#### API (SEO)

[](#api-seo)

> Facilitates access to all the SEO Providers

```
SEO::metatags();
SEO::twitter();
SEO::opengraph();

SEO::setTitle($title);
SEO::getTitle($session = false);
SEO::setDescription($description);
SEO::setCanonical($url);
SEO::addImages($urls);
```

###  Health Score

29

—

LowBetter than 59% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community19

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 53.5% 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 ~47 days

Recently: every ~87 days

Total

28

Last Release

2806d ago

PHP version history (2 changes)0.2-betaPHP &gt;=5.4.0

v0.11.0-beta1PHP &gt;=7.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/ad852eeaeb7bfc3391db2c7fb9ab936a7c11bbccfc7b6fa8de786115cfe4d71b?d=identicon)[tsawler](/maintainers/tsawler)

---

Top Contributors

[![vinicius73](https://avatars.githubusercontent.com/u/1561347?v=4)](https://github.com/vinicius73 "vinicius73 (108 commits)")[![edbizarro](https://avatars.githubusercontent.com/u/84926?v=4)](https://github.com/edbizarro "edbizarro (29 commits)")[![ramon-villain](https://avatars.githubusercontent.com/u/1520006?v=4)](https://github.com/ramon-villain "ramon-villain (22 commits)")[![tsawler](https://avatars.githubusercontent.com/u/441913?v=4)](https://github.com/tsawler "tsawler (10 commits)")[![mcnub](https://avatars.githubusercontent.com/u/16283534?v=4)](https://github.com/mcnub "mcnub (5 commits)")[![Biptaste](https://avatars.githubusercontent.com/u/251481?v=4)](https://github.com/Biptaste "Biptaste (4 commits)")[![vluzrmos](https://avatars.githubusercontent.com/u/450848?v=4)](https://github.com/vluzrmos "vluzrmos (3 commits)")[![georgeboot](https://avatars.githubusercontent.com/u/884482?v=4)](https://github.com/georgeboot "georgeboot (3 commits)")[![ToshieUya](https://avatars.githubusercontent.com/u/22169720?v=4)](https://github.com/ToshieUya "ToshieUya (3 commits)")[![yukato](https://avatars.githubusercontent.com/u/4372249?v=4)](https://github.com/yukato "yukato (2 commits)")[![carusogabriel](https://avatars.githubusercontent.com/u/16328050?v=4)](https://github.com/carusogabriel "carusogabriel (2 commits)")[![mauri870](https://avatars.githubusercontent.com/u/10168637?v=4)](https://github.com/mauri870 "mauri870 (2 commits)")[![mateusjatenee](https://avatars.githubusercontent.com/u/10816999?v=4)](https://github.com/mateusjatenee "mateusjatenee (1 commits)")[![sdeering](https://avatars.githubusercontent.com/u/1787454?v=4)](https://github.com/sdeering "sdeering (1 commits)")[![shubhang-arora](https://avatars.githubusercontent.com/u/12964392?v=4)](https://github.com/shubhang-arora "shubhang-arora (1 commits)")[![m3chas](https://avatars.githubusercontent.com/u/157959?v=4)](https://github.com/m3chas "m3chas (1 commits)")[![jakemitchellxyz](https://avatars.githubusercontent.com/u/13812224?v=4)](https://github.com/jakemitchellxyz "jakemitchellxyz (1 commits)")[![Fuhrmann](https://avatars.githubusercontent.com/u/1160365?v=4)](https://github.com/Fuhrmann "Fuhrmann (1 commits)")[![Dylan-DPC](https://avatars.githubusercontent.com/u/99973273?v=4)](https://github.com/Dylan-DPC "Dylan-DPC (1 commits)")[![williamoliveira](https://avatars.githubusercontent.com/u/6340344?v=4)](https://github.com/williamoliveira "williamoliveira (1 commits)")

---

Tags

lumenlaravel5seometatagsopengraphwebmasterseotools

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/tsawler-seotools/health.svg)

```
[![Health](https://phpackages.com/badges/tsawler-seotools/health.svg)](https://phpackages.com/packages/tsawler-seotools)
```

###  Alternatives

[artesaos/seotools

SEO Tools for Laravel and Lumen

3.3k5.1M60](/packages/artesaos-seotools)[butschster/meta-tags

The most powerful and extendable tools for managing SEO Meta Tags in your Laravel project

628730.7k2](/packages/butschster-meta-tags)[arcanedev/seo-helper

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

332467.0k4](/packages/arcanedev-seo-helper)[bschmitt/laravel-amqp

AMQP wrapper for Laravel and Lumen to publish and consume messages

2752.3M7](/packages/bschmitt-laravel-amqp)[mad-web/laravel-seoable

Easy to map your eloquent fields to seo properties

407.6k](/packages/mad-web-laravel-seoable)[ycs77/inertia-laravel-ssr-head

Simple SSR Head for Inertia Laravel

3211.5k](/packages/ycs77-inertia-laravel-ssr-head)

PHPackages © 2026

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