Почему Doctrine накладывает искусственные ограничения на имена методов репозитория?

Может кто-нибудь объяснить мне, почему Doctrine требует, чтобы имена методов репозитория начинались с findBy, findOneBy или countBy и почему даже имена с такими префиксами должны заканчиваться именем столбца?

Существуют допустимые варианты использования, когда полезно, например, подсчитать количество записей, содержащих несколько совпадающих столбцов.

// src/Repository/FreeClassQueryRepository.php
class FreeClassQueryRepository extends ServiceEntityRepository
{
  .
  .
  .
  /**
   * Returns true if one or more free class query records match the supplied
   * FreeClassQuery object.
   *
   * @param   FreeClassQuery $query
   * @return  bool
   * @throws  \Doctrine\ORM\NonUniqueResultException
   */
  public function checkForDuplicate( FreeClassQuery $query )
  {
    $q = $this->createQueryBuilder( 'fcq' )
              ->select( 'COUNT(id)' )
              ->andWhere( 'fcq.name = :name' )
              ->setParameter( 'name', $query->getName())
              ->andWhere( 'fcq.email = :email' )
              ->setParameter( 'email', $query->getEmail())
              ->andWhere( 'fcq.street = :street' )
              ->setParameter( 'street', $query->getStreet())
              ->andWhere( 'fcq.city = :city' )
              ->setParameter( 'city', $query->getCity())
              ->andWhere( 'fcq.state = :state' )
              ->setParameter( 'state', $query->getState());
    return $q->getQuery()->getSingleScalarResult();

  }
  .
  .
  .
}

Вызов этого метода приводит к этой ошибке:

[ОШИБКА] приложение: ошибка отладки (прототипирование...) Неопределенный метод "checkForDuplicate". Имя метода должно начинаться с findBy, findOneBy или countBy!


person David Patterson    schedule 03.07.2019    source источник
comment
Не могли бы вы процитировать что-нибудь или поделиться кодом? У меня есть функции в репозиториях Doctrine, которые не начинаются с find или count.   -  person ficuscr    schedule 03.07.2019
comment
@ficusr, конечно. Пожалуйста, смотрите редактирование моего исходного поста. Спасибо.   -  person David Patterson    schedule 03.07.2019
comment
OK. Так что это похоже на волшебный соус. Исключение возникает в __call - при вызове конкретного метода класса этого не должно происходить. Таким образом, это больше связано с тем, как он вызывается. Как вы используете checkForDupelicate?   -  person ficuscr    schedule 03.07.2019
comment


Ответы (1)


Это происходило из-за того, что в аннотации @ORM\Entity в классе сущностей отсутствовал атрибут репозиторияClass="App\Repository\FreeClassQueryRepository".

Спасибо @ficuscr за ссылку на аналогичный вопрос StackOverflow (см. его третий комментарий).

person David Patterson    schedule 04.07.2019