FOS Elastica手动提供商服务注入问题

时间:2014-02-18 20:44:16

标签: php symfony dependency-injection elastica

我正在尝试创建一个手动提供程序来手动填充我的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文件中作为正确的参数提供什么?或者问题可能完全是另一回事?

2 个答案:

答案 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 }

感谢所有考虑帮助我解决这个相当基本问题的人。