Zend Framework 2 - Hydrator-Strategie für Lehre Beziehung nicht funktioniert

Wie bereits erwähnt hier ich Baue eine custom Hydratation Strategie für den Umgang mit meinen verwandten Objekten in einem select-Feld in ein Formular.

Meine form sieht wie folgt aus:

$builder = new AnnotationBuilder($entityManager);
$form    = $builder->createForm(new MyEntity());
$form->add(new MyFieldSet());

$hydrator = new ClassMethodsHydrator();
$hydrator->addStrategy('my_attribute', new MyHydrationStrategy());
$form->setHydrator($hydrator);

$form->get('my_attribute')->setValueOptions(
      $entityManager->getRepository('SecEntity\Entity\SecEntity')->fetchAllAsArray()
);

, Wenn ich einen neuen MyEntity über die addAction funktioniert alles Super.

Schrieb ich fetchAllAsArray() zu füllen meine selectbox. Es lebt in meinem SecEntityRepository:

public function fetchAllAsArray() {

    $objects = $this->createQueryBuilder('s')
        ->add('select', 's.id, s.name')
        ->add('orderBy', 's.name ASC')
        ->getQuery()
        ->getResult();

    $list = array();
    foreach($objects as $obj) {
        $list[$obj['id']] = $obj['name'];
    }

    return $list;
}

Aber in der Bearbeiten-Fall die extract() - Funktion funktioniert nicht. Ich bin nicht an dem Punkt, wo ich etwas sehen, von hydrate() also lasse ich es für jetzt.

Meine hydrator-Strategie sieht wie folgt aus:

class MyHydrationStrategy extends DefaultStrategy
{
    public function extract($value) {        
        print_r($value);
        $result = array();
        foreach ($value as $instance) {
            print_r($instance);
            $result[] = $instance->getId();
        }
        return $result;
    }

    public function hydrate($value) {
        ...
    }

Das problem ist wie folgt:

Fatal error: Call to a member function getId() on a non-object

Den print_r($value) gibt loads von Zeug, beginnend mit

DoctrineORMModule\Proxy__CG__\SecEntity\Entity\SecEntity Objekt

folgenden mit etwas über BasicEntityPersister und irgendwo in dem Chaos sind meine referenzierten Entitäten.

Den print_r($instance) druckt nichts. Es ist einfach nur leer. Daher denke ich mal ist die Fehlermeldung echt... aber warum kann ich nicht Durchlaufen diese Objekte?

Irgendwelche Ideen?

Edit:

Bezug zu @Sam:

Mein Attribut in der Entität:

    /**
 * @ORM\ManyToOne(targetEntity="Path/To/Entity", inversedBy="whatever")
 * @ORM\JoinColumn(name="attribute_id", referencedColumnName="id")
 * @Form\Attributes({"type":"hidden"})
 *
 */
protected $attribute;

Meine neue selectbox:

$form->add(array(
        'name'       => 'attribute',
        'type'       => 'DoctrineModule\Form\Element\ObjectSelect',
        'attributes' => array(
            'required' => true
        ),
        'options'    => array(
            'label'           => 'MyLabel',
            'object_manager'  => $entityManager,
            'target_class'    => 'Path/To/Entity',
            'property'        => 'name'
        )
    ));

Meine Letzte Hoffnung ist, dass ich was falsch mache innerhalb der Steuerung. Weder meine selectbox vorausgewählt noch der Wert gespeichert wird...

...

$obj= $this->getEntityManager()->find('Path/To/Entity', $id);

    $builder = new \MyEnity\MyFormBuilder();
    $form = $builder->newForm($this->getEntityManager());

    $form->setBindOnValidate(false);
    $form->bind($obj);
    $form->setData($obj->getArrayCopy());

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setData($request->getPost());

        if ($form->isValid()) {
            $form->bindValues();
            $this->getEntityManager()->flush();

            return $this->redirect()->toRoute('entity');
        }
    }
Frage: Warum verwendet man nicht die Lehre Formular-Elemente?
Gut 🙂 ich bin nicht Ihrer Existenz bewusst, muss ich zugeben... kennst du ein gutes tutorial für? wenn Sie arbeiten, es ist eine legitime Antwort auf diese Frage würde ich sagen 😉

InformationsquelleAutor Ron | 2013-01-03

Schreibe einen Kommentar