Solarium 客户端中参数 2 的类型错误

TypeError for Argument 2 in Solarium Client

我正在尝试使用 Search_api_solr v4.1、Solarium v​​6.0 和 symfony/event-dispatcher v3.4.47 启动客户端,但我一直收到 TypeError。

TypeError: Argument 2 passed to Solarium\Core\Client\Client::__construct() 
must be an instance of Psr\EventDispatcher\EventDispatcherInterface, 
instance of Symfony\Component\EventDispatcher\EventDispatcher given

我不太清楚为什么日光浴场上的所有文档都说要使用 Symfony\Component\EventDispatcher\EventDispatcher.

时却期待 Psr\EventDispatcher\EventDispatcherInterface 的实例

我的适配器和事件调度程序如下

use Solarium\Client;
use Solarium\Core\Client\Adapter\Curl;
use Symfony\Component\EventDispatcher\EventDispatcher; 

function get_search_query() {
$adapter = new Curl();
$eventDispatcher = new EventDispatcher();

$config = ['endpoint' => ['localhost' => [
                'host' => $id,
                'port' => $port,
                'path' => '/',
                'collection' => '$core',],],];

$search = new Client($adapter, $eventDispatcher, $config);
$query = $search->createSelect();
}

还有其他人 运行 解决过这个问题或知道解决办法吗?

当您深入了解 Symfony 源代码时,您可以查看:

if (interface_exists(PsrEventDispatcherInterface::class)) {
    /**
     * Allows providing hooks on domain-specific lifecycles by dispatching events.
     */
    interface EventDispatcherInterface extends PsrEventDispatcherInterface
    {
        /**
         * Dispatches an event to all registered listeners.
         *
         * For BC with Symfony 4, the $eventName argument is not declared explicitly on the
         * signature of the method. Implementations that are not bound by this BC constraint
         * MUST declare it explicitly, as allowed by PHP.
         *
         * @param object      $event     The event to pass to the event handlers/listeners
         * @param string|null $eventName The name of the event to dispatch. If not supplied,
         *                               the class of $event should be used instead.
         *
         * @return object The passed $event MUST be returned
         */
        public function dispatch($event/*, string $eventName = null*/);
    }
} else {
    /**
     * Allows providing hooks on domain-specific lifecycles by dispatching events.
     */
    interface EventDispatcherInterface
    {
        /**
         * Dispatches an event to all registered listeners.
         *
         * For BC with Symfony 4, the $eventName argument is not declared explicitly on the
         * signature of the method. Implementations that are not bound by this BC constraint
         * MUST declare it explicitly, as allowed by PHP.
         *
         * @param object      $event     The event to pass to the event handlers/listeners
         * @param string|null $eventName The name of the event to dispatch. If not supplied,
         *                               the class of $event should be used instead.
         *
         * @return object The passed $event MUST be returned
         */
        public function dispatch($event/*, string $eventName = null*/);
    }
}

所以您的问题是 interface_exists(PsrEventDispatcherInterface::class) returns 错误。这个界面来自这个包 https://packagist.org/packages/psr/event-dispatcher 所以我会尝试 composer require psr/event-dispatcher 来修复它。

编辑:您的 symfony 事件调度程序版本已过时。更新到 5.3 以解决问题。

当您在 new Client() 创建日光浴室客户端时,第二个参数期望您提供 class 实现 Psr\EventDispatcher\EventDispatcherInterface。但是,在您的 use 语句中,您正在创建的 EventDispatcher 是 Symfony\Component\EventDispatcher\EventDispatcher.

将 use 语句更改为 PSR 事件调度程序,您应该没问题。