Модели CodeIgniter и Doctrine - PullRequest
       27

Модели CodeIgniter и Doctrine

2 голосов
/ 28 августа 2011

У меня проблемы с пониманием некоторых базовых стратегий с использованием доктрины 2 в разработке codeIgniter 2.

Справочная информация: CI работает с доктриной, я могу получать объекты из базы данных и сохранять их.1004 * Пример: у меня есть несколько контроллеров, где я хотел бы перечислить последние статьи.В моем чистом CI-приложении у меня был бы метод getLatest в моей модели.Затем я вызывал бы это во всех моих контроллерах, загружая правильный вид и т. Д.

Но теперь у меня есть модели доктрины, и я не уверен, как это сделать.Я просто не могу добавить тот же метод к моей модели.То, что я сделал, переместил эту логику getLatest в контроллер, и это выглядит неправильно.Теперь мне нужно будет вызывать другие контролеры из моих действий, чтобы получить эти последние статьи.Или мне действительно нужно дублировать этот код на каждом контроллере, где он мне нужен?


Я все еще борюсь с этим.Мои модели CI и сущности доктрины имеют одинаковые имена и находятся в одной папке «application / models /».Это вместе вызывает несколько проблем.Я пытаюсь изменить этот путь, но не могу заставить его работать.Я использовал этот библиотечный класс для загрузки доктрины: http://wildlyinaccurate.com/integrating-doctrine-2-with-codeigniter-2/ Любые советы?

Ответы [ 3 ]

2 голосов
/ 23 мая 2012

Ваша getLatest функциональность принадлежит модели, а не контроллеру. Каждая из ваших моделей Doctrine 2 имеет свой собственный репозиторий, который вы можете получить с помощью $em->getRepository('Your\Model'). В репозитории по умолчанию ( \ Doctrine \ ORM \ EntityRepository ) есть несколько методов, которые могут быть вам полезны:

$repository = $em->getRepository('Your\Model');

$all_entities = $repository->findAll();

$some_entities = $repository->findBy(array(
    'some_column' => 'some_condition'
), $order_by, $limit, $offset);

Если встроенный репозиторий Doctrine не делает то, что вам нужно, вы можете создать свой собственный репозиторий для любой из ваших моделей:

class YourRepository extends EntityRepository
{

    public function getLatest()
    {
        // Your getLatest logic here
        return $this->_em->createQuery('SELECT m FROM Your\Model LIMIT 10');
    }

}
1 голос
/ 15 апреля 2015

Вместо того, чтобы иметь «Модель», вы можете обернуть компоненты Doctrine в Сервис и сделать ваш контроллер максимально простым. При использовании инфраструктуры MVC важно или нет, важно следовать SOLID, особенно принципу единой ответственности (SRP).

Рассмотрим следующий упрощенный пример:

class UserService extends AbstractService 
{

   private $em;

   private $repository;

   public function __construct(EntityManager $em, UserRepository $repository) 
   {
      $this->em = $em;
      $this->repository = $repository;    
   }

   public function create($data) 
   {
       // business logic here
       $user = new User();
       $user->setUsername($data['username']); 
       $user->setEmail($data['email']);

       $em->persist($this->user);
       $em->flush();
   }

   public function getLatest() 
   {
       // additional business logic could be implemented
       return $this->repository->getLatest();
   }
} 

Тогда я могу позвонить в сервис из контроллера или из любого другого сервиса:

class UserController extends Controller 
{
     /** 
      * @var UserService $service 
      */
    private $service;

    public function __construct(UserService $service) 
    {
        $this->service = $service;
    }

    public function create() 
    {
        // some form validation here
        $data = $this->input->post('user');
        $result = $this->service->create($data);

        // do something with the result
    }
}
0 голосов
/ 29 августа 2011

Нет, вы не должны ни дублировать, ни переносить этот код на контроллеры.Лично я не пробовал этого, но я думаю, что сущности доктрины и модели КИ абсолютно независимы.Вы можете представить некоторые модели CI, которые включают этот метод getLatest, но в действительности работают с сущностями Doctrine.

Так что вы просто будете использовать сущности Doctrine и модели CI как обычно.Но не забудьте загрузить библиотеку doctrine (если вы загрузились, как сказано в Руководстве по Doctrine ) в модели, которые используют сущности Doctrine.

...