atoolo/crawler-teaser-indexer
A Symfony bundle that crawls external sources to build teasers and indexes them into Apache Solr, making titles, intro texts, dates, and date-times discoverable through your website's search.
atoolo/index-bundle, which is a meaningful architectural change:
atoolo/index-bundle contract. This improves Laravel fit — we can implement the index-bundle interface against Elasticsearch, Algolia, or Laravel Scout and skip Solr entirely, rather than reimplementing the crawler’s Solr integration.config/crawler.php / .env as before, but index-related settings now likely live in the index-bundle’s config namespace — split accordingly.Http client or Symfony\Component\DomCrawler.Symfony/CssSelector remains the pragmatic choice; alternatives are weaker for real-world selector support.atoolo/index-bundle — a Laravel-side ScoutIndexer or SolrIndexer implementing the bundle contract is the recommended path.2.0.0 bump plus the index-bundle extraction is a breaking release. No deprecation notices were published alongside it, so we must diff the public command/config surface ourselves.| Risk Area | Severity | Mitigation |
|---|---|---|
| Breaking change in scheduling command | High | Pin 1.x until the 2.0.0 command signature is diffed; rebuild the Artisan wrapper against 2.0.0 only. |
New atoolo/index-bundle dependency |
Medium | Evaluate the index-bundle contract in isolation; implement a Laravel-native indexer behind it. Opportunity, not just risk. |
| Solr Dependency | Medium (down from High) | Now abstracted behind the index-bundle; Elasticsearch/Scout fallback is materially easier. |
| Config surface split (crawler vs. index) | Medium | Separate config/crawler.php and config/index.php; document ownership. |
| CSS Selector Parsing | Low | Use Symfony/CssSelector. |
| Retry Logic | Low | Exponential backoff in Laravel’s HTTP client. |
| Toolchain churn (php-cs-fixer, phplint via composer) | Low | Dev-only; align our contributor docs. |
atoolo/index-bundle exposes? Can we implement it against Laravel Scout/Algolia without forking?config/crawler.php) vs. database-driven; how do we version-control selector configs?vcr/vcr remains our proposal.| Laravel Component | Bundle Equivalent | Integration Strategy |
|---|---|---|
| Service Container | Symfony Bundle Services | Register crawler + indexer in CrawlerServiceProvider; bind index-bundle contract to our adapter. |
| Artisan Commands | Refactored crawler:index (2.0.0) |
Re-derive CrawlerCommand from the 2.0.0 command definition. |
| Configuration | atoolo_crawler_master.yaml |
Split into config/crawler.php (crawl/selectors) and config/index.php (index bundle). |
| Logging | Monolog | Laravel Log facade or Monolog channels. |
| HTTP Client | Symfony Client |
Laravel Http client (Guzzle). |
| CSS Selector Parsing | Symfony CssSelector |
Keep Symfony\Component\DomCrawler / CssSelector. |
| Indexing | atoolo/index-bundle (new in 2.0.0) |
Implement the bundle’s indexer contract over Solr, Elasticsearch, or Laravel Scout. |
| Task Scheduling | Symfony Scheduler (refactored in 2.0.0) | Laravel schedule:run or external cron calling artisan crawler:run. |
| Queues | Worker-based execution | CrawlerJob dispatched to Horizon. |
Phase 0: 2.0.0 Impact Triage (2-3 days)
atoolo/index-bundle contract and decide build-vs-adopt for the indexer adapter.Phase 1: Core Crawler Logic (2-3 weeks)
UrlCollector, TeaserExtractor as Laravel services.Client with Laravel’s Http client.Http::fake() / vcr/vcr).Phase 2: Indexer Adapter (1-2 weeks)
atoolo/index-bundle contract as a Laravel service.sp_id, sp_title, sp_introText).Phase 3: Configuration & CLI (1 week)
config/crawler.php and config/index.php.artisan crawler:index against the 2.0.0 command definition.Phase 4: Scheduling & Scaling (1-2 weeks)
Phase 5: Monitoring & Observability (1 week)
DomCrawler/CssSelector retained; HttpClient replaced with Laravel Http.atoolo/index-bundle — the compatibility question shifts from “does Solr match?” to “can we satisfy the indexer interface?”atoolo/index-bundle reviewed and version-pinned.UrlCollector + TeaserExtractor.CrawlerCommand + split config.artisan trigger with a stub indexer.atoolo/index-bundle should reduce our maintenance surface — index changes ship independently of crawler changes, and we no longer patch Solr client code inside the crawler.| Failure | Impact | Handling |
|---|---|---|
| Index backend down | Teasers crawled but not indexed | Retry with backoff; dead-letter queue; alerting. |
| Index-bundle contract mismatch after upgrade | Silent indexing failures | Contract tests in CI against a pinned bundle version. |
| Scheduling command signature change (2.0.0) | Artisan wrapper breaks after upgrade | Pin versions; integration test the wrapper on every bump. |
| Blocked URLs / rate limits | Incomplete crawl | Per-host throttling; structured failure logs. |
| Duplicate teasers | Index bloat, stale results | Dedup at adapter layer; canonical URL normalization. |
atoolo/index-bundle contract is the main unknown and should be timeboxed as a spike in week one.How can I help you explore Laravel packages today?