2011-11-19 2 views
3

Я слышал много хорошего о ORM Doctrine. Я могу приложить много усилий, изучая Доктрину, используя отличный учебник, например http://www.phpandstuff.com/articles/codeigniter-doctrine-from-scratch-day-1-install-and-setup, но он довольно устарел и использует Doctrine 1.x. Я предпочитаю сначала изучать Doctrine 2.x, чтобы сэкономить время.Doctrine 2.x CRUD

Мне удалось установить Doctrine 2.1 в сочетании с Codeigniter 2.0.3. Мне уже удалось выполнить некоторые основные операции, такие как добавление новых объектов и сохранение их в базе данных. Теперь я пытаюсь сделать что-то, что не должно быть слишком сложно, но я потратил довольно много времени, чтобы узнать, как сделать следующее:

В случае, если я хочу создать объект, используя данные $ _POST, Не хотите назначать каждое свойство отдельно в коде. Я бы предпочел что-то вроде $ u-> fromArray, например. как показано в

$data = array(
'username' => 'myuser', 
'password' => 'mypass', 
'email' => '[email protected]' 
); 

$u = new User(); 
$u->fromArray($data); 
$u->save(); 

Источник: http://www.phpandstuff.com/articles/codeigniter-doctrine-day-5-database-crud

Однако fromArray() не существует в доктрине 2.x больше. Есть ли эквивалент forArray() в Doctrine 2.x?

Второй вопрос: мне очень сложно начать работу. В официальных документах основное внимание уделяется доктрине. Было бы очень приятно иметь практический пример, который включает в себя такие вещи, как валидация формы, операции с crud и т. Д. Было бы очень приятно иметь проект примера MVC с использованием Doctrine 2. Кто-нибудь знает о таком проекте или примере проекта?

ответ

0

В каждом примере, который я видел и по моему опыту кодирования с помощью Doctrine2, правильный способ создания объекта из данных $ _POST состоит в том, чтобы установить каждое свойство индивидуально, используя сеттеры в классах сущностей.

fromArray(), конечно, кажется удобным, но зная, как Doctrine2 управляет ассоциациями, я не мог видеть, как это заставляет вас очень далеко.

Что касается хорошего учебника CRUD для Doctrine2, вам может понравиться это sample chapter из книги «Простые веб-сайты PHP с Zend Framework». Сама книга относится к ZF, а не к CodeIgniter, но в главе примера очень мало. Вы, скорее всего, предпочтете держаться подальше от хранилища образцов z2d2.

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

1

Ответ на самом деле, что это зависит от вас. Ваши объекты - это просто старые PHP-объекты, поэтому вам нужно научить их трюкам (например, реализовать метод fromArray()) или создать вокруг них инфраструктуру.

Некоторые опции, которые могут быть или не быть подходящими для вашего сценария использования:

  • Запись конструкторов для ваших объектов, которые населяют свойства: new Article($title, $author, $abstract, $body) или new Article($arrayOrObject)
  • Написать статический фабричный метод
  • Написать свой own fromArray() реализация
  • Напишите свою собственную реализацию fromArray() в абстрактном классе, что все ваши объекты наследуют и, возможно, переопределяют по мере необходимости
0

Вы можете преобразовать массив в объект, используя некоторые сторонние модули Doctrine, такие как DoctrineModule, вместо реализации fromArray() или populate(). Например, вы можете сделать что-то вроде:

use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 

$hydrator = new DoctrineHydrator($objectManager); 

$data = array(
    'username' => 'myuser', 
    'password' => 'mypass', 
    'email' => '[email protected]' 
); 

$user = new User(); 
$user = $hydrator->hydrate($data, $user); 

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