• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Di erstellt keine neue Instanz für Abhängigkeiten

Kevin Bintzik

New member
Hey Leute,

ich hoffe ich bin hier in der Richtigen Kategorie >.<
Ich habe folgendes Problem:

Ich habe ein Hauptobjekt mit verschachtelten Abhängigkeiten (Maschine->Preis->Incoterm), leider wird aber für den Incoterm keine neue Instanz erzeugt... Ich hab es erst über hard-coding im __construct versucht klappte nicht dann habe ich es mit Di versucht klappt auch nicht. Hier mal ein Beispl:

Code:
public function onBootstrap($e)
    {
        $di = new Di();
        $di->instanceManager()->setParameters('MaschinenManager\Model\Entity\Preis', array(
            'Incoterm'      => new Incoterm(),
            'OrigIncoterm'  => new Incoterm(),
        ));
        $di->instanceManager()->setParameters('MaschinenManager\Model\Entity\Maschine', array(
            'Kateogie'          => new Kategorie(),
            'Typ'               => new Typ(),
            'Serie'             => new Serie(),
            'SerieBaureihe'     => new SerieBaureihe(),
            'HaendlerPreis'     => $di->newInstance('MaschinenManager\Model\Entity\Preis'),
            'QuellePreis'       => $di->newInstance('MaschinenManager\Model\Entity\Preis'),
            'Vk1Preis'          => $di->newInstance('MaschinenManager\Model\Entity\Preis'),
            'Vk2Preis'          => $di->newInstance('MaschinenManager\Model\Entity\Preis'),
            'HaendlerKontakt'   => new Kontakt(),
            'QuelleKontakt'     => new Kontakt(),
            'EkBeiKauf'         => $di->newInstance('MaschinenManager\Model\Entity\Preis'),


        ));
        $a = $di->newInstance('MaschinenManager\Model\Entity\Preis');
        $b = $di->newInstance('MaschinenManager\Model\Entity\Preis');
        var_dump($a);
        var_dump($b);
    }
dabei kommt dann folgendes raus(IDs werden für das beispl. per rand(1, 100) im __construct erstellt)
Code:
[B]object([I]MaschinenManager\Model\Entity\Preis)[[I]413]  
[I] protected 'id' [COLOR=#888a85]=>[/COLOR] [COLOR=#3465a4]null[/COLOR] 
[I][I][I][I][I][I][I][I][COLOR=#3465a4] .
 .
 .
[/COLOR]  [I]protected 'Incoterm' [COLOR=#888a85]=>[/COLOR]     [B]object([I]MaschinenManager\Model\Entity\Incoterm)[[I]352]
      [I]protected 'id' [COLOR=#888a85]=>[/COLOR] int [COLOR=#4e9a06]90
[/COLOR][I][I][I][I][B][I][I][I][I][I][I][COLOR=#3465a4]
[/COLOR][/I][/I][/I][/I][/I][/I][/B][/I][/I][/I][/I][/I][/I][/I][/B][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/B]
[B][B][B][I][I][I][B]object([I]MaschinenManager\Model\Entity\Preis)[[I]412]
 [I]protected 'id' [COLOR=#888a85]=>[/COLOR] [COLOR=#3465a4]null
[/COLOR] .
[I][I][I][I][I][I][I][I][COLOR=#3465a4] .
 .
[/COLOR]  [I]protected 'Incoterm' [COLOR=#888a85]=>[/COLOR]     [B]object([I]MaschinenManager\Model\Entity\Incoterm)[[I]352]
      [I]protected 'id' [COLOR=#888a85]=>[/COLOR] int [COLOR=#4e9a06]90[/COLOR][I][I][I][COLOR=#3465a4]
[/COLOR]  [/I][/I][/I][/I][/I][/I][/B][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/B][/I][/I][/I][/B][/B][/B]
hier nochmal ein kleiner ausschnitt aus der Preis-Klasse:
Code:
public function __construct(Incoterm $Incoterm, Incoterm $OrigIncoterm)
    {
        $this->Incoterm = $Incoterm;
        $this->OrigIncoterm = $OrigIncoterm;
        $this->Incoterm->id = rand(1, 100);
    }


    public function exchangeArray($data)
    {
        $this->id = (!empty($data['ID'])) ? $data['ID'] : null;
        $this->betrag = (!empty($data['Betrag'])) ? $data['Betrag'] : null;
        $this->waehrungISO = (!empty($data['WaehrungISO'])) ? $data['WaehrungISO'] : null;
        $this->origBetrag = (!empty($data['OrigBetrag'])) ? $data['OrigBetrag'] : null;
        $this->origWaehrungISO = (!empty($data['OrigWaehrungISO'])) ? $data['OrigWaehrungISO'] : null;
        $this->alternativWaehrungISO = (!empty($data['AlternativWaehrungISO'])) ? $data['AlternativWaehrungISO'] : null;
        $this->Incoterm->id = (!empty($data['IncotermID'])) ? $data['IncotermID'] : null;
        $this->Incoterm->zusatz = (!empty($data['IncotermZusatz'])) ? $data['IncotermZusatz'] : null;
        $this->notizen = (!empty($data['Notizen'])) ? $data['Notizen'] : null;
        $this->OrigIncoterm->id = (!empty($data['OrigIncotermID'])) ? $data['OrigIncotermID'] : null;
        $this->OrigIncoterm->zusatz = (!empty($data['OrigIncotermZusatz'])) ? $data['OrigIncotermZusatz'] : null;
        $this->erstelltAm = (!empty($data['ErstelltAm'])) ? $data['ErstelltAm'] : null;
        $this->erstelltVon = (!empty($data['ErstelltVon'])) ? $data['ErstelltVon'] : null;
    }
Normalerweise werden die Objekte per Gateway als ResultSet geladen, dort besteht aber das gleiche problem... AUßER ich führe das "new Incoterm" in der exchangeArray() methode aus DANN wird tatsächlich eine neue Instanz erzeugt.

Was mache ich falsch >.<*

Viele Grüße
 

michl

New member
Wieso willst du diese Instanzen in der onBootstrap Methode erzeugen?
Sind die SO essenziell, dass du die über das komplette Modul hinweg benötigst? Kann ich mir kaum vorstellen ...
Oder ist das bloß quick 'n' dirty dev code? Selbst dann isses... naja, .. wo anders besser aufgehoben!

Du könntest dein Incoterm Objekt clonen, dann wäre dein konkretes Problem wohl gelöst, aber schön ist was anderes ...
Wieso eigentlich Zend\Di ? Hat das nen Grund?

Für Produktivumgebungen wird von allen Seiten von Zend\Di abgeraten. Fürs schnelle entwickeln ist es ok, aber ich weiß ja nicht was du damit vor hast... deshalb lieber nochmal drauf hingewiesen ;)
ZF2, Zend Di and Controllers for fast SOA development
 

michl

New member
Vergiss das mit dem clonen. Ich hab das gerade mal getestet (noch nie wirklich mit Zend\Di gearbeitet)

Sobald du die Dependencies in der $di->newInstance übergibst funktioniert alles.
PHP:
public function onBootstrap($e)
    {
        $di = new Di();
        $di->instanceManager()->setParameters('MaschinenManager\Model\Entity\Maschine', array(
            'Kateogie'          => new Kategorie(),
            'Typ'               => new Typ(),
            'Serie'             => new Serie(),
            'SerieBaureihe'     => new SerieBaureihe(),
            'HaendlerPreis'     => $di->newInstance('MaschinenManager\Model\Entity\Preis'),
            'QuellePreis'       => $di->newInstance('MaschinenManager\Model\Entity\Preis'),
            'Vk1Preis'          => $di->newInstance('MaschinenManager\Model\Entity\Preis'),
            'Vk2Preis'          => $di->newInstance('MaschinenManager\Model\Entity\Preis'),
            'HaendlerKontakt'   => new Kontakt(),
            'QuelleKontakt'     => new Kontakt(),
            'EkBeiKauf'         => $di->newInstance('MaschinenManager\Model\Entity\Preis'),


        ));
        $incoterm = new Incoterm;
        $a = $di->newInstance(
            'MaschinenManager\Model\Entity\Preis',
            array(
                'Incoterm'       => clone $incoterm,
                'OrigIncoterm'  => clone $incoterm,
            )
        );
        $b = $di->newInstance(
            'MaschinenManager\Model\Entity\Preis',
            array(
                'Incoterm'      => clone $incoterm,
                'OrigIncoterm'  => clone $incoterm,
            )
        );
        var_dump($a);
        var_dump($b);
    }
Irgendwie ist das Verhalten auf den ersten Blick etwas merkwürdig. Bin da aber auch nicht wirklich tief drin, wie bereits erwähnt.

Für MaschinenManager\Model\Entity\Maschine muss das ganze dann natürlich auch angepasst werden.
Falls du die dependencies tatsächlich über setParameters() handlen willst und nicht über newInstance(), dann empfehle ich dir einfach nochmal die Doku zu lesen.
Da wirds bestimmt auch ne Möglichkeit geben. Halte mal nach dem $shared keyword ausschau.
 
Zuletzt bearbeitet:
Oben