@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 просмотров
Пригласить эксперта
Ответы на вопрос 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 и решили, что и сюда нужно притащить такой же подход. Это неправильно. Здесь для получения данных вам нужно пользоваться репозиториями.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы