Использование функции репозитория в сервисе Symofony - PullRequest
0 голосов
/ 23 января 2020

Я использую службу внутри ветки, как это

{{ count_service.getCount(term.getId) }}

Я хочу, чтобы служба использовала функцию хранилища, функцию хранилища

<?php

namespace AppBundle\Repository;

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping;

class SynonymRepository extends EntityRepository
{

    public function getCount($termId)
    {
        $qbSynonymType = $this->getEntityManager()->createQueryBuilder();
        $synonymTypes = $qbSynonymType->select('synonymType.id, synonymType.type')
            ->from('AppBundle:SynonymType', 'synonymType')
            ->getQuery()->getResult();

        $qb = $this->getEntityManager()->createQueryBuilder();
        $count = [];

        $qb->select('count(synonym.synonymId)')
            ->from('AppBundle:Synonym','synonym');

        foreach($synonymTypes as $type) {
            $count[$type['type']] = $qb
                ->where('synonym.term = :termId')
                ->andWhere('synonym.synonymType = :type')
                ->setParameter('termId', $termId)
                ->setParameter('type', $type['id'])
                ->getQuery()->getSingleScalarResult();
        }

        $qbTerm = $this->getEntityManager()->createQueryBuilder()->from('AppBundle:Term', 'term');


        $count['parent'] = "NaN";
        $count['children'] = "NaN";

        return $count;
    }
 }

Мой service.yml выглядит так

synonymrepository:
    class: Doctrine\ORM\EntityRepository
    factory: ["@doctrine.orm.entity_manager", getRepository]
    arguments:
        - AppBundle\Entity\SynonymType

term_count:
    class: AppBundle\Services\TermCount
    arguments:
        - "@synonymrepository"

И, наконец, мой сервис выглядит следующим образом

<?php

namespace AppBundle\Services;

use AppBundle\Repository\SynonymRepository;

class TermCount
{
    private $repository;

    public function __construct()
    {
        $this->repository = new SynonymRepository();
    }

    public function getCount($termId)
    {
        return $this->repository->getCount($termId);
    }
}

При выполнении этого я получаю следующую ошибку

Type error: Too few arguments to function Doctrine\ORM\EntityRepository::__construct(), 0 passed in /var/www/html/src/AppBundle/Services/TermCount.php on line 15 and exactly 2 expected

Я предполагаю, что это происходит из-за расширения SynonymRepository с EntityRepository требуются EntityManagerInterface $ em и Mapping \ ClassMetadata $ class. Но я не уверен, как передать их в EntityRepository.

Я использовал этот ответ , чтобы получить меня здесь, потерянный на том, как на самом деле реализовать финальный бит. Спасибо за помощь.

ОБНОВЛЕНИЕ

Сущность

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Table(name="synonym")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\SynonymRepository")
 */
class Synonym
{
    /**
     * @var int
     * @ORM\Id()
     * @ORM\Column(name="synonym_id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $synonymId;

    /**
     * @var Term
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Term", inversedBy="synonyms")
     */
    protected $term;

    /**
     * @var SynonymType[]
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\SynonymType", inversedBy="synonyms")
     */
    protected $synonymType;

    /**
     * @var int
     * @ORM\Column(name="language_id", type="integer")
     */
    protected $languageId;

    /**
     * @var string
     * @ORM\Column(name="synonym", type="string", length=255)
     */
    protected $synonym;

    public function __construct()
    {
       // $this->synonymType = new ArrayCollection();
    }

    /**
     * @return int
     */
    public function getSynonymId(): int
    {
        return $this->synonymId;
    }

    /**
     * @return Term
     */
    public function getTerm(): Term
    {
        return $this->term;
    }

    /**
     * @param int $termId
     * @return Term
     */
    public function setTerm(int $termId): Term
    {
        $this->term = $termId;
        return $this->term;
    }

    /**
     * @return SynonymType[]
     */
    public function getSynonymType()
    {
        return $this->synonymType;
    }

    /**
     * @param SynonymType $synonymType
     * @return SynonymType
     */
    public function setSynonymType(SynonymType $synonymType): SynonymType
    {
        $this->synonymType = $synonymType;
        return $this->synonymType;
    }

    /**
     * @return int
     */
    public function getLanguageId(): int
    {
        return $this->languageId;
    }

    /**
     * @param int $languageId
     * @return Synonym
     */
    public function setLanguageId(int $languageId): Synonym
    {
        $this->languageId = $languageId;
        return $this;
    }

    /**
     * @return string
     */
    public function getSynonym(): string
    {
        return $this->synonym;
    }

    /**
     * @param string $synonym
     * @return Synonym
     */
    public function setSynonym(string $synonym): Synonym
    {
        $this->synonym = $synonym;
        return $this;
    }

}

1 Ответ

1 голос
/ 23 января 2020

Вам необходимо использовать DI (внедрение зависимостей) в своей конструкции вместо новой причины, поскольку я вижу, как ошибка, которую SynonymRepository зависит от других служб

<?php

namespace AppBundle\Services;

use AppBundle\Repository\SynonymRepository;

class TermCount
{
    private $repository;

    public function __construct(SynonymRepository $synonymRepository)
    {
        $this->repository = $synonymRepository;
    }

    public function getCount($termId)
    {
        return $this->repository->getCount($termId);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...