esign / laravel-seo
管理Laravel应用程序中的SEO标签
2.3.0
2024-03-12 20:45 UTC
Requires
- php: ^8.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
- spatie/schema-org: ^3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.5
- orchestra/testbench: ^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.5|^10.0
README
此包允许您渲染任何位置设置的与SEO相关的HTML标签。目前支持元标签、开放图形、Twitter卡和JsonLD。它还提供了一些方便的配置SEO的Eloquent模型的方法。
安装
您可以通过composer安装此包
composer require esign/laravel-seo
该包将自动注册服务提供者。
接下来,您可以发布配置文件
php artisan vendor:publish --provider="Esign\Seo\SeoServiceProvider" --tag="config"
配置文件将发布为config/seo.php,内容如下
return [ /** * The class that will be used when you call the Seo facade or the seo helper method. * The configured class must extend the `Esign\Seo\Seo` class. */ 'seo' => \Esign\Seo\Seo::class, /** * Tags are used to represent their own set of specific attributes. * The configured tags must extend their corresponding base class. */ 'tags' => [ 'meta' => \Esign\Seo\Tags\Meta::class, 'open_graph' => \Esign\Seo\Tags\OpenGraph::class, 'twitter_card' => \Esign\Seo\Tags\TwitterCard::class, 'json_ld' => \Esign\Seo\Tags\JsonLd::class, ], ];
用法
准备您的HTML
您可以从HTML头部开始包含SEO视图
<head> @include('seo::seo') </head>
如果您想自定义这些视图,可以使用以下命令发布它们
php artisan vendor:publish --provider="Esign\Seo\SeoServiceProvider" --tag="views"
设置属性
要快速设置一些SEO属性,您可以使用Seo类。这通常在控制器中完成,但这不应该限制您在其他地方使用它
use Esign\Seo\Facades\Seo; class PostController extends Controller { public function show(Post $post) { Seo::setTitle($post->title)->setDescription($post->description); return view('posts.show', compact('post')); } }
SEO类将这些属性转发到所有底层标签。如果您想要对设置的属性有更细粒度的控制,可以使用单个标签
use Esign\Seo\Facades\Seo; use Esign\Seo\Facades\Tags\Meta; use Esign\Seo\Facades\Tags\OpenGraph; use Esign\Seo\Facades\Tags\TwitterCard; Seo::meta()->setTitle('My Meta Title'); Seo::og()->setTitle('My Open Graph Title'); Seo::twitter()->setTitle('My Twitter Title'); Meta::setTitle('My Meta Title'); OpenGraph::setTitle('My Open Graph Title'); TwitterCard::setTitle('My Twitter Card Title');
您还可以使用允许链式调用的流畅API
use Esign\Seo\Facades\Seo; use Esign\Seo\Tags\Meta; use Esign\Seo\Tags\OpenGraph; use Esign\Seo\Tags\TwitterCard; Seo::meta(fn (Meta $meta) => $meta->setTitle('My Meta Title')) ->og(fn (OpenGraph $openGraph) => $openGraph->setTitle('My Open Graph Title')) ->twitter(fn (TwitterCard $twitterCard) => $twitterCard->setTitle('My Twitter Card Title'));
定义可变器
此包允许您定义类似于Laravel模型属性的可变器
use Esign\Seo\Tags\Meta as EsignMeta; class Meta extends EsignMeta { public function setDescriptionAttribute(?string $value): string { return (string) Str::limit($value, 160, ''); } }
所有特型都包含了一个setTitleAttribute,将在标题后附加您的应用名称
public function setTitleAttribute(?string $title): ?string { return sprintf('%s | %s', $title, config('app.name')); }
要设置属性时跳过可变器,可以使用setRaw方法
Seo::setTitle('My Normal Seo Title'); // <title>My Normal Seo Title | Esign</title> Seo::setRaw('title', 'My Raw Seo Title'); // <title>My Raw Seo Title</title>
为模型设置SEO
要为模型设置SEO,您可以实现Esign\Seo\Contracts\SeoContract接口。包含了一个方便的特性Esign\Seo\Concerns\HasSeoDefaults,可以帮助您快速为模型设置一些SEO默认值。但这不是必需的,您也可以自行实现这些方法
use Esign\Seo\Concerns\HasSeoDefaults; use Esign\Seo\Contracts\SeoContract; class Post extends Model implements SeoContract { use HasSeoDefaults; public function getSeoUrl(): ?string { return route('posts.show', ['slug' => $this->slug]); } }
您可以使用set方法设置此SeoContract
use Esign\Seo\Facades\Seo; class PostController extends Controller { public function show(Post $post) { Seo::set($post); return view('posts.show', compact('post')); } }
SEO API
use Esign\Seo\Facades\Seo; use Esign\Seo\Contracts\SeoContract; Seo::when(mixed $value, callable $callback, callable|null $default); Seo::unless(mixed $value, callable $callback, callable|null $default); Seo::setTitle(?string $title); Seo::setDescription(?string $title); Seo::setUrl(?string $title); Seo::setImage(?string $title); Seo::setAlternateUrls(array $alternateUrls); Seo::set(SeoContract $seoContract) Seo::meta(); Seo::og(); Seo::twitter(); Seo::jsonLd();
元标签API
use Esign\Seo\Facades\Tags\Meta; // Conditions Meta::when(mixed $value, callable $callback, callable|null $default); Meta::whenEmpty(string $key, callable $callback, callable|null $default); Meta::unless(mixed $value, callable $callback, callable|null $default); // Getting attributes Meta::get(string $key, mixed $default = null); Meta::has(string $key); Meta::getTitle(); Meta::getDescription(); Meta::getImage(); Meta::getUrl(); Meta::getPrev(); Meta::getNext(); Meta::getRobots(); Meta::getAlternateUrls(); // Setting attributes Meta::set(string $key, mixed $value); Meta::setRaw(string $key, mixed $value); Meta::setTitle(?string $title); Meta::setDescription(?string $description); Meta::setImage(?string $image); Meta::setUrl(?string $url); Meta::setPrev(?string $prev); Meta::setNext(?string $next); Meta::setRobots(?string $robots); Meta::setAlternateUrls(array $alternateUrls); Meta::addAlternateUrls(array $alternateUrls);
开放图形API
use Esign\Seo\Facades\Tags\OpenGraph; // Conditions OpenGraph::when(mixed $value, callable $callback, callable|null $default); OpenGraph::whenEmpty(string $key, callable $callback, callable|null $default); OpenGraph::unless(mixed $value, callable $callback, callable|null $default); // Getting attributes OpenGraph::get(string $key, mixed $default = null); OpenGraph::has(string $key); OpenGraph::getType(); OpenGraph::getSiteName(); OpenGraph::getTitle(); OpenGraph::getDescription(); OpenGraph::getImage(); OpenGraph::getUrl(); // Setting attributes OpenGraph::set(string $key, mixed $value); OpenGraph::setRaw(string $key, mixed $value); OpenGraph::setType(?string $title); OpenGraph::setSiteName(?string $title); OpenGraph::setTitle(?string $title); OpenGraph::setDescription(?string $description); OpenGraph::setImage(?string $image); OpenGraph::setUrl(?string $url);
Twitter卡API
use Esign\Seo\Facades\Tags\TwitterCard; // Conditions TwitterCard::when(mixed $value, callable $callback, callable|null $default); TwitterCard::whenEmpty(string $key, callable $callback, callable|null $default); TwitterCard::unless(mixed $value, callable $callback, callable|null $default); // Getting attributes TwitterCard::get(string $key, mixed $default = null); TwitterCard::has(string $key); TwitterCard::getType(); TwitterCard::getTitle(); TwitterCard::getDescription(); TwitterCard::getImage(); // Setting attributes TwitterCard::set(string $key, mixed $value); TwitterCard::setRaw(string $key, mixed $value); TwitterCard::setType(?string $type); TwitterCard::setDescription(?string $description); TwitterCard::setImage(?string $image);
JsonLd API
use Esign\Seo\Facades\Tags\JsonLd; // Conditions JsonLd::when(mixed $value, callable $callback, callable|null $default); JsonLd::whenEmpty(string $key, callable $callback, callable|null $default); JsonLd::unless(mixed $value, callable $callback, callable|null $default); // Getting attributes JsonLd::get(string $key, mixed $default = null); JsonLd::has(string $key); JsonLd::getTypes(); // Setting attributes JsonLd::set(string $key, mixed $value); JsonLd::setRaw(string $key, mixed $value); JsonLd::addType(iterable|Spatie\SchemaOrg\Type $type); JsonLd::setTypes(array $types);
此包还提供了一个漂亮的辅助方法,您可以使用它作为门面替代品
use Esign\Seo\Facades\Seo; Seo::setTitle('My Title')->setDescription('My Description'); seo()->setTitle('My Title')->setDescription('My Description');
测试
composer test
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件