Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Products Favorite Laravel Package

baks-dev/products-favorite

Laravel/PHP module for managing product favorites (wishlist): add/remove products to a user’s favorites, store and retrieve favorite lists, and integrate into e-commerce product pages. Requires PHP 8.4+.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require baks-dev/products-favorite
    

    Publish the package config and migrations:

    php artisan vendor:publish --provider="BaksDev\ProductsFavorite\ProductsFavoriteServiceProvider" --tag="config"
    php artisan vendor:publish --provider="BaksDev\ProductsFavorite\ProductsFavoriteServiceProvider" --tag="migrations"
    php artisan migrate
    
  2. First Use Case: Adding Favorite Logic to a Product Inject the BaksDev\ProductsFavorite\Contracts\FavoriteService into your controller:

    use BaksDev\ProductsFavorite\Contracts\FavoriteService;
    
    class ProductController extends Controller
    {
        public function __construct(
            private FavoriteService $favoriteService
        ) {}
    
        public function toggleFavorite(Request $request, Product $product)
        {
            $this->favoriteService->toggle($request->user(), $product);
            return response()->json(['status' => 'success']);
        }
    }
    
  3. Key Files to Review

    • config/products-favorite.php (for customization)
    • app/Models/Product.php (if extending the HasFavorites trait)
    • routes/web.php (for default API routes)

Implementation Patterns

Core Workflows

  1. User Favorite Management

    // Toggle favorite status
    $favoriteService->toggle($user, $product);
    
    // Check if product is favorited
    $isFavorited = $favoriteService->isFavorited($user, $product);
    
    // Get user's favorite products
    $favorites = $favoriteService->getFavorites($user);
    
  2. Model Integration Extend your Product model with the HasFavorites trait:

    use BaksDev\ProductsFavorite\Traits\HasFavorites;
    
    class Product extends Model
    {
        use HasFavorites;
    }
    

    Now use model methods directly:

    $product->toggleFavorite($user);
    $product->isFavoritedBy($user);
    
  3. API Endpoints The package includes default routes for:

    • POST /api/favorites (toggle favorite)
    • GET /api/favorites (list user favorites) Customize via routes/web.php or override middleware.
  4. Event Handling Listen for favorite events:

    // In EventServiceProvider
    protected $listen = [
        'BaksDev\ProductsFavorite\Events\FavoriteAdded' => [
            'App\Listeners\LogFavoriteActivity',
        ],
        'BaksDev\ProductsFavorite\Events\FavoriteRemoved' => [
            'App\Listeners\NotifyUser',
        ],
    ];
    
  5. Batch Operations

    // Add multiple products to favorites
    $favoriteService->addMultiple($user, [$product1, $product2]);
    
    // Remove multiple products
    $favoriteService->removeMultiple($user, [$product1, $product2]);
    

Gotchas and Tips

Common Pitfalls

  1. Authentication

    • Always verify the user is authenticated before calling favorite methods. The package does not enforce this by default.
    • Example middleware:
      public function handle(Request $request, Closure $next)
      {
          if (!$request->user()) {
              abort(401);
          }
          return $next($request);
      }
      
  2. Model Relationships

    • Ensure your Product model has a user_id column if using the default pivot table. Customize via config:
      'pivot' => [
          'table' => 'product_user_favorites',
          'foreign_key' => 'product_id',
          'related_key' => 'user_id',
      ],
      
  3. Caching

    • Favorite checks (isFavorited) may benefit from caching. Add a cache layer:
      $isFavorited = Cache::remember(
          "favorite:{$user->id}:{$product->id}",
          now()->addHours(1),
          fn() => $favoriteService->isFavorited($user, $product)
      );
      
  4. Performance

    • Avoid eager-loading favorites for all users. Use with() selectively:
      // Bad: Loads favorites for ALL products
      $products = Product::with('favorites')->get();
      
      // Good: Load only needed favorites
      $products = Product::whereIn('id', $ids)->with(['favorites' => function($query) use ($user) {
          $query->where('user_id', $user->id);
      }])->get();
      
  5. Testing

    • Use the FavoriteService facade in tests:
      $this->actingAs($user);
      $this->postJson('/api/favorites', ['product_id' => $product->id]);
      $this->assertDatabaseHas('product_user_favorites', [
          'product_id' => $product->id,
          'user_id' => $user->id,
      ]);
      

Advanced Tips

  1. Customizing the Pivot Table Extend the FavoriteService to use a custom pivot table:

    class CustomFavoriteService extends FavoriteService
    {
        protected $pivotTable = 'custom_favorites';
    }
    

    Bind it in AppServiceProvider:

    $this->app->bind(
        \BaksDev\ProductsFavorite\Contracts\FavoriteService::class,
        CustomFavoriteService::class
    );
    
  2. Soft Deletes If using soft deletes, ensure the pivot table has deleted_at and update the service:

    // In CustomFavoriteService
    public function toggle(User $user, Product $product)
    {
        $exists = $this->favoriteModel->where([
            'product_id' => $product->id,
            'user_id' => $user->id,
        ])->exists();
    
        if ($exists) {
            $this->favoriteModel->where([
                'product_id' => $product->id,
                'user_id' => $user->id,
            ])->delete(); // Soft delete
        } else {
            $this->favoriteModel->create([
                'product_id' => $product->id,
                'user_id' => $user->id,
            ]);
        }
    }
    
  3. API Rate Limiting Protect favorite endpoints with Laravel's throttle middleware:

    Route::middleware(['throttle:10,1'])->group(function () {
        Route::post('/api/favorites', [FavoriteController::class, 'toggle']);
    });
    
  4. Localization Customize language strings in resources/lang/{locale}/products-favorite.php:

    return [
        'added' => 'Product added to favorites!',
        'removed' => 'Product removed from favorites.',
    ];
    
  5. Debugging

    • Enable query logging to debug pivot table issues:
      DB::enableQueryLog();
      $favoriteService->toggle($user, $product);
      dd(DB::getQueryLog());
      
    • Check for foreign key constraints if migrations fail:
      Schema::table('product_user_favorites', function (Blueprint $table) {
          $table->foreign('product_id')->references('id')->on('products');
          $table->foreign('user_id')->references('id')->on('users');
      });
      
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
cocosmos/filament-sticky-save-bar
patrickbussmann/oauth2-apple
3brs/enterprise-security-bundle
anousss007/vigilance
supportpal/eloquent-model
ardenexal/fhir-models
laravel-at/laravel-image-sanitize
romalytar/yammi-audit-log-laravel
ardenexal/fhir-validation
arshaviras/weather-widget
laravel-chronicle/core
sunchayn/nimbus
daikazu/eloquent-salesforce-objects
unseen-codes/chat
romalytar/yammi-jobs-monitoring-laravel
kisame76/filament-db-table-state
nqxcode/laravel-lucene-search
dpfx/laravel-livewire-wizards
workos/workos-php-laravel
sofa/laravel-global-scope