setono / sylius-meilisearch-plugin
为您的 Sylius 商店提供 Meilisearch 集成
dev-master
2024-09-18 13:25 UTC
Requires
- php: >=8.1
- ext-json: *
- doctrine/collections: ^1.8 || ^2.0
- doctrine/event-manager: ^1.2 || ^2.0
- doctrine/orm: ^2.14 || ^3.0
- doctrine/persistence: ^2.5 || ^3.0
- dragon-code/size-sorter: ^1.5
- knplabs/knp-menu: ^3.4
- liip/imagine-bundle: ^2.10
- meilisearch/meilisearch-php: ^1.8
- ocramius/doctrine-batch-utils: ^2.4
- psr/cache: ^1.0 || ^2.0 || ^3.0
- psr/container: ^1.0 || ^2.0
- psr/event-dispatcher: ^1.0
- psr/log: ^1.1 || ^2.0 || ^3.0
- setono/composite-compiler-pass: ^1.2
- setono/doctrine-orm-trait: ^1.1
- sylius/channel: ^1.0
- sylius/channel-bundle: ^1.0
- sylius/core: ^1.0
- sylius/core-bundle: ^1.0
- sylius/currency: ^1.0
- sylius/grid-bundle: ^1.11
- sylius/locale: ^1.0
- sylius/locale-bundle: ^1.0
- sylius/product: ^1.0
- sylius/resource-bundle: ^1.6
- sylius/taxonomy: ^1.0
- sylius/ui-bundle: ^1.0
- symfony/config: ^5.4 || ^6.4 || ^7.0
- symfony/console: ^5.4 || ^6.4 || ^7.0
- symfony/dependency-injection: ^5.4 || ^6.4 || ^7.0
- symfony/event-dispatcher: ^5.4 || ^6.4 || ^7.0
- symfony/form: ^5.4 || ^6.4 || ^7.0
- symfony/http-foundation: ^5.4 || ^6.4 || ^7.0
- symfony/http-kernel: ^5.4 || ^6.4 || ^7.0
- symfony/messenger: ^5.4 || ^6.4 || ^7.0
- symfony/options-resolver: ^5.4 || ^6.4 || ^7.0
- symfony/routing: ^5.4 || ^6.4 || ^7.0
- symfony/serializer: ^5.4 || ^6.4 || ^7.0
- symfony/string: ^5.4 || ^6.4 || ^7.0
- symfony/translation-contracts: ^1.1 || ^2.5 || ^3.2
- symfony/validator: ^5.4 || ^6.4 || ^7.0
- twig/twig: ^2.15 || ^3.0
- webmozart/assert: ^1.11
Requires (Dev)
- api-platform/core: ^2.7.16
- babdev/pagerfanta-bundle: ^3.8
- behat/behat: ^3.14
- doctrine/doctrine-bundle: ^2.11
- infection/infection: ^0.27.10
- jms/serializer-bundle: ^4.2
- lexik/jwt-authentication-bundle: ^2.17
- matthiasnoback/symfony-dependency-injection-test: ^4.3 || ^5.1
- nyholm/psr7: ^1.8
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.6.17
- psalm/plugin-phpunit: ^0.18.4
- setono/code-quality-pack: ^2.8.3
- sylius/sylius: ~1.12.18
- symfony/browser-kit: ^5.4 || ^6.4 || ^7.0
- symfony/debug-bundle: ^5.4 || ^6.4 || ^7.0
- symfony/dotenv: ^5.4 || ^6.4 || ^7.0
- symfony/http-client: ^5.4 || ^6.4 || ^7.0
- symfony/intl: ^5.4 || ^6.4 || ^7.0
- symfony/property-info: ^5.4 || ^6.4 || ^7.0
- symfony/web-profiler-bundle: ^5.4 || ^6.4 || ^7.0
- symfony/webpack-encore-bundle: ^1.17.2
- willdurand/negotiation: ^3.1
Conflicts
- illuminate/contracts: <8.68.0
This package is auto-updated.
Last update: 2024-09-18 13:25:39 UTC
README
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(); } }