GORM 2.0: Einrichten mittels DIServiceManager

Anmerkungen, Fragen und Hinweise zur Konfiguration dürfen in diesem Forum gepostet werden. // Notes, questions, and hints on the configuration can be posted here.
Antworten
Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

GORM 2.0: Einrichten mittels DIServiceManager

Beitrag von ma2604121 » 08.12.2013, 18:52:48

Hallo,

ich versuche gerade den GORM als DIService einzurichten.

Hierzu habe ich unter APF/config/data/mapper/auto/ folgende Dateien erstellt:

DEFAULT_auto_objects.ini

Code: Alles auswählen

; Fahrzeugdaten
[Car]
Description = "VARCHAR(40)"
StartDate = "DATE"
Price = "DECIMAL(10,2)"
StartMilage = "DECIMAL(10,2)" 
DEFAULT_auto_relations.ini

Code: Alles auswählen

; Einem Benutzer ein bestimmtes Fahrzeug zuordnen
[User2Car]
Type = "ASSOCIATION"
SourceObject = "User"
TargetObject = "Car" 
sowie die DEFAULT_serviceobjects.ini

Code: Alles auswählen

[OR-Mapper]
servicetype = "SINGLETON" 
class = "APF\modules\genericormapper\data\GenericORRelationMapper" 
setupmethod = "setup" 
conf.namespace.method = "setConfigNamespace" 
conf.namespace.value = "APF\data\mapper" 
;conf.debug.method = "setDebugMode" 
;conf.debug.value = "false" 

init.db.method = "setDbDriver" 
init.db.namespace = "APF\data\mapper" 
init.db.name = "DATABASE" 

init.rel.method = "addDIRelationConfiguration" 
init.rel.namespace = "APF\data\mapper" 
init.rel.name = "CONFIG-RELATION" 

init.map.method = "addDIMappingConfiguration" 
init.map.namespace = "APF\data\mapper" 
init.map.name = "CONFIG-MAPPING" 

[CONFIG-MAPPING] 
servicetype = "NORMAL" 
class = "APF\modules\genericormapper\data\GenericORMapperDIMappingConfiguration" 
conf.namespace.method = "setConfigNamespace" 
conf.namespace.value = "APF\data\mapper" 
conf.affix.method = "setConfigAffix" 
conf.affix.value = "auto" 

[CONFIG-RELATION] 
servicetype = "NORMAL" 
class = "APF\modules\genericormapper\data\GenericORMapperDIRelationConfiguration" 
conf.namespace.method = "setConfigNamespace" 
conf.namespace.value = "APF\data\mapper" 
conf.affix.method = "setConfigAffix" 
conf.affix.value = "auto" 

[DATABASE] 
servicetype = "SINGLETON" 
class = "APF\core\database\MySQLiHandler" 
setupmethod = "setup" 

conf.host.method = "setHost" 
conf.host.value = "localhost"
conf.name.method = "setDatabaseName" 
conf.name.value = "auto" 
conf.user.method = "setUser" 
conf.user.value = "user" 
conf.pass.method = "setPass" 
conf.pass.value = "pwd" 
Weiterhin liegt unter APF/config/core/database/auto die Datei DEFAULT_connections.ini

Code: Alles auswählen

[auto]
DB.Host = "localhost"
DB.User = "user"
DB.Pass = "pwd"
DB.Name = "auto"
DB.Port = "3306"
DB.Collation = "utf8_general_ci"
DB.Charset = "utf8"
DB.Type = "APF\core\database\MySQLiHandler" 
Nun versuche ich den Service aufzurufen mittels

Code: Alles auswählen

use APFmodulesgenericormapperdataGenericORRelationMapper;
$orm = & $this->getDIServiceObject('APF\data\mapper', 'OR-Mapper'); 
Das führt dann zu folgender Meldung:

Code: Alles auswählen

Type:     InvalidArgumentException 
Message:     [ConnectionManager::getConnection()] The given configuration section ("") does not exist in configuration file "DEFAULT_connections.ini" in namespace "APF\core\database" for context "auto"! 
Number:     256 
File:     /var/www/APF/core/database/ConnectionManager.php 
Line:     135 
Irgendwie fehlt da scheinbar der Name der Verbindung, die in der DEFAULT_connections.ini hinterlegt ist. Allerdings weiß ich nicht genau, wo diese eingetragen werden muss...

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: GORM 2.0: Einrichten mittels DIServiceManager

Beitrag von dr.e. » 08.12.2013, 21:24:55

Hallo ma260412,

die Initialisierung der Datenbank-Verbindung erfolgt in der gewählten Konfiguration über den DIServiceManager und nicht über den ConnectionManager. Daher wundert mich die Exception ein wenig. :roll:

Nutzt du

Code: Alles auswählen

init.db.method = "setDbDriver" 
init.db.namespace = "APF\data\mapper" 
init.db.name = "DATABASE" 
so ist die Datei DEFAULT_connections.ini zunächst nicht relevant und wird auch nicht benötigt.

Kannst du mal einen kompletten Stacktrace posten, ich habe gerade keine wirkliche Idee, was bei dir passiert.

Noch ein Hinweis:

Du kannst

Code: Alles auswählen

conf.namespace.method = "setConfigNamespace" 
conf.namespace.value = "APF\data\mapper" 
entfernen, da du ja die Konfiguration explizit per

Code: Alles auswählen

init.rel.method = "addDIRelationConfiguration" 
init.rel.namespace = "APF\data\mapper" 
init.rel.name = "CONFIG-RELATION" 

init.map.method = "addDIMappingConfiguration" 
init.map.namespace = "APF\data\mapper" 
init.map.name = "CONFIG-MAPPING" 
injizierst. Grundsätzlich sollte das nicht den oben beschrieben Fehler beheben, ich möchte jedoch sicher gehen, dass dieser nicht damit zusammen hängt.
Viele Grüße,
Christian

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM 2.0: Einrichten mittels DIServiceManager

Beitrag von ma2604121 » 08.12.2013, 21:46:50

Hallo dr.e.,
dr.e. hat geschrieben:die Initialisierung der Datenbank-Verbindung erfolgt in der gewählten Konfiguration über den DIServiceManager und nicht über den ConnectionManager. Daher wundert mich die Exception ein wenig. :roll:

Nutzt du (...) so ist die Datei DEFAULT_connections.ini zunächst nicht relevant und wird auch nicht benötigt.
Genau so hatte ich das auch verstanden, weshalb mich der Fehler ebenfalls irritiert.

Hier die Daten der Anwendung: Controller:

Code: Alles auswählen

<?php
namespace AUTOcontroller;

use APFcorepagecontrollerBaseDocumentController;
use APFtoolshttpHeaderManager;
use APFcoreserviceAPFService;
use APFmodulesgenericormapperdataGenericORRelationMapper;
use APFmodulesgenericormapperdataGenericDomainObject;

class AutoController extends BaseDocumentController {
    
    public function transformContent(){
        $form = &$this->getForm('auto'); 
        $form->transformOnPlace();
        
        # Daten abgeschickt und valide?
        if ($form->isSent() && $form->isValid()){
            
            # UserId holen
            $sessionStore = & $this->getServiceObject('APFmodulesusermanagementbizUmgtUserSessionStore', APFService::SERVICE_TYPE_SESSION_SINGLETON);
            $appIdent = $this->getContext();
            $user = $sessionStore->getUser($appIdent);

            # Neues GDO-Object erstellen
            $Car = new GenericDomainObject('Car');

            # Daten aus den Formularen holen und den Feldern der Tabelle zuweisen
            $Car->setProperty('Description', $form->getFormElementByName('Description')->getAttribute('value'));
            $Car->setProperty('Price', $form->getFormElementByName('Price')->getAttribute('value'));
            $Car->setProperty('StarMilage', $form->getFormElementByName('StartMilage')->getAttribute('value'));
            
            $User = new GenericDomainObject('User');
            
            $User->addRelatedObject('User2Car', $Car);
            
            $orm = & $this->getDIServiceObject('APFdatamapper', 'OR-Mapper');
            
            #$orm->saveObject($User);
            
            HeaderManager::forward(?p=start);
        }
    } 
}

?>
Dazu die APF/config/data/mapper/auto/DEFAULT_serviceobjects.ini:

Code: Alles auswählen

[OR-Mapper]
servicetype = "SINGLETON" 
class = "APF\modules\genericormapper\data\GenericORRelationMapper" 
setupmethod = "setup" 
;conf.namespace.method = "setConfigNamespace" 
;conf.namespace.value = "APF\data\mapper" 
;conf.debug.method = "setDebugMode" 
;conf.debug.value = "false" 

init.db.method = "setDbDriver" 
init.db.namespace = "APF\data\mapper" 
init.db.name = "DATABASE" 

init.rel.method = "addDIRelationConfiguration" 
init.rel.namespace = "APF\data\mapper" 
init.rel.name = "CONFIG-RELATION" 

init.map.method = "addDIMappingConfiguration" 
init.map.namespace = "APF\data\mapper" 
init.map.name = "CONFIG-MAPPING" 

[CONFIG-MAPPING] 
servicetype = "NORMAL" 
class = "APF\modules\genericormapper\data\GenericORMapperDIMappingConfiguration" 
conf.namespace.method = "setConfigNamespace" 
conf.namespace.value = "APF\data\mapper" 
conf.affix.method = "setConfigAffix" 
conf.affix.value = "auto" 

[CONFIG-RELATION] 
servicetype = "NORMAL" 
class = "APF\modules\genericormapper\data\GenericORMapperDIRelationConfiguration" 
conf.namespace.method = "setConfigNamespace" 
conf.namespace.value = "APF\data\mapper" 
conf.affix.method = "setConfigAffix" 
conf.affix.value = "auto" 

[DATABASE] 
servicetype = "SINGLETON" 
class = "APF\core\database\MySQLiHandler" 
setupmethod = "setup" 

conf.host.method = "setHost" 
conf.host.value = "localhost"
conf.name.method = "setDatabaseName" 
conf.name.value = "auto" 
conf.user.method = "setUser" 
conf.user.value = "user" 
conf.pass.method = "setPass" 
conf.pass.value = "pwd" 
Das Auskommentieren von

Code: Alles auswählen

;conf.namespace.method = "setConfigNamespace" 
;conf.namespace.value = "APF\data\mapper"  
ändert nichts an der oben genannten Fehlermeldung.

Stacktrace:

Code: Alles auswählen

Call 	File 	Line
APF\core\frontcontroller\Frontcontroller->start() 	/var/www/auto/index.php 	30
APF\core\pagecontroller\Page->transform() 	/var/www/APF/core/frontcontroller/Frontcontroller.php 	512
APF\core\pagecontroller\Document->transform() 	/var/www/APF/core/pagecontroller/pagecontroller.php 	858
APF\core\pagecontroller\Document->transform() 	/var/www/APF/core/pagecontroller/pagecontroller.php 	1748
APF\core\pagecontroller\Document->transform() 	/var/www/APF/core/pagecontroller/pagecontroller.php 	1748
AUTO\controller\AutoController->transformContent() 	/var/www/APF/core/pagecontroller/pagecontroller.php 	1737
APF\core\pagecontroller\APFObject->getDIServiceObject() 	/var/www/auto/controller/AutoController.php 	36
APF\core\service\DIServiceManager::getServiceObject() 	/var/www/APF/core/pagecontroller/pagecontroller.php 	532
APF\modules\genericormapper\data\BaseMapper->setup() 	/var/www/APF/core/service/DIServiceManager.php 	304
APF\modules\genericormapper\data\BaseMapper->createDatabaseConnection() 	/var/www/APF/modules/genericormapper/data/BaseMapper.php 	219
APF\core\database\ConnectionManager->getConnection() 	/var/www/APF/modules/genericormapper/data/BaseMapper.php 	205 
(Teilweise werden hier im Forum die \ in den Bereichen use und namespace entfernt, woran das liegt weiß ich nicht. Auch einige ' sind hier verschwunden.)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: GORM 2.0: Einrichten mittels DIServiceManager

Beitrag von dr.e. » 09.12.2013, 23:21:14

Hallo ma2604121,

das beschriebene Verhalten ist nach weiterer Analyse ein Bug. Hier wird trotz DI-Konfiguration versucht auf "herkömmliche" Art eine Datenbank-Verbindung zu erstellen.

Als Workaround schlage ich folgendes vor:

Code: Alles auswählen

protected function createDatabaseConnection() {
   if ($this->dbDriver === null) {
      $cM = & $this->getServiceObject('APF\core\database\ConnectionManager');
      /* @var $cM ConnectionManager */
      $this->dbDriver = & $cM->getConnection($this->connectionName);
   }
} 
Zusätzlich bitte den Service-Typ des GORM auf "SINGLETON" setzen, damit dieser in der Session nicht gecached wird (kollidiert zusätzlich mit der __wakeup()-Implementierung. Darf ich dich bitten für das Issue unter http://tracker.adventure-php-framework. ... t_page.php einen Defect zu eröffnen? Material einfach reinkopieren und dann kümmert sich jemand um die Behebung in 2.0.
Viele Grüße,
Christian

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM 2.0: Einrichten mittels DIServiceManager

Beitrag von ma2604121 » 09.12.2013, 23:29:10

Hallo Chrisitian,

danke für die Hilfe! D.h. der von Dir gepostete Code kommt in meinen Controller und darüber baue ich die Verbindung zur Datenbank auf?

Ich war auf der Seite, die Du gepostet hast:
Was soll ich dort genau eintragen (Reproduzierbar, Auswirkung, Priorität, Produktversion -> nur 1.17 wählbar)?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: GORM 2.0: Einrichten mittels DIServiceManager

Beitrag von dr.e. » 10.12.2013, 00:10:53

Hallo ma2604121,
D.h. der von Dir gepostete Code kommt in meinen Controller und darüber baue ich die Verbindung zur Datenbank auf?
Emtschuldige bitte, hier war ich nicht präziese genug. Der Code kommt in den BaseMapper - dort findest du auch die entsprechende Methode. Lediglich das if ist provisorisch neu.
Was soll ich dort genau eintragen (Reproduzierbar, Auswirkung, Priorität, Produktversion -> nur 1.17 wählbar)?
Kategorie: Bug
Reproduzierbar: immer
Auswirkung: schwer Fehler
Prio: hoch
Produktversion: 1.17
Zielversion: 2.0
Viele Grüße,
Christian

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM 2.0: Einrichten mittels DIServiceManager

Beitrag von ma2604121 » 10.12.2013, 14:06:54

Ich habe es eingestellt. Hoffe, dass das soweit alles passt.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: GORM 2.0: Einrichten mittels DIServiceManager

Beitrag von dr.e. » 10.12.2013, 18:20:11

Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste