Сопоставить массив с сущностью в Symfony2 / Doctrine2 - PullRequest
7 голосов
/ 10 декабря 2011

Я использую пакет DoctrineFixtures для создания примеров сущностей во время разработки.В моем методе load () приборов ORM я определяю данные как ассоциативные массивы и создаю объектный объект в цикле.

<?php
// ...
public function load($manager) {
    $roleDefs = array(
        'role-1' => array(
             'role' => 'administrator'
        ),
        'role-2' => array(
             'role' => 'user'
        ),
    );

    foreach($roleDefs as $key => $roleDef) {
        $role = new Role();
        $role->setRole($roleDef['role']);
        $manager->persist($role);

        $this->addReference($key, $role);
    }

    $manager->flush();
}

Я всегда использую одну и ту же схему массива.Каждый элемент массива использует имя свойства (в подчеркивании) объекта в качестве индекса.Если структура сущностей становится более сложной, существует много $entity->setMyProperty($def['my_property']); строк.

Я думаю, что проблема сопоставления имен свойств с методами сеттера является очень распространенной проблемой в Symfony и Doctrine, поскольку этот тип сопоставления найденво многих ситуациях (например, отображение форм на сущности).

Теперь мне интересно, есть ли встроенный метод, который можно использовать для отображения.Было бы неплохо иметь такое решение, как

foreach($defs as $key => $def) {
   $entity = $magicMapper->getEntity('MyBundle:MyEntity', $def);
   // ...
}

Кто-нибудь знает, как этого можно достичь?

Большое спасибо, Hacksteak

1 Ответ

14 голосов
/ 10 декабря 2011

Я иногда использую петли при создании светильников. Я не уверен, что это решение соответствует вашим требованиям, но я считаю, что наиболее гибкий способ создания осветительных приборов и быстрого добавления новых свойств с течением времени, если вам нужно, - это сделать следующее ... Предполагая создание группы сообщений в блоге. :

// an array of blog post fixture values
$posts = array(
    array(
        'title' => 'Foo',
        'text'  => 'lorem'
        'date'  => new \DateTime('2011-12-01'),
    ),
    array(
        'title' => 'Bar',
        'text'  => 'lorem'
        'date'  => new \DateTime('2011-12-02'),
    ),
    // more data...
);

// loop over the posts
foreach ($posts as $post) {
    // new entity
    $post = new Post();

    // now loop over the properties of each post array...
    foreach ($post as $property => $value) {
        // create a setter
        $method = sprintf('set%s', ucwords($property)); // or you can cheat and omit ucwords() because PHP method calls are case insensitive
        // use the method as a variable variable to set your value
        $post->$method($value);
    }

    // persist the entity
    $em->persist($post);
}

Таким образом, вы можете добавить больше свойств, просто добавив новые значения в ваш массив.

...