This commit introduces a RecommendationService that is used when indexing products. The service is utilizing a recommendation rules interface, so many rules can be created and applied during indexing the products
40 lines
1.7 KiB
PHP
40 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace Modules\Core\Catalog\Contracts;
|
|
|
|
use Illuminate\Support\Collection;
|
|
use Lunar\Models\Product;
|
|
|
|
/**
|
|
* One strategy for producing recommended products for a given product —
|
|
* e.g. same category, same tag, best sellers, random. Modules\Core\Catalog\
|
|
* Services\RecommendationService runs rules registered in
|
|
* config('catalog.recommendation_rules') in order, topping up from each
|
|
* successive rule until $limit distinct products are collected or every
|
|
* rule is exhausted (e.g. 3 from SameCategoryRule + 1 from RandomRule) —
|
|
* nothing here decides that accumulation itself; a store composes its own
|
|
* chain by ordering rules in config (e.g. [SameCategoryRule::class,
|
|
* RandomRule::class]).
|
|
*
|
|
* Returns raw Product models, not ProductService::list()'s locale-resolved
|
|
* array output — this runs at index time (ProductIndexer::toSearchableArray()),
|
|
* where "the current locale" isn't a meaningful concept the way it is for a
|
|
* storefront request. ProductIndexer resolves translated fields itself via
|
|
* translateAttribute(), same as it already does for the embedded `collections`
|
|
* field — same known index-time-locale tradeoff, not a new one.
|
|
*/
|
|
interface RecommendationRule
|
|
{
|
|
/**
|
|
* $exclude carries $product's own id plus every id already picked by an
|
|
* earlier rule this call — RecommendationService never shows the same
|
|
* product twice even when two rules would both suggest it, and a rule
|
|
* shouldn't spend its $limit budget re-returning something already
|
|
* collected.
|
|
*
|
|
* @param array<int> $exclude
|
|
* @return Collection<int, Product> at most $limit products
|
|
*/
|
|
public function recommend(Product $product, int $limit, array $exclude): Collection;
|
|
}
|