think.studio / laravel-recently-viewed
Package to make quickly recently viewed functionality
Installs: 3 178
Dependents: 0
Suggesters: 0
Security: 0
Stars: 11
Watchers: 2
Forks: 9
Open Issues: 0
Requires
- php: ^8.1
- illuminate/support: ^9.0|^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.25
- orchestra/testbench: ^8.10
- phpunit/phpunit: ^10.3
- psalm/plugin-laravel: ^2.8
- vimeo/psalm: ^5.12
README
Add functionality to save/get in session recently viewed entities
You can track any number of entities. Each list will be saved separately.
Session storage (without persist)
For example:
"recently_viewed" => array:2 [ "App\Models\Product" => array:2 [ 0 => 'a3cda131-e599-4802-84ea-a3dddc19fa8c' 1 => '4413b636-9752-43b3-8361-3ef38c27acf9' ] "App\Domain\Property" => array:3 [ 0 => 133 1 => 134 2 => 653 ] ]
Installation
You can install the package via composer:
composer require think.studio/laravel-recently-viewed
You can publish the config file with:
php artisan vendor:publish --provider="RecentlyViewed\ServiceProvider" --tag="config"
Configuration in .env
# Optional RECENTLY_VIEWED_SESSION_PREFIX=recently_viewed
Usage example
<?php use Illuminate\Database\Eloquent\Model; use RecentlyViewed\Models\Contracts\Viewable; use RecentlyViewed\Models\Traits\CanBeViewed; class Product extends Model implements Viewable { // implement interface use CanBeViewed; }
<?php class ProductController extends Controller { public function show(Product $product) { \RecentlyViewed\Facades\RecentlyViewed::add($product); return view('my-view'); } }
<?php class ProductsViewComposer { public function compose(View $view) { $view->with([ 'recentlyViewedProducts' => \RecentlyViewed\Facades\RecentlyViewed::get(Product::class), // or 'recentlyViewedProductsWithoutLast' => \RecentlyViewed\Facades\RecentlyViewed::get(Product::class)->slice(1), ]); // or $view->with([ 'recentlyViewedProductsFiltered' => \RecentlyViewed\Facades\RecentlyViewed::getQuery(Product::class) ?->where('not_display_in_recently_list', false)->get() ??collect([]), ]); } }
Add persist storage
You can enable migration and run the migrations with adding this to register()
in AppServiceProvider or any other service provider:
\RecentlyViewed\PersistManager::enableMigrations();
php artisan migrate
Configuration in .env
RECENTLY_VIEWED_PERSIST_ENABLED=true
use RecentlyViewed\Models\Contracts\Viewer; use RecentlyViewed\Models\Traits\CanView; class User extends Authenticatable implements Viewer { use CanView; // ... }
Add "merge" method after login (if you want merge saved data before login and already stored data)
class LoginController extends Controller { // ... protected function authenticated(Request $request, $user) { \RecentlyViewed::mergePersistToCurrentSession(); } }