Учение Symfony2s: generate: сущности не генерируют классы репо - программирование
Подтвердить что ты не робот

Учение Symfony2s: generate: сущности не генерируют классы репо

Я иду с Symfony2 docs. Он сказал, что добавление

/**
 * @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository")
 */

в моем файле сущности, а запуск php app/console doctrine:generate:entities Acme должен создать файл ProductRepository. Это не так. Я не могу объяснить это больше, он просто не создает этот файл, просто воссоздает те файлы сущностей, которые были там раньше.

4b9b3361

Ответ 1

У меня такая же проблема

Но я нашел ответ здесь: http://brentertainment.com/other/docs/book/doctrine/orm.html

Если вы уже создали класс сущности перед добавлением сопоставления repositoryClass, вам необходимо создать класс самостоятельно. К счастью, это довольно легко. Просто создайте класс в каталоге репозитория вашего пакета и убедитесь, что он расширяет Doctrine\ORM\EntityRepository. Когда вы создадите класс, вы можете добавить любой метод для запроса своих объектов.

Простой, мы должны сделать это вручную, потому что мы уже запускаем этот раз

Ответ 2

Вы можете попробовать указать конкретный пакет:

php app/console doctrine:generate:entities AcmeStoreBundle

Обратите внимание, что у меня есть полное имя пакета.

Это должно помочь, даже если вы запустили doctrine:generate:entities раньше.

Ответ 3

Если вы используете файлы orm.yml для генерации ваших сущностей, вы можете определить repositoryClass, а затем снова сгенерировать сущности:

Acme\StoreBundle\Entity\Product:
type: entity
table: product
...
repositoryClass: Acme\StoreBundle\Entity\ProductRepository
...

И затем запустите:

php app/console doctrine:generate:entities AcmeStoreBundle

Ответ 4

Самое простое решение для этого:

Создайте объект, если вы еще этого не сделали:

php app/console doctrine:generate:entity --entity="AppBundle:EntityName" --fields="id:string(255) content:text(100)"

Теперь измените эти строки комментариев на ранее созданный объект:

* @ORM\Table(name="TABLENAME")
* @ORM\Entity(repositoryClass="AppBundle\Entity\EntityNameRepository")

Теперь просто запустите:

php app/console doctrine:generate:entities AppBundle:EntityNameRepository

Теперь у вас есть сущность и репозиторий.:)

Ответ 5

Чтобы избавиться от этой проблемы и создать классы репо, вы можете временно изменить конец следующего файла: Symfony\поставщика\доктрина\доктрина-расслоение\Doctrine\Bundle\DoctrineBundle\Command\generateEntitiesDoctrineCommand.php

if ($m->customRepositoryClassName 
   && false !== strpos($m->customRepositoryClassName, $metadata->getNamespace())) {
     $repoGenerator->writeEntityRepositoryClass(
        $m->customRepositoryClassName, $metadata->getPath());
}

со следующим кодом:

if (true) { 
   $output->writeln(
     sprintf('  > AND Repository <comment>%s</comment>', $m->name . "Repository")
   );           
   $repoGenerator->writeEntityRepositoryClass(
     $m->name . "Repository", $metadata->getPath());
} 

Некоторые объяснения: в этом коде

  • условие if упрощено с помощью "if (true)" (и может быть, наконец, полностью отключено, если вы хотите)
  • $m- > customRepositoryClassName заменяется на $m- > name. "Репозиторий"
  • Я добавил некоторый вывод, чтобы быть хорошо информированным (в окне терминала) при создании файлов репо.

Если вы не используете условие "if (true)" и хотите самим проверить вещи, вы также можете добавить факультативный другой случай с выходом для получения информации в будущем:

   else {
       $output->writeln(sprintf('  > NO repository generated for this class'));
    }

После внесения изменений вы можете повторно запустить команду, как обычно:

php app/console doctrine:generate:entities AcmeStoreBundle

Это временный код, потому что проблема до сих пор не очень ясна для меня, единственное, что я вижу, - это то, что , похоже, исходит из $m- > customRepositoryClassName, который возвращает пустую строку, Итак, чтобы найти другое и окончательное решение, можно было бы проверить метод customRepositoryClassName объекта метаданных...

Ответ 6

в ответе Astucieux:

if (true) { 
    $fullRepositoryClassName = $name . "\\Repository\\" . $basename . "Repository";
    $output->writeln(
        sprintf('  > AND Repository <comment>%s</comment>', $fullRepositoryClassName)
    );           
    $repoGenerator->writeEntityRepositoryClass(
        $fullRepositoryClassName, $metadata->getPath());
}