2015-03-16 3 views
1

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

$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 и $ пользователей массивы имеют весь массив переписаны на вызов метода findEntity. Кажется, что на каждой итерации полный массив заменяется на последний объект. Затем на второй итерации индекс 0 массива $ produtos не имеет того же значения, что и в первой итерации ...

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

+0

Кто-нибудь, пожалуйста? :( – user3753202

ответ

0

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

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

В конце концов, это вопрос больше о клоне, чем о ZF2 увлажняющие и массивов.

1

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

заменить

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

с

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

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

Удачи.

+0

спасибо за ваш ответ, но проблема продолжается ... – user3753202

+0

Вы положили 'clone $ this-> entity' для этой строки тоже' return $ this-> hydrator-> hydrate ($ result-> current(), $ this-> entity); '? – Roshni

+0

вам нужно положить' clone' для '$ this-> entity' – Roshni

Смежные вопросы