ZF2 гидраторы и массивы

У меня проблема с ArraySerializable гидратор и массивы. У меня есть этот код:

$users = array();
$produtos = array();
$ros = $this->roService->findAllEntities();
foreach ($ros as $ro) {
$users[] = $this->usuarioService->findEntity($ro->attributes['idUsuario']->attribute);
$produtos[] = $this->produtoService->findEntity($ro->attributes['idProduto']->attribute);
var_dump($produtos[0]->attributes);
}

Вот вывод var_dump ($ Produtos [0] -> атрибуты) на две итерации:

array (size=3)
'id' =>
object(Application\Model\Attribute\Id)[307]
protected 'name' => string 'id' (length=2)
protected 'attribute' => string '2' (length=1)
protected 'validators' =>
array (size=0)
empty
'dataHoraCadastro' =>
object(Application\Model\Attribute\DataHoraCadastro)[308]
protected 'name' => string 'dataHoraCadastro' (length=16)
protected 'attribute' => string '2015-03-07 14:03:37' (length=19)
protected 'validators' =>
array (size=0)
empty
'nome' =>
object(Application\Model\Attribute\Nome)[309]
protected 'name' => string 'nome' (length=4)
protected 'validators' =>
array (size=1)
0 =>
object(Application\Validator\StringLengthValidator)[310]
...
protected 'minimoCaracteres' => int 3
protected 'maximoCaracteres' => int 70
protected 'attribute' => string 'Produto 1' (length=4)

array (size=3)
'id' =>
object(Application\Model\Attribute\Id)[307]
protected 'name' => string 'id' (length=2)
protected 'attribute' => string '4' (length=1)
protected 'validators' =>
array (size=0)
empty
'dataHoraCadastro' =>
object(Application\Model\Attribute\DataHoraCadastro)[308]
protected 'name' => string 'dataHoraCadastro' (length=16)
protected 'attribute' => string '2015-03-07 14:03:37' (length=19)
protected 'validators' =>
array (size=0)
empty
'nome' =>
object(Application\Model\Attribute\Nome)[309]
protected 'name' => string 'nome' (length=4)
protected 'validators' =>
array (size=1)
0 =>
object(Application\Validator\StringLengthValidator)[310]
...
protected 'minimoCaracteres' => int 3
protected 'maximoCaracteres' => int 70
protected 'attribute' => string 'Produto 2' (length=9)

$users, $produtos а также $ros являются массивами сущностей. Код findEntity а также findAllEntities методы:

/**
* @inheritDoc
*/
public function findEntity($id) {
$result = $this->executeFindSql($id);

if ($result instanceof ResultInterface && $result->isQueryResult()) {
return $this->hydrator->hydrate($result->current(), $this->entity);
}
}

/**
* @inheritDoc
*/
public function findAllEntities() {
$result = $this->executeFindSql();

if ($result instanceof ResultInterface && $result->isQueryResult()) {
$resultSet = new HydratingResultSet($this->hydrator, $this->entity);

return $resultSet->initialize($result);
}

return array();
}

Проблема в том, что массивы $ produtos и $ users перезаписывают весь массив при вызове метода findEntity. Кажется, что на каждой итерации полный массив заменяется последней сущностью. Затем во второй итерации индекс 0 массива $ produtos не будет иметь того же значения, что и в первой итерации …

К концу цикла у каждого элемента в массиве есть последний объект … очень странно. Заранее спасибо 🙂

1

Решение

Была такая же проблема. Я предполагаю, что вы основали этот код на учебнике, как я сделал. Ну, проблема в учебнике.

замещать

$resultSet = new HydratingResultSet($this->hydrator, $this->entity);

с

$resultSet = new HydratingResultSet($this->hydrator, clone $this->entity);

Это сделало это для меня.

Удачи.

1

Другие решения

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

public function __clone() {
foreach ($this->attributes as &$attribute) {
$attribute = clone $attribute;
}
... clone of another variables that are objects
}

В конце концов, это вопрос больше о клоне, чем о гидраторах и массивах zf2.

0