*/ public function recommend(Product $product, int $limit = 4): Collection { $recommendations = new Collection(); foreach (config('catalog.recommendation_rules', []) as $ruleClass) { if ($recommendations->count() >= $limit) { break; } $exclude = [$product->id, ...$recommendations->pluck('id')]; $remaining = $limit - $recommendations->count(); /** @var RecommendationRule $rule */ $rule = app($ruleClass); $recommendations = $recommendations->merge( $rule->recommend($product, $remaining, $exclude) ); } return $recommendations->take($limit)->values(); } }