Задать вопрос
@suzyry

Как написать нужные методы для работы с базой данных?

Доброго времени суток.

Недавно начал изучать замечательный фреймворк symfony, версии 2.8.

Столкнулся с проблемой. У меня есть типичный контроллер с action show:
(Тут я беру из БД запись с определённым логином)

/...
use AppBundle\Entity\People;

class DefaultController extends Controller {
    public function showAction($login)
    {
        $em = $this->getDoctrine()->getManager();
        $human = $em->getRepository("AppBundle:People")->findOneBy(["login" => $login]);
    }
}


Вопрос: Как бы можно было сократить подобные операции (по работе с базой данных) до определённых методов.

К примеру:

$human = People::getByLogin($login);

Имеется класс в AppBundle/Entity/People, который наследует EntityRepository.

/...
class People extends EntityRepository
{
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    public $id;

    /**
    * @ORM\Column(type="string")
    */
    public $login;

    public static function getByLogin($login) {
        $human = //???
        return $human;
    }
}


Большое спасибо за внимание!
  • Вопрос задан
  • 210 просмотров
Подписаться 1 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
lexxpavlov
@lexxpavlov
Программист, преподаватель
Сам класс People не должен наследоваться от EntityRepository. Репозиторий - это отдельный класс, в который и следует создать такой метод, это хорошая практика.
А дальше лучше сделать сервис, который будет использовать созданный репозиторий, и в контроллере остается
class DefaultController extends Controller {
    public function showAction($login)
    {
        $human = $this->get("PeopleService")->getByLogin($login);
    }
}
Ответ написан
Комментировать
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Вы, видимо, абсолютно не понимаете суть Data Mapper, который используется в Doctrine. Сущности не должны знать вообще ничего о базе данных. Вы где-то увидели работу с Active Record и решили, что и сюда нужно притащить такой же подход. Это неправильно. Здесь для получения данных вам нужно пользоваться репозиториями.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы