artesaos/seotools
SEOTools adds SEO helpers to Laravel and Lumen: set page titles and meta tags, manage Open Graph and Twitter Card data, and generate JSON-LD structured data. Simple API, easy configuration, works with Laravel package discovery.
SEOMeta, OpenGraph, TwitterCard, JsonLd) allow granular control over SEO elements, enabling a component-based approach to SEO management. This aligns well with Laravel’s service container and dependency injection patterns.JsonLdMulti facade further enhances flexibility for complex pages (e.g., e-commerce product pages with multiple entities).app('seotools')) ensures cross-framework usability, making it viable for microservices or lightweight APIs.vendor:publish command simplifies configuration customization, reducing boilerplate.SEOMetaMiddleware), enabling global defaults (e.g., site-wide title prefixes) or route-specific overrides.@seoMeta, @openGraph), allowing template-level SEO control without cluttering controllers. Example:
@seoMeta(['name' => 'robots', 'content' => 'index,follow'])
@openGraph(['title' => $post->title, 'images' => $post->images])
SEOTools::generate() in API controllers) to support server-side rendering (SSR) or static site generation (SSG).JsonLdMulti for complex pages (e.g., product pages with reviews, FAQs).app('seotools')), which may feel less intuitive. Risk mitigation: Abstract Lumen-specific logic into a base service class.seotools?// Before: Manual Blade
<title>{{ $pageTitle ?? 'Default Title' }}</title>
<meta name="description" content="{{ $description ?? '' }}">
// After: SEOTools Facade
SEOMeta::setTitle($pageTitle ?? config('seotools.meta.defaults.title'));
SEOMeta::setDescription($description ?? '');
SEOMeta facades.@seoMeta directives.public function handle($request, Closure $next) {
// Fallback for legacy meta tags
if (!SEOMeta::getTitle()) {
SEOMeta::setTitle(config('app.name'));
}
return $next($request);
}
bootstrap/providers.php updates.seo_title column in pages table).<head> section. Use priority queues (e.g., SEOTools middleware runs last).OpenGraph::addImage() for dynamic image handling.config/seotools.php (e.g., default meta tags, webmaster tools).'meta' => [
'defaults' => [
'title' => '{page_title} | ' . config('app.name'),
'description' => config('app.description'),
'canonical' => '{url}',
],
'webmaster' => [
'google' => 'https://example.com/sitemap.xml',
],
],
config/app.php (or bootstrap/providers.php for Laravel 11+).SEOMetaMiddleware to set global defaults or route-specific metadata:
public function handle($request, Closure $next) {
SEOMeta::setTitle(config('seotools.meta.defaults.title'));
return $next($request);
}
How can I help you explore Laravel packages today?