Сериализованные прокси классы Doctrine 2 - PullRequest
1 голос
/ 02 сентября 2011

Есть ли возможность получить «полный» объект с ассоциациями вместо прокси-классов в доктрине 2?

Поскольку я сериализую сущность (и отношения), но при десериализации я просто получаю прокси-класс.

Запрос, который я делаю:

public function getSnippet($id)
    {
        return $this->getEntityManager()->getRepository('GvnSnippetryBundle:Snippet')->findOneBy(array('id' => $id));
    }

Ответы [ 2 ]

2 голосов
/ 03 сентября 2011

Ответ J0HN хороший.

Если вы хотите быть более сфокусированным, вы можете заставить Doctrine извлекать присоединяемые объекты, создавая пользовательский запрос (либо непосредственно в DQL, либо с помощью QueryBuilder). Чтобы принудительно загрузить ассоциацию, вам нужно:

1) Присоединиться к ассоциированному лицу 2) Ссылка на эту сущность в SELECT

Итак, в DQL:

SELECT f 
FROM Foo f
JOIN f.Bar b

Это будет не загружать связанный Bar, так как он не указан в SELECT - вместо этого вы получите прокси, а

SELECT f, b
FROM Foo f
JOIN f.Bar b

заставит доктрину выбраться из ваших баров.

НТН

1 голос
/ 02 сентября 2011

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

В качестве обходного пути попробуйте получить доступ к связанным объектам перед сериализацией. Например. если вы следовали совету инкапсулировать коллекцию связанных объектов (и вы действительно должны следовать ей), вы просто получаете к нему доступ с помощью $snippet->howDidYouCallFunctionThatReturnCollection(). Doctrine перехватывает запрос на Collection, проверяет, что он заполнен прокси, и загружает его автоматически. Итак, это должно быть что-то вроде:

class Snippet{
     //other declarations
    /** OneToMany(targetEntity='Blah', ...)*/
    protected $associations;

    public function getAssociations(){
        return $this->associations; //fills proxies with real data here
    }
}

public function getSnippet($id)
{
    $snippet = $this->getEntityManager()->getRepository('GvnSnippetryBundle:Snippet')->findOneBy(array('id' => $id));
    $snippet->getAssociations(); //gets only one association
    $snippet->getAssociations2(); //and so on
    return $snippet;
}

Обратите внимание, что это ни в коем случае не полный пример кода, но я предполагаю, что вы знаете, как отобразить ассоциации. В любом случае, просмотрите Работа с объектами и Сопоставление связей глав для более подробного описания и примеров кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...