首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 3.3.2规则EntityRepository构造函数参数

Symfony 3.3.2规则EntityRepository构造函数参数
EN

Stack Overflow用户
提问于 2017-07-05 22:58:26
回答 2查看 4.2K关注 0票数 2

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

在多次修复错误之后,我被困在一个点上:我的构造函数的EntityRepository.php文件中有一个错误。

代码语言:javascript
复制
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和Symfony 3之间修复一些东西才能让consructor工作吗?

非常感谢。

这是我的MilestoneRepository.php文件:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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);
        }
    }
}

我想我是通过一个服务来访问的,如下所示:

代码语言:javascript
复制
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 ]
EN

回答 2

Stack Overflow用户

发布于 2017-07-06 02:07:11

替换此代码:

代码语言:javascript
复制
milestones.repository.milestone:
    class: MilestonesBundle\Entity\Repository\MilestoneRepository
    factory_service: doctrine.orm.default_entity_manager
    factory_method: getRepository
    arguments: [ MilestonesBundle\Entity\Milestone ]

使用这一条:

代码语言:javascript
复制
milestones.repository.milestone:
     class: MilestonesBundle\Entity\Repository\MilestoneRepository
     factory: ['@doctrine.orm.entity_manager', getRepository]
     arguments: [ MilestonesBundle\Entity\Milestone ]

工厂方法- getRepository

票数 3
EN

Stack Overflow用户

发布于 2017-07-06 01:02:49

我想在jour代码中的某个地方这个方法叫做:

代码语言:javascript
复制
    public function create()
    {
        $class = $this->getClassName();

        return new $class;
    }

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

代码语言:javascript
复制
        public function __construct(EntityManagerInterface $em, Mapping\ClassMetadata $class)
{
    $this->_entityName = $class->name;
    $this->_em         = $em;
    $this->_class      = $class;
}

因此,如果要使用create方法,则必须注入参数...我认为应该是像new $class($entityManager, Entity::class)这样的东西

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44929752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档