• 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

Select - Join - Hydrator - ohne Funktion?

rainman1983

New member
Ich nehme das Buch als Richtlinie und baue dann mein Projekt auf.

Leider schaffe ich es jetzt nicht, bei einem Select (Tabelle admin_berechtigung) mit Join (Tabelle admin_berechtigung_ziel), dass die verknüpfte Tabelle die Werte zurück gibt. Wer setzt den Wert in die Entity von admin_berechtigung? Bei einer Ausgabe habe ich keinen Aufruf festgestellt.

PermissionTargetEntityStrategy (1 zu 1 von deinem Buch)

Hydrator (Parent)
PHP:
class PermissionHydrator extends ClassMethods
    {
        public function __construct()
        {
            parent::__construct();

            $this->addStrategy('last_modified', new DateTimeFormatterStrategy('Y-m-d H:i:s'));

            $this->addStrategy('admin_berechtigung_ziel', new PermissionTargetEntityStrategy(new PermissionTargetHydrator()));
        }
    }
Storage
PHP:
...
        public function getListExtended()
        {
            $oSql = $this->_oTableGateway->getSql()->select();
            $oSql->order('berechtigung_id ASC');
            $oSql->join('admin_berechtigung_ziel',
                        'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
                        ['admin_berechtigung_ziel_ziel' => 'ziel']);

            $oResultSet = $this->_oTableGateway->selectWith($oSql);

            return $oResultSet->current();
        }
...
Controller
PHP:
...
public function indexAction()
        {
            $oData = $this->_oRepository->getListExtended();

            var_dump($oData);
            var_dump($oData->getAdminBerechtigungZiel());

            $oViewModel = new ViewModel();

            return $oViewModel;
        }
...
Output (var_dump($oData)
Code:
[B]object[/B]([I]AdminPermission\Model\Entity\PermissionEntity[/I])[[I]590[/I]]   [I]private[/I] 'berechtigung_id' [COLOR=#888a85]=>[/COLOR] string [COLOR=#cc0000]'1'[/COLOR] [I](length=1)[/I]
  [I]private[/I] 'bezeichnung' [COLOR=#888a85]=>[/COLOR] string [COLOR=#cc0000]'Login'[/COLOR] [I](length=5)[/I]
  [I]private[/I] 'position' [COLOR=#888a85]=>[/COLOR] string [COLOR=#cc0000]'1'[/COLOR] [I](length=1)[/I]
  [I]private[/I] 'last_modified' [COLOR=#888a85]=>[/COLOR] 
    [B]object[/B]([I]DateTime[/I])[[I]591[/I]]
      [I]public[/I] 'date' [COLOR=#888a85]=>[/COLOR] string [COLOR=#cc0000]'2015-05-25 03:45:51.000000'[/COLOR] [I](length=26)[/I]
      [I]public[/I] 'timezone_type' [COLOR=#888a85]=>[/COLOR] int [COLOR=#4e9a06]3[/COLOR]
      [I]public[/I] 'timezone' [COLOR=#888a85]=>[/COLOR] string [COLOR=#cc0000]'Europe/Berlin'[/COLOR] [I](length=13)[/I]
  [I]private[/I] 'admin_berechtigung_ziel' [COLOR=#888a85]=>[/COLOR] [COLOR=#3465a4]null[/COLOR]
Output (var_dump($oData->getAdminBerechtigungZiel())
Code:
[COLOR=#3465a4]null[/COLOR]
Die Hydratoren sind in der Config registriert.

Woran könnte es noch liegen?
 

Ralf

New member
Hallo rainman1983,

in deinem Storage steht im SQL "admin_berechtigung_ziel_ziel", aber in deinem steht "admin_berechtigung_ziel". Das könnte der Fehler sein.

Gruß,

Ralf
 

rainman1983

New member
Hallo Ralf,

wenn ich den erzeugten SQL anschaue, dann sieht der sehr gut aus. Ich denke nicht, dass dies am Storage liegt. Weil wenn ich das ResultSet als Array zurückgebe, dann erhalte ich auch alle Treffer, halt immer ohne Daten vom Ziel.

Ich bin langsam ratlos.

Schönen Sonntag
Ben
 

Kaiuwe

Super-Moderator
wenn ich den erzeugten SQL anschaue, dann sieht der sehr gut aus.
Ich kann Ralf hier nur zustimmen, denn das was du hier veröffentlichst hast, enthält einen Fehler.

Siehe in deiner Storage-Klasse:

rainman1983 schrieb:
PHP:
$oSql->join(
    'admin_berechtigung_ziel',
    'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
    ['admin_berechtigung_ziel_ziel' => 'ziel']
);
"admin_berechtigung_ziel_ziel" muss doch "admin_berechtigung_ziel.ziel" sein.
 

rainman1983

New member
Ich habe es den Unterstrich durch den Punkt ersetzt. Leider bleibt das Ergebnis gleich.

Wenn du das Buch von Ralf zur Hand hast, dann schau dir mal das Beispiel auf Seite 459 an. Hier wird beim Join, die Key-Felder aber mit Unterstrich verbunden und nicht mit dem Punkt.

An dieser Stelle werden nur die Namen der Felder der Join-Tabelle eindeutig festgelegt. So dass ich diese zwischen der Elterntabelle unterscheiden kann.
 

Kaiuwe

Super-Moderator
Ich habe es den Unterstrich durch den Punkt ersetzt. Leider bleibt das Ergebnis gleich.
Macht auch keinen Sinn! Ich hatte mich bei der Angabe von Datenbankfeldname und Alias verlesen. Die Angabe stimmt dort.

rainman1983 schrieb:
wenn ich den erzeugten SQL anschaue, dann sieht der sehr gut aus.
Dann setze mal weiter vorne an: Überprüfe das erzeugte SQL mit deinem Datenbankverwaltungsprogramm deines Vertrauens. Solltest du dort alle Ergebnisse korrekt erhalten, wird der Fehler beim Hydrator und den zugehörigen Strategien liegen.

Du kannst auch mal die Klassen "PermissionTargetHydrator" und "PermissionTargetEntityStrategy" hier veröffentlichen.
 

Kaiuwe

Super-Moderator
Ich habe es den Unterstrich durch den Punkt ersetzt. Leider bleibt das Ergebnis gleich.
Macht auch keinen Sinn! Ich hatte mich bei der Angabe von Datenbankfeldname und Alias verlesen. Die Angabe stimmt bei dir.

rainman1983 schrieb:
wenn ich den erzeugten SQL anschaue, dann sieht der sehr gut aus.
Dann setze mal weiter vorne an: Überprüfe das erzeugte SQL mit einem Datenbankverwaltungsprogramm deines Vertrauens. Solltest du dort alle Ergebnisse korrekt erhalten, wird der Fehler beim Hydrator und den zugehörigen Strategien liegen.

Du kannst auch mal die Klassen "PermissionTargetHydrator" und "PermissionTargetEntityStrategy" hier veröffentlichen.
 
Zuletzt bearbeitet:

rainman1983

New member
Der SQL-String sieht gut aus. Ich erhalte auch von PHPMyAdmin alle gewünschten Daten.

Ich habe den SQL angepasst. Habe admin_berechtigung_ziel durch target ersetzt.

PHP:
public function getListExtended()
        {
            /* @var $oSql \Zend\Db\Sql\Select */

            $oSql = $this->_oTableGateway->getSql()->select();
            $oSql->order('admin_berechtigung.berechtigung_id ASC');
            $oSql->join('admin_berechtigung_ziel',
                        'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
                        ['target_berechtigung_ziel_id'    => 'berechtigung_ziel_id',
                         'target_berechtigung_id'         => 'berechtigung_id',
                         'target_ziel'                        => 'ziel',
                         'target_last_modified'         => 'last_modified']);

            $oResultSet = $this->_oTableGateway->selectWith($oSql);

            return $oResultSet->current();
        }
PermissionTargetHydrator
PHP:
class PermissionTargetHydrator extends ClassMethods
    {
        public function __construct()
        {
            parent::__construct();

            $this->addStrategy('last_modified', new DateTimeFormatterStrategy('Y-m-d H:i:s'));
        }
    }

PermissionTargetEntityStrategy
PHP:
class PermissionTargetEntityStrategy implements StrategyInterface
    {
        private $_oHydrator;

        public function __construct(HydratorInterface $oHydrator)
        {
            $this->_oHydrator = $oHydrator;
        }

        public function extract($oValue)
        {
            if ($oValue instanceof PermissionTargetEntity)
            {
                return $oValue->getBerechtigungZielId();
            }

            return $oValue;
        }

        public function hydrate($sValue, $aData = [])
        {
            $aTargetData = [];

            foreach ($aData as $sKey => $sValue)
            {
                if (substr($sKey, 0, 8) != 'target_')
                {
                    continue;
                }

                $aTargetData[substr($sKey, 8)] = $sValue;
            }

            $oEntity = new PermissionTargetEntity();
            $this->_oHydrator->hydrate($aTargetData, $oEntity);

            return $oEntity;
        }
    }
 

Ralf

New member
Der Name des Feldes, dem du eine Strategy zuordnest muss genauso lauten, wie der Name der Spalte, wenn die Daten aus der Datenbank kommen. Wenn du nun also den Namen "target_ziel" in deinem Select als Alias verwendest, musst du auch in deinem PermissionHydrator die PermissionTargetEntityStrategy dem Namen "target_ziel" zuweisen. Im Ausgangsposting hattest du im Select als Alias "admin_berechtigung_ziel_ziel" verwendet und im Hydrator "admin_berechtigung_ziel". Das passt nicht.

Gruß,

Ralf
 

rainman1983

New member
Das ist klar Ralf.

Ich habe im PermissionHydrator dies wie folgt angepasst:
PHP:
class PermissionHydrator extends ClassMethods
    {
        public function __construct()
        {
            parent::__construct();

            $this->addStrategy('last_modified', new DateTimeFormatterStrategy('Y-m-d H:i:s'));

            $this->addStrategy('target', new PermissionTargetEntityStrategy(new PermissionTargetHydrator()));
        }
    }
Warum sollte dies jetzt hier target_ziel lauten?

In der Methode hole ich doch den Wert, wie folgt:
PHP:
public function getListExtended()
        {
            /* @var $oSql \Zend\Db\Sql\Select */

            $oSql = $this->_oTableGateway->getSql()->select();
            $oSql->order('admin_berechtigung.berechtigung_id ASC');
            $oSql->join('admin_berechtigung_ziel',
                        'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
                        ['target_berechtigung_ziel_id'    => 'berechtigung_ziel_id',
                         'target_berechtigung_id'         => 'berechtigung_id',
                         'target_ziel'                        => 'ziel',
                         'target_last_modified'         => 'last_modified']);

            $oResultSet = $this->_oTableGateway->selectWith($oSql);

            return $oResultSet->current();
        }
Wie muss ich hier denn das Mapping zwischen DB-Feld und Key der Verknüpften Tabelle machen? Der Schlüssel "target_" müsste dann doch der Schlüssel im Hydrator (ohne Unterstrich) sein?

In der PermissionEntity habe ich dann folgendes
PHP:
class PermissionEntity implements DefaultEntityInterface
    {
        private $berechtigung_id;
        private $bezeichnung;
        private $position;
        private $last_modified;
        private $target;

        public function setBerechtigungId($mValue) { $this->berechtigung_id = $mValue; }
        public function getBerechtigungId() { return $this->berechtigung_id; }

        public function setBezeichnung($mValue) { $this->bezeichnung = $mValue; }
        public function getBezeichnung() { return $this->bezeichnung; }

        public function setPosition($mValue) { $this->position = $mValue; }
        public function getPosition() { return $this->position; }

        public function setLastModified(\DateTime $mValue) { $this->last_modified = $mValue; }
        public function getLastModified() { return $this->last_modified; }

        public function setTarget(PermissionTargetEntity $oEntity) { $this->target = $oEntity; }
        public function getTarget() { return $this->target; }

        public function updateDateTimeFields()
        {
            $this->setLastModified(new \DateTime());
        }
    }
Damit sollte das doch funktionieren?
 

rainman1983

New member
Wenn ich mir von der Methode "getListExtended()", den Wert $oResultSet ausgeben lasse, erhalte ich folgendes:
PHP:
object(Zend\Db\ResultSet\HydratingResultSet)[577]
  protected 'hydrator' => 
    object(AdminPermission\Model\Hydrator\PermissionHydrator)[219]
      private 'hydrationMethodsCache' (Zend\Hydrator\ClassMethods) => 
        array (size=6)
          'AdminPermission\Model\Entity\PermissionEntity::$berechtigung_id' => string 'setBerechtigungId' (length=17)
          'AdminPermission\Model\Entity\PermissionEntity::$bezeichnung' => string 'setBezeichnung' (length=14)
          'AdminPermission\Model\Entity\PermissionEntity::$position' => string 'setPosition' (length=11)
          'AdminPermission\Model\Entity\PermissionEntity::$last_modified' => string 'setLastModified' (length=15)
          'AdminPermission\Model\Entity\PermissionEntity::$berechtigung_ziel_id' => boolean false
          'AdminPermission\Model\Entity\PermissionEntity::$ziel' => boolean false
      private 'extractionMethodsCache' (Zend\Hydrator\ClassMethods) => 
        array (size=0)
          empty
      protected 'underscoreSeparatedKeys' => boolean true
      private 'callableMethodFilter' (Zend\Hydrator\ClassMethods) => 
        object(Zend\Hydrator\Filter\OptionalParametersFilter)[225]
      protected 'strategies' => 
        object(ArrayObject)[220]
          private 'storage' => 
            array (size=2)
              ...
      protected 'namingStrategy' => 
        object(Zend\Hydrator\NamingStrategy\UnderscoreNamingStrategy)[224]
      protected 'filterComposite' => 
        object(Zend\Hydrator\Filter\FilterComposite)[221]
          protected 'orFilter' => 
            object(ArrayObject)[222]
              ...
          protected 'andFilter' => 
            object(ArrayObject)[223]
              ...
  protected 'objectPrototype' => 
    object(AdminPermission\Model\Entity\PermissionEntity)[244]
      private 'berechtigung_id' => null
      private 'bezeichnung' => null
      private 'position' => null
      private 'last_modified' => null
      private 'target' => null
  protected 'buffer' => null
  protected 'count' => null
  protected 'dataSource' => 
    object(Zend\Db\Adapter\Driver\Pdo\Result)[579]
      protected 'statementMode' => string 'forward' (length=7)
      protected 'fetchMode' => int 2
      protected 'resource' => 
        object(PDOStatement)[578]
          public 'queryString' => string 'SELECT `admin_berechtigung`.*, `admin_berechtigung_ziel`.`berechtigung_ziel_id` AS `target_berechtigung_ziel_id`, `admin_berechtigung_ziel`.`berechtigung_id` AS `target_berechtigung_id`, `admin_berechtigung_ziel`.`ziel` AS `target_ziel`, `admin_berechtigung_ziel`.`last_modified` AS `target_last_modified` FROM `admin_berechtigung` INNER JOIN `admin_berechtigung_ziel` ON `admin_berechtigung_ziel`.`berechtigung_id` = `admin_berechtigung`.`berechtigung_id` ORDER BY `admin_berechtigung`.`berechtigung_id` ASC' (length=508)
      protected 'options' => null
      protected 'currentComplete' => boolean false
      protected 'currentData' => null
      protected 'position' => int -1
      protected 'generatedValue' => string '0' (length=1)
      protected 'rowCount' => null
  protected 'fieldCount' => int 8
  protected 'position' => int 0
Die fett markierten Zeilen stammen aus der Kind-Tabelle (admin_berechtigung_ziel). Warum werden hier nicht alle angezeigt? Die zwei restlichen Felder sind natürlich in der Parent-Tabelle (last_modified und berechtigung_id) auch schon vorhanden.
 

rainman1983

New member
Ich habe das Beispiel vom TestController auf Seite 452 probiert. Hier funktioniert es auch schon bei mir nicht.

PHP:
$aData = [
                'berechtigung_id' => 1,
                'bezeichnung' => 'Test',
                'position' => 9,
                'last_modified' => date('Y-m-d H:i:s'),
                'target_berechtigung_ziel_id' => 1,
                'target_berechtigung_id' => 1,
                'target_ziel' => 'asdfasdfasdf',
                'target_last_modified' => date('Y-m-d H:i:s'),
            ];

            $oEntity = new PermissionEntity();

            $oHydrator = new PermissionHydrator();
            $oHydrator->hydrate($aData, $oEntity);

            var_dump($oEntity);
            var_dump($oHydrator->extract($oEntity));
Sehr komisch das Ganze!
 

Ralf

New member
Also nochmal von Vorne. Ich verweise mal auf die Beispiele aus dem Buch. Hier wird die CompanyEntityStrategy im AdvertHydrator dem Feld "company" zugewiesen.

https://github.com/zf3buch/zendframework-center/blob/chapter_16_04/module/AdvertModel/src/Hydrator/AdvertHydrator.php#L40

Die CompanyEntityStrategy erwartet, dass alle Felder die relevant sind, mit einem "company_" Präfix beginnen:

https://github.com/zf3buch/zendframework-center/blob/chapter_16_04/module/CompanyModel/src/Hydrator/Strategy/CompanyEntityStrategy.php#L63

Im AdvertDbStorage werden diese Felder gejoint, wobei jedes Feld den "company_" Präfix voran gestellt bekommt:

https://github.com/zf3buch/zendframework-center/blob/chapter_16_04/module/AdvertModel/src/Storage/Db/AdvertDbStorage.php#L210

Wichtig ist dabei, dass das Feld "company" (siehe oben) auch im SELECT enthalten ist. Das ist der Aufhänger, damit die Hydrator Strategy ausgeführt werden kann.

Kannst du also bitte nochmal deinen PermissionHydrator, deine PermissionTargetEntityStrategy und die Storage-Klasse komplett hier posten. Dann können wir das einmal abgleichen.

Ich bin für vier Tage auf einer ZF3 Schulung und deshalb etwas eingeschränkt erreichbar. Also nicht wundern, wenn es etwas dauert.

Gruß,

Ralf
 

rainman1983

New member
Wichtig ist dabei, dass das Feld "company" (siehe oben) auch im SELECT enthalten ist. Das ist der Aufhänger, damit die Hydrator Strategy ausgeführt werden kann.
Wie meinst du diesen Satz?

PermissionHydrator
PHP:
class PermissionHydrator extends ClassMethods implements HydratorInterface
    {
        public function __construct()
        {
            parent::__construct();

            $this->addStrategy('last_modified', new DateTimeFormatterStrategy('Y-m-d H:i:s'));

            $this->addStrategy('target', new PermissionTargetEntityStrategy(new PermissionTargetHydrator()));
        }
    }
PermissionTargetEntityStrategy
PHP:
class PermissionTargetEntityStrategy implements StrategyInterface
    {
        private $_oHydrator;

        public function __construct(HydratorInterface $oHydrator)
        {
            $this->_oHydrator = $oHydrator;
        }

        public function extract($oValue)
        {
            if ($oValue instanceof PermissionTargetEntity)
            {
                return $oValue->getBerechtigungZielId();
            }

            return $oValue;
        }

        public function hydrate($sValue, $aData = [])
        {
            $aTargetData = [];

            foreach ($aData as $sKey => $sValue)
            {
                $sSearch       = 'target_';
                $iLengthSearch = strlen($sSearch);

                if (substr($sKey, 0, $iLengthSearch) != $sSearch)
                {
                    continue;
                }

                $aTargetData[substr($sKey, $iLengthSearch)] = $sValue;
            }

            $oEntity = new PermissionTargetEntity();
            $this->_oHydrator->hydrate($aTargetData, $oEntity);

            return $oEntity;
        }
    }
Storage
PHP:
class PermissionDbStorage implements PermissionStorageInterface
    {
        protected $_oTableGateway;
        protected $_oHydrator;


        public function __construct(TableGatewayInterface $oTableGateway)
        {
            $this->_oTableGateway = $oTableGateway;
            $oResultSetPrototype  = $this->_oTableGateway->getResultSetPrototype();

            $oHydrator            = $oResultSetPrototype->getHydrator();
            $this->_oHydrator     = $oHydrator;
        }

        public function getListExtended()
        {
            /* @var $oSql \Zend\Db\Sql\Select */

            $oSql = $this->_oTableGateway->getSql()->select();
            $oSql->order('admin_berechtigung.berechtigung_id ASC');
            $oSql->join('admin_berechtigung_ziel',
                        'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
                        ['target_berechtigung_ziel_id'    => 'berechtigung_ziel_id',
                         'target_berechtigung_id'         => 'berechtigung_id',
                         'target_ziel'                        => 'ziel',
                         'target_last_modified'         => 'last_modified']);

            $oResultSet = $this->_oTableGateway->selectWith($oSql);

            return $oResultSet->current();
        }
    }

Laut deinem Buch sollte dieses Beispiel auch funktionieren. Dies klappt leider auch nicht bei mir.
PHP:
$aData =
            [
                'berechtigung_id'                 => 1,
                'bezeichnung'                     => 'Test',
                'position'                         => 9,
                'last_modified'                 => date('Y-m-d H:i:s'),
                'target_berechtigung_ziel_id'     => 1,
                'target_berechtigung_id'         => 1,
                'target_ziel'                     => 'asdfasdfasdf',
                'target_last_modified'             => date('Y-m-d H:i:s'),
            ];

            $oEntity = new PermissionEntity();

            $oHydrator = new PermissionHydrator();
            $oHydrator->hydrate($aData, $oEntity);

            var_dump($oEntity);
            var_dump($oHydrator->extract($oEntity));
 

Kaiuwe

Super-Moderator
Dies klappt leider auch nicht bei mir.
Debugger verwenden und prüfen, was beim „PermissionTargetHydrator“ überhaupt ankommt.

Du solltest auch einzeln prüfen: werden durch den Hydrator „PermissionTargetHydrator“ alle Daten für das Objekt „PermissionTargetEntity“ korrekten gesetzt. (Stichwort „Unit-Tests“)
 
Zuletzt bearbeitet:

rainman1983

New member
Die TargetEntity wird korrekt über den TargetHydrator gefüllt.

Die Tabellenstruktur:
Code:
CREATE TABLE `admin_berechtigung` (
  `berechtigung_id` tinyint(2) NOT NULL,
  `bezeichnung` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `position` tinyint(2) NOT NULL,
  `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE `admin_berechtigung_ziel` (
  `berechtigung_ziel_id` tinyint(3) NOT NULL,
  `berechtigung_id` tinyint(2) NOT NULL,
  `ziel` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
  `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Da das obige Beispiel nicht funktioniert, habe ich mal dein Beispiel mit AdvertEntity und CompanyEntity bei mir nachgebaut. Leider funktioniert dies bei mir auch nicht.

PHP:
$aData =
            [
                'id'             => 10,
                'company_id'     => 20,
                'company_name'     => 'BG',
            ];


            $oEntity = new AdvertEntity();

            $oHydrator = new AdvertHydrator();
            $oHydrator->hydrate($aData, $oEntity);

            var_dump($oEntity);
            var_dump($oHydrator->extract($oEntity));
 
Zuletzt bearbeitet:

rainman1983

New member
PermissionTargetEntityStrategy
PHP:
class PermissionTargetEntityStrategy implements StrategyInterface
    {
        private $_oHydrator;

        public function __construct(HydratorInterface $oHydrator)
        {
            $this->_oHydrator = $oHydrator;
        }

        public function extract($oValue)
        {
            if ($oValue instanceof PermissionTargetEntity)
            {
                return $oValue->getBerechtigungZielId();
            }

            return $oValue;
        }

        public function hydrate($sValue, $aData = [])
        {
            $aTargetData = [];

            foreach ($aData as $sKey => $sValue)
            {
                $sSearch       = 'target_';
                $iLengthSearch = strlen($sSearch);

                if (substr($sKey, 0, $iLengthSearch) != $sSearch)
                {
                    continue;
                }

                $aTargetData[substr($sKey, $iLengthSearch)] = $sValue;
            }

            $oEntity = new PermissionTargetEntity();
            $this->_oHydrator->hydrate($aTargetData, $oEntity);

            return $oEntity;
        }
    }
Wenn ich in jede Methode, eine Ausgabe hinzufüge, dann stelle ich fest, dass nur der Constructor aufgerufen wird, aber nicht die anderen beiden Funktionen.

Wer muss die beiden Methoden extract und hydrate triggern? Ich denke, die hydrate müsste ausgeführt werden.
 

Ralf

New member
Das ist genau das Problem, dass ich bisher leider erfolglos vermitteln wollen. Konnte mich bisher offenbar nicht verständlich ausdrücken. Deine Datenbankabfrage muss am Ende eine Spalte mit demselben Namen zurück liefern, für den die die Hydratorstrategie definierst hast. Wenn du die Strategy dem Feld "meine_spalte" zuweist, muss der SELECT eine solche Spalte enthalten. Entweder heisst die Spalte direkt so oder du vergibst einen Alias.
 
Oben