setono/sylius-meilisearch-plugin

为您的 Sylius 商店提供 Meilisearch 集成

资助包维护!
Setono

安装: 14

依赖者: 0

建议者: 0

安全: 0

星星: 2

监视者: 5

分支: 2

开放问题: 1

类型:sylius-plugin

dev-master 2024-09-18 13:25 UTC

README

Latest Version Software License Build Status Code Coverage

Meilisearch 是一个用 Rust 编写的开源搜索引擎,旨在直接创建闪电般的快速和高度相关的搜索体验。

安装

composer require setono/sylius-meilisearch-plugin

导入配置

# config/packages/setono_sylius_meilisearch.yaml
setono_sylius_meilisearch:
    indexes:
        products:
            document: 'Setono\SyliusMeilisearchPlugin\Document\Product'
            entities: [ 'App\Entity\Product\Product' ]
    search:
        index: products

在您的 .env.local 中添加您的参数

###> setono/sylius-meilisearch-plugin ###
MEILISEARCH_HOST=https://:7700
MEILISEARCH_MASTER_KEY=YOUR_MASTER_KEY
###< setono/sylius-meilisearch-plugin ###

导入路由

# config/routes/setono_sylius_meilisearch.yaml
setono_sylius_meilisearch:
    resource: "@SetonoSyliusMeilisearchPlugin/Resources/config/routes.yaml"

或者如果您的应用程序不使用区域设置

# config/routes/setono_sylius_meilisearch.yaml
setono_sylius_meilisearch:
    resource: "@SetonoSyliusMeilisearchPlugin/Resources/config/routes_no_locale.yaml"

在您的实体中实现 IndexableInterface

您已配置用于索引的实体必须实现 Setono\SyliusMeilisearchPlugin\Model\IndexableInterface

在典型的 Sylius 应用程序中,针对 Product 实体可能看起来像这样

<?php
declare(strict_types=1);

namespace App\Entity\Product;

use Doctrine\ORM\Mapping as ORM;
use Setono\SyliusMeilisearchPlugin\Model\IndexableAwareTrait;
use Setono\SyliusMeilisearchPlugin\Model\IndexableInterface;
use Sylius\Component\Core\Model\Product as BaseProduct;

/**
 * @ORM\Entity
 * @ORM\Table(name="sylius_product")
 */
class Product extends BaseProduct implements IndexableInterface
{
    public function getDocumentIdentifier(): ?string
    {
        return (string) $this->getId();
    }
}

过滤要索引的实体

在索引实体时,很可能会遇到一些您不希望包括在索引中的实体。您有两种方法可以这样做。1) 当从数据库获取数据时 2) 当在索引过程中遍历数据时。显然,第一种选项是最有效的,但让我们看看两种方法。

从数据库获取数据时的过滤

在这里,您将监听 \Setono\SyliusMeilisearchPlugin\Event\QueryBuilderForDataProvisionCreated 事件并根据情况修改查询构建器。以下是一个示例,其中我们过滤掉禁用的产品

<?php
    
namespace App\EventSubscriber;

use Doctrine\ORM\QueryBuilder;
use Setono\SyliusMeilisearchPlugin\Event\QueryBuilderForDataProvisionCreated;
use Sylius\Component\Resource\Model\ToggleableInterface;use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class FilterDisabledEntitiesSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            QueryBuilderForDataProvisionCreated::class => 'filter',
        ];
    }
    
    public function filter(QueryBuilderForDataProvisionCreated $event): void
    {
        if(!is_a($event->entity, ToggleableInterface::class, true)) {
            return;
        }
        
        $queryBuilder = $event->getQueryBuilder();
        $alias = $queryBuilder->getRootAliases()[0];
        $queryBuilder->andWhere($alias . '.enabled = true');
    }
}

遍历数据时的过滤

在这里,您将在您的实体中实现 \Setono\SyliusMeilisearchPlugin\Model\FilterableInterface 并实现 filter 方法。以下示例与上一个示例相同,但这次我们在遍历数据时过滤掉禁用的产品

<?php

namespace App\Entity\Product;

use Doctrine\ORM\Mapping as ORM;

use Setono\SyliusMeilisearchPlugin\Model\FilterableInterface;
use Setono\SyliusMeilisearchPlugin\Model\IndexableInterface;
use Sylius\Component\Core\Model\Product as BaseProduct;

/**
 * @ORM\Entity
 * @ORM\Table(name="sylius_product")
 */
class Product extends BaseProduct implements IndexableInterface, FilterableInterface
{
    public function getDocumentIdentifier(): ?string
    {
        return (string) $this->getId();
    }
    
    public function filter(): bool
    {
        return $this->isEnabled();
    }
}