gpt4 book ai didi

php - 如何使用 Doctrine 2 在 Zend Framework 2 中集成 Elasticsearch

转载 作者:行者123 更新时间:2023-12-02 22:42:55 27 4
gpt4 key购买 nike

我关注了this tutorial用于将教义与 Zend Framework 2 集成。现在,一切正常,但我想将 Elasticsearch 集成到这个项目中。

我找到了很多关于 Elasticsearch 的文档,我下载了 PHP 的 Elastica 插件,但我不知道从哪里开始。

我搜索了将 Elasticsearch 与 Doctrine 集成的教程,但它们都是关于 Symfony 的。
有人可以(以简单的方式)解释我如何在 Zend Framework 2 中使用 ElasticSearch,使用 Doctrine 2 作为 ORM 来索引和搜索我的对象吗?

最佳答案

之间没有直接关系教义 2 Elasticsearch . Doctrine ORM 的主要关注点是持久化、更新和读取关系数据库上的数据,而 elasticsearch 主要关注索引和搜索数据。与其考虑“将 elasticsearch 与学说集成”,不如考虑“如何在同一应用程序中同时使用学说和 elasticsearch”。

每当您在数据库中创建或更新记录时,您可能希望执行更多操作,例如在 Elasticsearch 或 Solr 上索引该数据,缓存或使已缓存的相同数据版本在 上无效。内存缓存 Redis 等等。要正确地做到这一点(或zf2方式),你应该仔细设计一个服务层orchestrates持久性操作和相关的后处理,如在 elasticsearch 上的索引、缓存、缓存失效、日志记录等。

通过 EventManager 触发一些事件来完成其中一些操作将是一个适当的决定。

Note: Don't utilize EventManager heavily for simple & straightforward tasks such as writing a log line. Events are not free, especially in ZF2. (Quite improved in ZF3, but still not free).



作为问题,这是使用 Zend Framework 2 的方法,同时使用 ruflin/elastica 的 3rd 方库。 :

答:打开你的终端并输入
$ cd /path/to/your/project
$ php composer.phar selfupdate
$ php composer.phar require ruflin/elastica:dev-master

B. 为elastica客户端创建工厂 Application\Service\ElasticaClientFactory.php
<?php
namespace Application\Service;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class ElasticaClientFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $sl)
{
$config = $sl->get('Config');
$clientOptions = isset($config['elastica']) ? $config['elastica'] : array();
$client = new \Elastica\Client($clientOptions);

return $client;
}
}

C.在您的 module.config.php 中添加 elastica 配置并将新工厂类注册到服务定位器:
'elastica' => array(
'servers' => array(
array('host' => '127.0.0.1','port' => 9200),
// You can add more servers when necessary
// array('host' => '127.0.0.1','port' => 9200)
),
),

service_manager' => array(
'factories' => array(
'elastica-client' => 'Application\Service\ElasticaClientFactory'
),
)

此时,在任何 Controller (坏)或服务(好)中,您都可以像这样获取 elastica 客户端实例:
$elastica = $this->getServiceLocator()->get('elastica-client');

奖励:使用服务初始化器和特征

如果您的 PHP 版本 ≥ 5.4,您可以使用 traitsservice initializers 的帮助下自动将 Elastica 客户端注入(inject)到您的服务中.

D. 创建一个名为 Application\Service\ElasticaAwareInterface.php 的新接口(interface)
<?php
namespace Application\Service;

interface ElasticaAwareInterface
{
public function getElasticaClient();
public function setElasticaClient(\Elastica\Client $client);
}

E. 创建一个名为 Application\Traits\ElasticaAwareTrait.php 的新特征(注意路径。如果不存在,请创建 Traits 文件夹)
<?php
namespace Application\Traits;

trait ElasticaAwareTrait
{
protected $client = null;

public function getElasticaClient()
{
return $this->client;
}

public function setElasticaClient(\Elastica\Client $client)
{
$this->client = $client;
return $this;
}
}

创建一个名为 Application\Initializers\ElasticaInitializer.php 的新初始化程序(再次注意路径)
<?php
namespace Application\Initializers;

use Zend\ServiceManager\InitializerInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Application\Service\ElasticaAwareInterface;

class ElasticaInitializer implements InitializerInterface
{
/**
* Initializer for the elastica-aware domain services.
* Properly creates a new elastica client and injects it into related service.
*/
public function initialize($service, ServiceLocatorInterface $serviceManager)
{
/**
* Beware: This if statement will be run for every service instance
* we grab from $serviceManager because the nature of initializers.
* This worth think about on it. With ZF3 this went further.
* We may load our services lazily using delegator factories.
*/
if ($service instanceof ElasticaAwareInterface) {
$service->setElasticaClient( $serviceManager->get('elastica-client') );
}
}
}

到现在为止还挺好。现在,我们可以将所有部分放在一起。比如说,我们有一个名为 UserService 的服务使用 Doctrine 实体管理器(或 UserRepository 更好),也需要使用 弹性 .

G. 向服务经理注册我们的服务:
service_manager' => array(
'factories' => array(
'elastica-client' => 'Application\Service\ElasticaClientFactory'
),
'invokables' => array(
'user-service' => 'Application\Service\UserService'
)
)

最后, UserService签名:
<?php
namespace Application\Service;

use Application\Service\ElasticaAwareInterface;

class UserService implements ElasticaAwareInterface
{
// Here is our trait
use \Application\Traits\ElasticaAwareTrait;

public function fooMethod()
{
// Do some things with doctrine EM here..

// And grab the elastica client easily anywhere in UserService
$client = $this->getElasticaClient();
}
}

关于php - 如何使用 Doctrine 2 在 Zend Framework 2 中集成 Elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25242126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com