rumenx/php-seo
A lightweight PHP SEO library for generating meta tags, Open Graph and Twitter Card data, canonical URLs, sitemaps, and robots directives. Simple fluent API, framework-agnostic, and easy to integrate into Laravel or any PHP app.
Architecture fit
seo_metadata record, serve from cache/DB on render." If the package executes an AI call during the request lifecycle, it is architecturally wrong for production and we must wrap it behind a queue.Integration feasibility
config/services.php + env, register provider.Technical risk
Key questions
composer.json? Any PSR-18 client assumptions that clash with Laravel's HTTP client?Stack fit
SEO_* env vars, and expose output through a Blade component or an accessor on our content models.spatie/laravel-seo, artesaos/seotools). Two meta emitters = duplicate tags and unpredictable output. Pick one owner of the <head>.Migration path
SeoMetadataGenerator contract with two implementations: AiGenerator (delegates to rumenx/php-seo) and TemplateGenerator (deterministic, brand-approved patterns). Everything else in the app depends on the contract, not the package. This is the single most important decision — it makes the dependency swappable and gives us a rollback path.seo_metadata table via queued jobs; render from that table with a cache layer keyed on content updated_at. Package is used only at generation time.Compatibility
composer.json constraints against our Laravel/PHP matrix before committing; a missing Laravel 12 constraint forces a fork.Http facade is not PSR-18. If the package expects a PSR-18 client, we need an adapter (psr18 bridge) or to inject Guzzle explicitly.Sequencing
TemplateGenerator; no code deletion required.Maintenance
Support
Scaling
Failure modes
TemplateGenerator, never emit empty or truncated <title>/description. A blank title is a measurable traffic loss.Ramp-up
How can I help you explore Laravel packages today?