cyrildewit/eloquent-viewable
Track page views on Eloquent models without external analytics. Record views (with optional cooldown), count totals or unique views, filter by period, order models by popularity, and ignore bots/crawlers. Stores each view as a DB record for flexible reporting.
Viewable interface and InteractsWithViews trait enforce consistency across models.views), which may require schema adjustments (indexes, storage) for high-traffic apps.remember() method for view counts.unique_views_count) for faster queries.visitor column indexes).orderByViews) critical for performance?View or Visitor models?views table. No NoSQL support.remember() functionality. Assumes cache drivers are configured.composer require cyrildewit/eloquent-viewable.php artisan vendor:publish --tag=migrations,config.php artisan migrate.Viewable interface and InteractsWithViews trait in target models (e.g., Post, Product).class Post extends Model implements Viewable {
use InteractsWithViews;
protected $removeViewsOnDelete = true; // Optional
}
views($model)->record() in controllers (e.g., show() methods).public function show(Post $post) {
views($post)->cooldown(now()->addHours(1))->record();
return view('post.show', compact('post'));
}
views($post)->count()).Post::orderByViews()->get().session, pdo).eloquent-viewable first.Viewable trait in 1–2 pilot models (e.g., Post, Article).count(), unique()).visitor column) if queries are slow.remember(3600)).views_count column) for read-heavy queries.Visitor or CrawlerDetectAdapter if needed.Views class for domain-specific logic.views table size; implement archiving/purging (e.g., soft deletes, retention policies).viewable_type + viewable_id + visitor).Period::subHours(1)).cooldown() logic in custom implementations.View::where('viewable_id', $id)->delete()).ignoreMissing or transactional writes).views table exceeds 100M rows.views:post:123:count).| Failure Scenario | Impact | Mitigation |
|---|---|---|
| Database downtime | View recording/queries fail | Queue view recordings; use read replicas. |
| Cache failure | Stale view counts | Fallback to DB queries; monitor cache hits. |
| Session store outage | Cooldowns fail | Use cookie-based tracking as fallback. |
High cardinality in visitor |
Query performance degrades | Add indexes; limit visitor data (e.g., hash IPs). |
| Migration failures | Broken view tracking | Backup views table; rollback strategy. |
| Laravel upgrade conflicts | Package incompatibility | Test in staging; check changelog for breaking changes. |
Viewable trait implementation and views() helper usage.views table growth and query performance.Views facade to test view recording logic.How can I help you explore Laravel packages today?