romanzipp / Laravel Seo
Projects that are alternatives of or similar to Laravel Seo
Laravel SEO
A SEO package made for maximum customization and flexibility.
Contents
Installation
composer require romanzipp/laravel-seo
Configuration
Copy configuration to config folder:
$ php artisan vendor:publish --provider="romanzipp\Seo\Providers\SeoServiceProvider"
Documentation
Usage
Instantiation
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();
}
}
Render
{{ seo()->render() }}
Examples
This package offers many ways of adding new elements (Structs) to your <head>
.
- Add commonly used structs via shorthand setters like
seo()->title('...')
,seo()->meta('...')
- Manually add single structs via the
seo()->add()
methods - Specify an array of contents via
seo()->addFromArray()
Take a look at the structs documentation or example app for more detailed usage.
Title
seo()->title('Laravel');
<title>Laravel</title>
<meta property="og:title" content="Laravel" />
<meta name="twitter:title" content="Laravel" />
Description
seo()->description('Catchy marketing headline');
<meta name="description" content="Catchy marketing headline" />
<meta property="og:description" content="Catchy marketing headline" />
<meta name="twitter:description" content="Catchy marketing headline" />
CSRF Token
seo()->csrfToken();
<meta name="csrf-token" content="a7588c617ea5d8833374d8eb3752bcc4071" />
Charset & Viewport
seo()->charset();
seo()->viewport();
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
seo()->twitter('card', 'summary');
seo()->twitter('creator', '@romanzipp');
<meta name="twitter:card" content="summary" />
<meta name="twitter:creator" content="@romanzipp" />
Open Graph
seo()->og('site_name', 'Laravel');
seo()->og('locale', 'de_DE');
<meta name="og:site_name" content="Laravel" />
<meta name="og:locale" content="de_DE" />
Meta
seo()->meta('copyright', 'Roman Zipp');
<meta name="copyright" content="Roman Zipp" />
For more information see the structs documentation.
Sections
You can add structs to different sections by calling the section('foo')
method on the SeoService
instance or passing it as the first attribute to the seo('foo')
helper method.
Sections allow you to create certain namespaces for Structs which can be used in many different ways: Distinct between "frontend" and "admin" page sections or "head" and "body" view sections.
Using sections
// This struct will be added to the "default" section
seo()->twitter('card', 'summary');
// This struct will be added to the "secondary" section
seo()->section('secondary')->twitter('card', 'image');
// This struct will be also added to the "default" section since the section() method changes are not persistent
seo()->twitter('card', 'summary');
Rendering sections
This will render all structs added to the "default" section.
{{ seo()->render() }}
This will render all structs added to the "secondary" section.
{{ seo()->section('secondary')->render() }}
Of course, you can also pass the section as parameter to the helper function.
{{ seo('secondary')->render() }}
Laravel-Mix Integration
You can include your mix-manifest.json
file generated by Laravel-Mix to automatically add preload/prefetch link elements to your document head.
Basic example
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" />
Extended usage
Take a look at the SEO Laravel-Mix integration 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'));
Schema.org Integration
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.
Upgrading
Cheat Sheet
Code | Rendered HTML |
---|---|
Shorthand Setters | |
seo()->title('Laravel') |
<title>Laravel</title> |
seo()->description('Laravel') |
<meta name="description" content="Laravel" /> |
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() |
Testing
./vendor/bin/phpunit