indexnowkit/symfony-bundle
IndexNowKit for Symfony lets your app instantly submit URLs to search engines like Bing and Yandex via the IndexNow protocol. Configure your API key and trigger submissions from services, console commands, or events to speed up indexing.
indexnowkit/core ^0.13 and indexnowkit/console ^0.5; add indexnowkit/sitemap ^0.8, indexnowkit/verify, and indexnowkit/history ^0.4 only if you need them. The bundle now boots without them; older pins conflict.bin/console indexnow:key:generate, indexnow:config, and indexnow:check. config is the fastest way to see what the tree actually resolved to (masked DSN, store status, verify state).#[IndexNow], run indexnow:submit, then indexnow:status / indexnow:history to confirm what was queued and submitted.docs/extending.md (replacing/decorating services and commands), docs/testing.md (clock, frozen time), docs/messenger.md (queue semantics and log lines), and docs/bc.md before upgrading.core/console/history/sitemap packages. Re-run indexnow:config and indexnow:check after upgrading and diff the output.indexnowkit.throttle, the memory debounce store, indexnowkit.submitter, indexnowkit.command_submitter_factory, and the verify pre-flight decorators — takes its time from indexnowkit.clock (Psr\Clock\ClockInterface). Never call time() or new DateTimeImmutable() in your own decorator or store: if you do, the debounce window, the throttle window, and the submission record timestamp stop moving together.indexnowkit.clock with IndexNowKit\Testing\FrozenClock in a compiler pass; one swap deterministically controls debounce, throttle, and record timestamps.#[IndexNow(locales: 'all')] expands against framework.enabled_locales. If that list is empty, the rule collapses to a single unlocalized URL — indexnow:check now emits router.locales, and the router bridge logs one warning per process on the indexnow channel.SymfonyBundle\Command\* classes are gone (they now come from console, sitemap, and history). Decorate the runner — indexnowkit.console.submit_entity, etc. — or register a command of your own under the same name, per docs/extending.md "Replacing a command".FlushListener. If you build it by hand, the signature is (CollectorInterface, Closure(): IndexNowKit): pass static fn () => $container->get('indexnowkit') instead of the old PSR-11 locator.indexnowkit.verify.submitter and indexnowkit.verify.command_submitter_factory pass arguments by name now; adding a parameter to Verify\VerifyingSubmitter fails compilation instead of silently shifting values.indexnowkit.dispatcher wraps the core's Dispatch\BatchingDispatcher and takes indexnowkit.config; its log lines ({count} URL(s) queued as message {id}, cannot queue … they are lost: …) come from the core.check and config read indexnowkit.console.config_source (Console\ConfigSourceInterface), so a custom source is the hook if you need to feed them from somewhere else.decorates: on, instanceof against, or subclass of IndexNowKit\SymfonyBundle\Command\* breaks — the classes are final and no longer in the bundle. Same for the removed SymfonyBundle\Check\SampleOptions and SymfonyBundle\Check\VerifySampleCheck (service ids indexnowkit.check.samples / indexnowkit.check.verify_sample still resolve to the core classes) and the removed Check\LocalesCheck / Check\EntitySampler (service ids indexnowkit.check.locales / indexnowkit.check.entity_sampler.callable remain, backed by the core and Console\SubjectSampler).MessengerDispatcher constructor changed (Config instead of $logUrls/$batchMaxUrls). It's internal, but hand-wired test doubles need updating; SubmitUrlsMessage::newId() delegates to BatchingDispatcher::newJobId().FlushListener service locator removed. PSR-11 says a container shouldn't be injected so an object can fetch its own dependencies — the closure is equally lazy.Adapter\OptionalPackage::sitemap()/verify()/history(), not the packages' *Services::package(); the old path fataled at compile time if a package was absent.cache.app (missing) in the debounce store status line means the pool id isn't a service; the bundle now prints HistoryServices::describeStore()'s text instead of the bare id.debug: false, Symfony never checks container freshness. If your own functional kernels do this, fingerprint the sources into the cache path (as the bundle's suite now does) or you'll test against a stale container.Command\EntityLoader still lives in the bundle and extends Console\AbstractSubjectLoader; constructor and manager() are unchanged, so existing subclasses keep working.?serialize=true; otherwise the message and its stamps are handed back as the same object and encode/decode bugs stay invisible.How can I help you explore Laravel packages today?