A SEO package made for maximum customization and flexibility.
composer require romanzipp/laravel-seo
Copy configuration to config folder:
$ php artisan vendor:publish --provider="romanzipp\Seo\Providers\SeoServiceProvider"
use romanzipp\Seo\Facades\Seo;
use romanzipp\Seo\Services\SeoService;
class IndexController
{
public function index(Request $request, SeoService $seo)
{
$seo = seo();
$seo = app(SeoService::class);
$seo = Seo::make();
}
}
{{ seo()->render() }}
This package offers various shorthand setters as listed below to cover commonly used meta tags for titles, descriptions, Twitter, Open Graph and more.
Take a look at the structs documentation or example app for more detailed usage. ("Struct" = Code representation of head HTML elements)
seo()->title('Laravel');
... renders to ...
<title>Laravel</title>
<meta property="og:title" content="Laravel" />
<meta name="twitter:title" content="Laravel" />
seo()->description('Catchy marketing headline');
... renders to ...
<meta name="description" content="Catchy marketing headline" />
<meta property="og:description" content="Catchy marketing headline" />
<meta name="twitter:description" content="Catchy marketing headline" />
seo()->csrfToken();
... renders to ...
<meta name="csrf-token" content="a7588c617ea5d8833374d8eb3752bcc4071" />
seo()->charset();
seo()->viewport();
... renders to ...
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
seo()->twitter('card', 'summary');
seo()->twitter('creator', '@romanzipp');
... renders to ...
<meta name="twitter:card" content="summary" />
<meta name="twitter:creator" content="@romanzipp" />
seo()->og('site_name', 'Laravel');
seo()->og('locale', 'de_DE');
... renders to ...
<meta name="og:site_name" content="Laravel" />
<meta name="og:locale" content="de_DE" />
For more information see the Structs Documentation.
You can include your mix-manifest.json
file generated by Laravel-Mix to automatically add preload/prefetch link elements to your document head.
seo()
->mix()
->load();
mix-manifest.json
{
"/js/app.js": "/js/app.js?id=123456789",
"/css/app.css": "/css/app.css?id=123456789"
}
document <head>
<link rel="prefetch" href="/js/app.js?id=123456789" />
<link rel="prefetch" href="/css/app.css?id=123456789" />
Take a look at the SEO Laravel-Mix intregration docs for further usage.
use romanzipp\Seo\Conductors\Types\ManifestAsset;
seo()
->mix()
->map(static function(ManifestAsset $asset): ?ManifestAsset {
if (strpos($asset->path, 'admin') !== false) {
return null;
}
$asset->url = 'http://localhost' . $asset->url;
return $asset;
})
->load(public_path('custom-manifest.json'));
This package features a basic integration for Spaties Schema.org package to generate ld+json scripts. Added Schema types render with the packages structs.
use Spatie\SchemaOrg\Schema;
seo()->addSchema(
Schema::localBusiness()->name('Spatie')
);
use Spatie\SchemaOrg\Schema;
seo()->setSchemes([
Schema::localBusiness()->name('Spatie'),
Schema::airline()->name('Spatie'),
]);
Take a look at the Schema.org package Docs.
Code | Rendered HTML |
---|---|
Shorthand Setters | |
seo()->title('Laravel') |
<title>Laravel</title> |
seo()->meta('author', 'Roman Zipp') |
<meta name="author" content="Roman Zipp" /> |
seo()->twitter('card', 'summary') |
<meta name="twitter:card" content="summary" /> |
seo()->og('site_name', 'Laravel') |
<meta name="og:site_name" content="Laravel" /> |
seo()->charset() |
<meta charset="utf-8" /> |
seo()->viewport() |
<meta name="viewport" content="width=device-width, ..." /> |
seo()->csrfToken() |
<meta name="csrf-token" content="..." /> |
Adding Structs | |
seo()->add(...) |
<meta name="foo" /> |
seo()->addMany([...]) |
<meta name="foo" /> |
seo()->addIf(true, ...) |
<meta name="foo" /> |
Various | |
seo()->mix() |
|
seo()->hook() |
|
seo()->render() |
./vendor/bin/phpunit