我正在尝试创建一个手动提供程序来手动填充我的FOS Elastica索引以解决一些复杂的连接问题。目前,我只是试图让提供程序工作,即使没有连接,我也无法在提供程序的构造函数中注入正确的Elastica类型。这是我的提供者的构造函数:
// ...
class EmpPosDeptProvider implements ProviderInterface
{
private $em;
protected $type;
public function __construct(Type $type, EntityManager $em)
{
$this->type = $type;
$this->em = $em->getRepository('CcitEmployeesBundle:Position');
}
// ...
这是我的services.yml文件:
services:
employees.search_provider.empPosDept:
class: Ccit\EmployeesBundle\Search\EmpPosDeptProvider
tags:
- { name: fos_elastica.provider, index: employees, type: empPosDept }
arguments:
- %fos_elastica.type.class%
- @doctrine.orm.entity_manager
当我尝试执行php app/console fos:elastica:populate
时,我收到以下错误:
PHP Catchable fatal error: Argument 1 passed to Ccit\EmployeesBundle\Search
\EmpPosDeptProvider::__construct() must be an instance of Elastica\Type, string given,
called in /vagrant-nfs/employees/app/cache/dev/appDevDebugProjectContainer.php on line 736
and defined in /vagrant-nfs/employees/src/Ccit/EmployeesBundle/Search
/EmpPosDeptProvider.php on line 23
有没有人知道我需要在services.yml文件中作为正确的参数提供什么?或者问题可能完全是另一回事?
答案 0 :(得分:2)
您正在传递包含Ccit\EmployeesBundle\Search\EmpPosDeptProvider
的字符串。您必须传递EmpPosDeptProvider
的实例,并且可以在您的services.yml
中声明它:
services:
fos_elastica.type:
class: %fos_elastica.type.class%
employees.search_provider.empPosDept:
class: Ccit\EmployeesBundle\Search\EmpPosDeptProvider
tags:
- { name: fos_elastica.provider, index: employees, type: empPosDept }
arguments:
- @fos_elastica.type
- @doctrine.orm.entity_manager
答案 1 :(得分:0)
显然我需要为我引用的类型提供显式路径。以下一行有效:
@fos_elastica.index.employees.employeePositionDepartment
这是有道理的,因为我的config.yml文件包含以下内容:
fos_elastica:
clients:
default: { host: localhost, port: 9200 }
indexes:
employees:
client: default
types:
employeePositionDepartment:
mappings:
id: { type: integer }
title: { type: string }
startDate: { type: date, format: date_time_no_millis }
endDate: { type: date, format: date_time_no_millis }
supervisor: { type: integer }
感谢所有考虑帮助我解决这个相当基本问题的人。