Symfony注入服务类而不调用她的构造函数

时间:2017-09-24 23:29:59

标签: php symfony service

嗨,我想注入一个服务类而不调用她的构造函数,请注意我还没有将参数传递给这个构造函数类注入。

例:

services:
your.service.name:
    class:  AppBundle\Services\YourClassName
    arguments:  ['@doctrine.services.paginator']

doctrine.services.paginator:
  class: Doctrine\ORM\Tools\Pagination\Paginator
  public: false

返回错误

  

类型错误:函数参数太少   Doctrine \ ORM \ Tools \ Pagination \ Paginator :: __ construct(),0传入   ......至少有1个预期的

2 个答案:

答案 0 :(得分:1)

在不使用构造函数的情况下实例化类有点困难,
PHP文档说:

  

PHP 5允许开发人员为类声明构造函数方法。具有构造函数方法的类在每个新创建的对象上调用此方法,因此它适用于对象在使用之前可能需要的任何初始化。

PHP constructor documentation

如果要在不注入依赖关系的情况下使用paginator,可以按照doctrine文档进行操作:

Doctrine paginator documentation

基本上,您在存储库中插入use语句。

use Doctrine\ORM\Tools\Pagination\Paginator;

然后在查询中使用Paginator类的对象:

$qb = $this->CreateQueryBuilder('u');
// ... build your query here...
$qb->getQuery();
$paginator = new Paginator($qb, false);
$count = count($paginator);
return array($paginator, $count); // Process the results in your controller

希望这有帮助

答案 1 :(得分:1)

你可以使用setter注入,这是可选的,并不是真的推荐,但我不会深入研究。

示例:

<?php

class YourClassName 
{
    private $paginator;

    public function setPaginator(PaginatorInterface $paginator)
    {
        $this->paginator = $paginator;
    }

    public function getPaginator()
    {
        if ($this->paginator instanceof PaginatorInterface) {
            return $this->paginator;
        }

        throw new \RuntimeException('Paginator is not defined');
    }
}

然后您可以在不指定paginator作为参数的情况下注入您的服务:

services:
    your.service.name:
        class:  AppBundle\Services\YourClassName

而是将其注入运行时:

$this->get('your.service.name')->setPaginator($paginator);

如果你需要使用容器注入paginator,你可以使用calls参数和service more in docs

如果每次从容器获得服务时都需要获取新实例,则可以使用shared参数more in docs