Symfony 3.3.2 Doctrine EntityRepository构造函数参数

时间:2017-07-05 14:58:26

标签: symfony doctrine

我是Symfony的新手。我正在尝试将symfony 2.6下的旧项目更新为symfony 3.3。

经过多次错误修复后,我遇到了一个问题:我的EntityRepository.php文件中包含构造函数的错误。

Type error: Too few arguments to function Doctrine\ORM\EntityRepository::__construct(), 1 passed in /Users/.../var/cache/dev/appDevDebugProjectContainer.php on line 3434 and exactly 2 expected

我理解错误,但我的EntityRepository文件不包含任何__construct方法。我应该修改Symfony 2和3之间的某些东西,以便使用起作用吗?

非常感谢。

这是我的MilestoneRepository.php文件:

namespace MilestonesBundle\Entity\Repository;

use DateTime;

use Doctrine\ORM\EntityRepository;

use Milestones\Entity\Factory\MilestoneFactoryInterface;
use Milestones\Entity\Repository\MilestoneRepositoryInterface;

class MilestoneRepository extends EntityRepository implements MilestoneFactoryInterface, MilestoneRepositoryInterface
{
    protected $current = false;

    /**
     * @see MilestoneFactoryInterface
     */
    public function create()
    {
        $class = $this->getClassName();

        return new $class;
    }

    public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
    {
        if (!$orderBy) {
            $orderBy['startsAt'] = 'ASC';
        }

        return parent::findBy($criteria, $orderBy, $limit, $offset);
    }

    /**
     * @see MilestoneRepositoryInterface
     */
    public function findCurrent()
    {
        $now = new DateTime;

        if ($this->current === false) {
            $this->current = $this->createQueryBuilder('m')
                ->where('m.startsAt <= :now')
                ->andWhere('(m.endsAt IS NULL OR :now < m.endsAt)')
                ->setParameter('now', $now->format('Y-m-d'))
                ->orderBy('m.startsAt', 'ASC')
                ->setMaxResults(1)
                ->getQuery()
                ->getOneOrNullResult()
            ;
        }

        return $this->current;
    }

    /**
     * @see MilestoneRepositoryInterface
     */
    public function isOpen()
    {
        $current = $this->findCurrent();

        return $current && $current->isStart();
    }
}

这是我的EntityRepository.php文件:

namespace Common\Doctrine\ORM;

use Doctrine\ORM\EntityRepository as BaseEntityRepository;
use Doctrine\ORM\QueryBuilder;

class EntityRepository extends BaseEntityRepository
{
    protected $alias = 'x';

    public function add($entity)
    {
        $em = $this->getEntityManager();
        $em->persist($entity);
        $em->flush();
    }

    public function remove($entity)
    {
        $em = $this->getEntityManager();
        $em->remove($entity);
        $em->flush();
    }

    public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null, $result = true)
    {
        $alias   = $this->alias;
        $builder = $this->createQueryBuilder($alias);

        $this->applyCriteria($builder, $alias, $criteria);
        $this->applyOrderBy($builder, $alias, $orderBy);
        $this->applyLimit($builder, $limit);
        $this->applyOffset($builder, $offset);

        if (!$result) {
            return $builder;
        }

        return $builder->getQuery()->getResult();
    }

    public function findOneBy(array $criteria, array $orderBy = null, $result = true)
    {
        $alias   = $this->alias;
        $builder = $this->createQueryBuilder($alias);

        $this->applyCriteria($builder, $alias, $criteria);
        $this->applyOrderBy($builder, $alias, $orderBy);

        if (!$result) {
            return $builder;
        }

        return $builder->getQuery()->getOneOrNullResult();
    }

    protected function applyCriteria(QueryBuilder $builder, $alias, array $criteria)
    {
        $map = $this->getCriteriaMap();

        foreach ($criteria as $property => $value) {
            if (array_key_exists($property, $map)) {
                call_user_func_array($map[$property], [$builder, $alias, $property, $value]);
            } else {
                $this->applyDefaultCriterion($builder, $alias, $property, $value);
            }
        }
    }

    protected function getCriteriaMap()
    {
        return [];
    }

    protected function applyDefaultCriterion($builder, $alias, $property, $value)
    {
        if (null === $value) {
            $builder->andWhere($alias.'.'.$property.' IS NULL');
        } else {
            $parameter = 'p_' . uniqid();
            $builder->andWhere($alias.'.'.$property.' = :'.$parameter);
            $builder->setParameter($parameter, $value);
        }
    }

    /**
     * Apply order by
     *
     * @param  QueryBuilder $builder
     * @param  string       $alias
     * @param  array|null   $orderBy
     * @return void
     */
    protected function applyOrderBy(QueryBuilder $builder, $alias, array $orderBy = null)
    {
        if (empty($orderBy)) {
            $orderBy = $this->getDefaultOrder();
        }

        $map = $this->getOrderingMap();

        foreach ($orderBy as $property => $direction) {
            if (array_key_exists($property, $map)) {
                call_user_func_array($map[$property], [$builder, $alias, $property, $direction]);
            } else {
                $this->applyDefaultOrder($builder, $alias, $property, $direction);
            }
        }
    }

    protected function getDefaultOrder()
    {
        return [];
    }

    protected function getOrderingMap()
    {
        return [];
    }

    protected function applyDefaultOrder(QueryBuilder $builder, $alias, $property, $direction)
    {
        $builder->orderBy($alias.'.'.$property, $direction);
    }

    protected function applyLimit(QueryBuilder $builder, $limit = null)
    {
        if ($limit) {
            $builder->setMaxResults($limit);
        }
    }

    protected function applyOffset(QueryBuilder $builder, $offset = null)
    {
        if ($offset) {
            $builder->setFirstResult($offset);
        }
    }
}

我想我通过服务访问了这个:

services:

# Factories

milestones.factory.milestone:
    alias: milestones.repository.milestone
    arguments: [ MilestonesBundle\Entity\Milestone ]

# Repositories

milestones.repository.milestone:
    class: MilestonesBundle\Entity\Repository\MilestoneRepository
    factory_service: doctrine.orm.default_entity_manager
    factory_method: getRepository
    arguments: [ MilestonesBundle\Entity\Milestone ]

2 个答案:

答案 0 :(得分:3)

替换此代码:

milestones.repository.milestone:
    class: MilestonesBundle\Entity\Repository\MilestoneRepository
    factory_service: doctrine.orm.default_entity_manager
    factory_method: getRepository
    arguments: [ MilestonesBundle\Entity\Milestone ]

这一个:

milestones.repository.milestone:
     class: MilestonesBundle\Entity\Repository\MilestoneRepository
     factory: ['@doctrine.orm.entity_manager', getRepository]
     arguments: [ MilestonesBundle\Entity\Milestone ]

工厂方法 - getRepository

答案 1 :(得分:0)

我认为在jour代码中的某个地方会调用此方法:

    public function create()
    {
        $class = $this->getClassName();

        return new $class;
    }

这是调用Doctrine\ORM\EntityRepository的构造函数:

        public function __construct(EntityManagerInterface $em, Mapping\ClassMetadata $class)
{
    $this->_entityName = $class->name;
    $this->_em         = $em;
    $this->_class      = $class;
}

因此,如果你想使用你的create方法,你必须注入参数......我认为它应该像new $class($entityManager, Entity::class)