Ошибка репозитория объектов Symfony-2.3

Обычно я работаю с symfony версии 2.1 или 2.2. Сегодня я начал новый проект на 2.3, и у меня возникли проблемы с созданием собственного репозитория сущностей.

Моя сущность:

  <?php

    namespace Acme\MyBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;

    /**
     * AnnualProduction
     *
     * @ORM\Table(name="Annual_Production")
     * @ORM\Entity(repositoryClass="Acme\MyBundle\Entity\AnnualproductionRepository")
     */
    class AnnualProduction
    {
        /**
         * @var string
         *
         * @ORM\Column(name="device_address", type="string", length=45, nullable=true)
         */
        private $deviceAddress;

        /**
         * @var integer
         *
         * @ORM\Column(name="mese_1", type="integer", nullable=true)
         */
        private $mese1;

        /**
         * @var integer
         *
         * @ORM\Column(name="mese_2", type="integer", nullable=true)
         */

SOME MISSING VAR SET AND GET


         /**
         * @var string
         *
         * @ORM\Column(name="sens_id", type="string", length=45)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         */
        private $sensId;

        /**
         * @var \DateTime
         *
         * @ORM\Column(name="AAAA", type="date")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         */
        private $aaaa;

    /**
         * Set deviceAddress
         *
         * @param string $deviceAddress
         * @return AnnualProduction
         */
        public function setDeviceAddress($deviceAddress)
        {
            $this->deviceAddress = $deviceAddress;

            return $this;
        }

        /**
         * Get deviceAddress
         *
         * @return string 
         */
        public function getDeviceAddress()
        {
            return $this->deviceAddress;
        }

        /**
         * Set mese1
         *
         * @param integer $mese1
         * @return AnnualProduction
         */
        public function setMese1($mese1)
        {
            $this->mese1 = $mese1;

            return $this;
        }

        /**
         * Get mese1
         *
         * @return integer 
         */
        public function getMese1()
        {
            return $this->mese1;
        }
      /**
         * Set sensId
         *
         * @param string $sensId
         * @return AnnualProduction
         */
        public function setSensId($sensId)
        {
            $this->sensId = $sensId;

            return $this;
        }

        /**
         * Get sensId
         *
         * @return string 
         */
        public function getSensId()
        {
            return $this->sensId;
        }

        /**
         * Set aaaa
         *
         * @param \DateTime $aaaa
         * @return AnnualProduction
         */
        public function setAaaa($aaaa)
        {
            $this->aaaa = $aaaa;

            return $this;
        }

        /**
         * Get aaaa
         *
         * @return \DateTime 
         */
        public function getAaaa()
        {
            return $this->aaaa;
        }
    }

Я не пишу все переменные, а получаю и устанавливаю функции. Я создал файл репозитория: Acme \ MyBundle \ Entity \ AnnualproductionRepository.php

Код для файла репозитория следующий:

<?php


namespace Acme\MyBundle\Entity;


use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\NoResultException;
use Acme\MyBundle\Entity\AnnualProduction;

class AnnualproductionRepository extends EntityRepository
{

    public function findByYearMonthDay($anno, $mese, $giorno, $sensId)
    {
        $query = $this->getEntityManager()
        ->createQuery(" SOME QUERY HERE")->setParameters(array(SOME PARAMETERS                                                                    HERE));
        return $query->getSingleResult();
    }
}

Я вызываю репозиторий в одном из своих контроллеров со следующим кодом:

<?php

namespace Acme\MyBundle\Controller;


use Acme\MyBundle\Entity\AnnualProduction;
use Acme\MyBundle\Entity;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\Constraints\Date;



class DataController extends Controller{

    public function indexUserAction(){

*
*
*
*
*
   $DailyProduction=$DailyProduction+$em->getRepository('AcmeMyBundle:AnnualProduction')->findByYearMonthDay($year, $month, $day, $productionSensor);
*
*
*
*
   }
}

Но я получаю эту ошибку, как будто репозиторий не существует, а контроллер получает имя функции, например findBy * по умолчанию для одного из атрибутов Entity.

ОШИБКА: *> У объекта "Acme \ MyBundle \ Entity \ AnnualProduction" нет поля.

'год месяц день'. Следовательно, вы не можете вызывать findByYearMonthDay в репозитории сущностей ***

Вы что-нибудь посоветуете решить эту проблему? код кажется идентичным тому, который я обычно добавляю для включения репозитория пользовательских сущностей в symfony 2.2, но по какой-то причине он отказывается работать. Tx за ваше время и помощь.


person groot    schedule 14.10.2013    source источник


Ответы (2)


Проблема решена. Дело в том, что файлы entity.orm.xml, хранящиеся в / src / acme / myBundle / config / doctrine, имеют более высокий приоритет над файлами сущностей, поэтому каждая модификация сущности, которую я делал, не читалась.

РЕШЕНИЕ: Удалите все файлы entity.orm.xml после того, как аннотация создала создание объекта с помощью команды терминала php.

person groot    schedule 16.10.2013

Неверное пространство имен для вашего репозитория. Вместо этого у вас должен быть Acme \ MyBundle \ Entity \ Repository для пространства имен. В таком случае путь к вашему файлу должен быть Acme / MyBundle / Entity / Repository / AnnualProduction.

Вы также должны позволить доктрине генерировать все ваши сущности для вас через

 php app/console doctrine:generate:entities Acme

Затем вы увидите папку Repositories в папке Entities, в которой должны храниться все объекты.

person Dr.Knowitall    schedule 15.10.2013
comment
tx за ваш ответ. Я изменил пространства имен в аннотации объекта FROM: @ORM \ Entity (repositoryClass = Acme \ MyBundle \ Entity \ AnnualConsumingRepository) TO: @ORM \ Entity (repositoryClass = Acme \ MyBundle \ Entity \ Repository \ AnnualConsvention) Затем я использую команда: php app / console doctrine: generate: entity Acme, но он сгенерировал мне только объекты, не созданную папку репозитория и не созданный файл репозитория. Я что-то не так делаю? - person groot; 15.10.2013
comment
Я нашел ответ на тот факт, что объект / репозиторий не создается автоматически в этом сообщении: stackoverflow.com/questions/14115143/ У меня есть факты, чтобы сгенерировать папку и файлы, которые я делал сам. В этом случае нет никакой разницы между моей первоначальной конфигурацией и вашим предложением. Я пробовал ваше пространство имен с помощью объекта / репозитория forlder и файлов, созданных вручную, но проблема осталась прежней. - person groot; 15.10.2013