[1.16] getServiceObject

Das Forum ist für das Melden von Bugs gedacht. // This forum is intended to report bugs with the APF.
jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

[1.16] getServiceObject

Beitrag von jprangenberg » 30.10.2012, 01:34:31

Hallo zusammen,

Auszug aus dem Migrationstext:

Code: Alles auswählen

$this->getServiceObject($namespace, $serviceName, APFService::SERVICE_TYPE_SINGLETON, $instanceId);  
Ich frage mich, wie ich die $instanceId übergeben soll, wenn die Methode getServiceObject() gar keine vierte Variable erlaubt:

Code: Alles auswählen

 protected function &getServiceObject($namespace, $serviceName, $type = APFService::SERVICE_TYPE_SINGLETON) {
      return ServiceManager::getServiceObject(
         $namespace, $serviceName, $this->getContext(), $this->getLanguage(), $type);
}  
Ist das ein Bug? Komme darauf, da ich zZ intensive Probleme mit meinem SessionSingleton-Handling habe! :mrgreen:

Lösungsvorschlag:

Code: Alles auswählen

 protected function &getServiceObject($namespace, $serviceName, $type = APFService::SERVICE_TYPE_SINGLETON, $instanceId = null) {
      return ServiceManager::getServiceObject(
         $namespace, $serviceName, $this->getContext(), $this->getLanguage(), $type, $instanceId);
}   
Würde den Bug auch gerne beheben und LIVE stellen!
Zuletzt geändert von jprangenberg am 30.10.2012, 10:33:28, insgesamt 4-mal geändert.

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

Re: [1.16] getServiceObject

Beitrag von dr.e. » 30.10.2012, 09:53:47

Hallo Jens,

danke für den Report! Ich würde diesen gerne direkt an Jan weitergeben, da er die Änderungen für 1.16 implementiert hat.

Ich bin mir jedoch einigermaßen sicher, dass deine Probleme damit nicht zusammenhängen. Kannst du zu diesen bitte in einem gesonderten Thread bitte Details posten?

@Jan: schaust du dir das Thema von Jens mal an? Danke dir!
Viele Grüße,
Christian

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: [1.16] getServiceObject

Beitrag von jprangenberg » 30.10.2012, 10:26:05

dr.e. hat geschrieben:Ich würde diesen gerne direkt an Jan weitergeben, da er die Änderungen für 1.16 implementiert hat.
Alles klar! Hätte meine Tests sonst eingecheckt!
dr.e. hat geschrieben:Ich bin mir jedoch einigermaßen sicher, dass deine Probleme damit nicht zusammenhängen. Kannst du zu diesen bitte in einem gesonderten Thread bitte Details posten?
Nach der Änderungen (siehe Lösungsvorschlag) läuft meine Software wieder wie gewollt!

Begründung:
Da keine $instanceId übergeben werden kann, ist diese automatisch immer "null".

Dadurch wird die $instanceId automatisch vom ServiceManager gesetzt.

Code: Alles auswählen

if ($instanceId === null) {
    $instanceId = $namespace . '::' . $serviceName . '|' . $context . '_' . $language;
} 
Daher komme ich, sofern ich einen anderen Namespace, Servicenamen, Context oder Language habe nicht mehr an diese SessionSingleton-Daten ran!

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

Re: [1.16] getServiceObject

Beitrag von dr.e. » 30.10.2012, 22:28:12

Hallo Jens,

ich habe immer noch nicht verstanden, wie deine Applikation tickt und warum diese Änderung tatsächlich einen Einfluss hat. Das würde ich gerne erst verstehen und analysieren ehe wir eine Änderung einchecken - auch wenn die Änderung natürlich schnell gemacht wäre.

Kannst du bitte den Code posten bei dem der Fehler passiert, sprich die Stellen, an denen du die Inhalte schreibst und auch diejenigen, die hinterher lesend darauf zugreifen. Die Implementierung des UmgtUserSessionStore funktioniert aktuell beispielsweise ohne Probleme in der Sandbox. Das Modul kann Daten schreiben und anschließend auch wieder auslesen.
Viele Grüße,
Christian

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: [1.16] getServiceObject

Beitrag von jprangenberg » 31.10.2012, 01:57:44

Hallo Christian,

wir haben hier generell zwei Probleme. Eins der Probleme ist, dass der Migrationstext aufjedenfall falsch ist. Es gibt keinen vierten Parameter ($instanceId) (getServiceObject Methode im pagecontroller.php)!

http://wiki.adventure-php-framework.org ... nd_Sprache

Zu meinem Problem:
Hier setze ich den User (LoginManager):

Code: Alles auswählen

$UserSessionStore = $this->getServiceObject('gametools::user::biz', 'UserSessionStore', APFService::SERVICE_TYPE_SESSION_SINGLETON);
$UserSessionStore->setUser($User); 
Hier erhalte ich den User (index.php):

Code: Alles auswählen

<?php
// Include pagecontroller
include_once('./apps/core/pagecontroller/pagecontroller.php');

// Import neccessary modules
import('core::frontcontroller', 'Frontcontroller');
import('core::singleton','SessionSingleton');
import('gtools::user::biz','UserSessionStore');

// Deactivate context
ConfigurationManager::retrieveProvider('ini')->setOmitContext(true); 

// Get instance of frontcontroller
$fC = Singleton::getInstance('Frontcontroller');
$fC->registerAction('actions','LanguageAction');

// Get instance of usersessionstore
$UserSessionStore = SessionSingleton::getInstance('UserSessionStore');

var_dump($UserSessionStore->getUser());

// Start request processing and sent result to client
echo $fC->start('sites::portal', 'index');

// Start processing benchmark report - only for programming
if(isset($_REQUEST['breport']) && $_REQUEST['breport'] == 'true')
{ 
    $t = &Singleton::getInstance('BenchmarkTimer'); 
    echo $t->createReport(); 
}
?>
Die Ausgabe ist wie erwartet nicht der User.

Code: Alles auswählen

object(UserSessionStore)#15 (6) { ["Store":"UserSessionStore":private]=> NULL ["__Attributes":protected]=> array(0) { } ["__Context":protected]=> NULL ["__Language":protected]=> string(2) "de" ["serviceType":protected]=> NULL ["isInitialized":protected]=> bool(false) } 

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

Re: [1.16] getServiceObject

Beitrag von dr.e. » 31.10.2012, 22:59:46

Hallo Jens,
wir haben hier generell zwei Probleme. Eins der Probleme ist, dass der Migrationstext aufjedenfall falsch ist. Es gibt keinen vierten Parameter ($instanceId) (getServiceObject Methode im pagecontroller.php)!
Absolut d'accord. Sollte mein Post wie ein Wiederspruch gewirkt haben, entschuldige bitte.

Ich schlage vor, dass sich das erste Thema Jan ansieht, da er das auch implementiert hat. Ich gebe dir absolut Recht, dass die in der Migrationsdoku aufgezeigten Inhalte nicht mit der Implementierung übereinstimmen.

@Jan: hattest du schon Zeit dir das anzusehen?
Zu meinem Problem:
Hier setze ich den User (LoginManager):
Danke für den Code. Das Problem ist für mich eindeutig: Du beziehst innerhalb des LoginManager über die Methode getServiceObject() korrekt den UserSessionStore. Die genannte Methode kapselt intern den Aufruf des ServiceManager und versorgt diesen mit Context, Sprache und der Umgebung. Daraus erzeugt der ServiceManager intern eine entsprechende Instanz-ID, unter der du die gewünschten Daten auch wieder einsehen/verändern kannst.

Mit dem Aufruf in der index.php nutzt du jedoch nicht den ServiceManager, sondern die SessionSingleton-Implementierung direkt. Diese liefert natürlich nicht das gewünschte Ergebnis, da der ServiceManager auf einer viel höheren Abstraktionsebene unterwegs ist als SessionSingleton selbst. Der Aufruf beinhaltet weder Context, Sprache noch Umgebung und kann daher verständlicherweise nicht zum selben Ergebnis führen.

Möchtest du auf den UserSessionStore zugreifen, muss dies immer mit dem zuerst geposteten Aufruf - also

Code: Alles auswählen

$this->getServiceObject('gametools::user::biz', 'UserSessionStore', APFService::SERVICE_TYPE_SESSION_SINGLETON); 
passieren.

Darf ich fragen, warum du in der index.php direkten Zugriff auf den UserSessionStore benötigst?
Viele Grüße,
Christian

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: [1.16] getServiceObject

Beitrag von jprangenberg » 01.11.2012, 07:30:40

dr.e. hat geschrieben:Danke für den Code. Das Problem ist für mich eindeutig: Du beziehst innerhalb des LoginManager über die Methode getServiceObject() korrekt den UserSessionStore. Die genannte Methode kapselt intern den Aufruf des ServiceManager und versorgt diesen mit Context, Sprache und der Umgebung. Daraus erzeugt der ServiceManager intern eine entsprechende Instanz-ID, unter der du die gewünschten Daten auch wieder einsehen/verändern kannst.

Mit dem Aufruf in der index.php nutzt du jedoch nicht den ServiceManager, sondern die SessionSingleton-Implementierung direkt. Diese liefert natürlich nicht das gewünschte Ergebnis, da der ServiceManager auf einer viel höheren Abstraktionsebene unterwegs ist als SessionSingleton selbst. Der Aufruf beinhaltet weder Context, Sprache noch Umgebung und kann daher verständlicherweise nicht zum selben Ergebnis führen.

Möchtest du auf den UserSessionStore zugreifen, muss dies immer mit dem zuerst geposteten Aufruf - also

Code: Alles auswählen

$this->getServiceObject('gametools::user::biz', 'UserSessionStore', APFService::SERVICE_TYPE_SESSION_SINGLETON); 
passieren.
Würde ich jedoch als vierte Methode eine $instanceId beim setzen des Users übergeben, könnte ich diese $instanceId in der index.php auch angeben und somit meinen gewünschten User erhalten, da durch angegebe $instanceId KEINE Sprache sowie KEIN Context gesetzt wird! ;-)
dr.e. hat geschrieben:Darf ich fragen, warum du in der index.php direkten Zugriff auf den UserSessionStore benötigst?
Dies war ein einfacher Test! :-)

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

Re: [1.16] getServiceObject

Beitrag von dr.e. » 01.11.2012, 13:31:32

Hallo Jens,
Würde ich jedoch als vierte Methode eine $instanceId beim setzen des Users übergeben, könnte ich diese $instanceId in der index.php auch angeben und somit meinen gewünschten User erhalten, da durch angegebe $instanceId KEINE Sprache sowie KEIN Context gesetzt wird! ;-)
Absolut klar. Das schaut sich jedoch Jan nochmal an.
Dies war ein einfacher Test! :-)
OK, dann versuche mal einen "richtigen" Anwendungsfall zu erstellen und du wirst sehen, dass das klappt.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: [1.16] getServiceObject

Beitrag von jwlighting » 02.11.2012, 18:02:40

Hallo Christian,
hallo Jens,
@Jan: hattest du schon Zeit dir das anzusehen?
Bin gerade erst aus dem Urlaub zurück ;)

Wenn ich das jetzt richtig analysiert habe, dann ist hier die Rede von APFObject::getServiceObject()? An der Methode habe ich ja gar nichts geändert, aber in der Tat - auch ich habe hier keinen Parameter für die instanceId. In ServiceManager::getServiceObject() ist der Parameter aber vorhanden!

Ich würde vorschlagen, den Lösungsvorschlag von Jens so zu übernehmen. In der Doku bin ich wohl davon ausgegangen, das der Parameter vorhanden ist - sorry!

Und vielen Dank fürs melden!!

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: [1.16] getServiceObject

Beitrag von jprangenberg » 02.11.2012, 18:42:03

Hallo Jan,

kein Problem! Spielst du das Update ein? Oder soll ich das übernehmen?

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: [1.16] getServiceObject

Beitrag von jwlighting » 02.11.2012, 19:12:56

Mach du mal, ich habe bisher noch keinen SVN-Zugang. Willst du Christians Rückmeldung noch abwarten?

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: [1.16] getServiceObject

Beitrag von jprangenberg » 02.11.2012, 20:32:38

Hallo Jan,

ich warte noch Christians Feedback ab!

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

Re: [1.16] getServiceObject

Beitrag von dr.e. » 02.11.2012, 23:36:54

Hallo Jan,

sorry für dich Hektik, ich hatte deinen Urlaub nicht mehr im Kopf - ist gerade viel los. :oops: Hoffe du hattest einen schönen Urlaub!
Ich würde vorschlagen, den Lösungsvorschlag von Jens so zu übernehmen. In der Doku bin ich wohl davon ausgegangen, das der Parameter vorhanden ist - sorry!
+1 Die Erweiterung sollte dann jedoch nicht nur für getServiceObject(), sondern auch gleich für getAndInitServiceObject() gelten.

@Jens: wenn du magst, nimm die Erweiterung vor. Ich reviewe dann den Code.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: [1.16] getServiceObject

Beitrag von jwlighting » 04.11.2012, 18:31:48

Ich gehe für die Dokumentation der Services in 1.16 jetzt mal davon aus, dass der Parameter $instanceId vorhanden ist, OK?

Code: Alles auswählen

class MyObject extends APFObject {
   function doSomething(){
      $myService =
         &$this->getServiceObject(
            $namespace,
            $serviceName,
            $type,
            $instanceId
         );
      $myService->doSomethingElse();
}
 

Code: Alles auswählen

class MyObject extends APFObject {
   function doSomething(){
      $initParam = 'foo';
      $myService =
         &$this->getAndInitServiceObject(
            $namespace,
            $serviceName,
            $initParam,
            $type,
            $instanceId
         );
      $myService->doSomethingElse();
}
 

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: [1.16] getServiceObject

Beitrag von dr.e. » 04.11.2012, 18:43:57

Passt für mich!
Viele Grüße,
Christian

Gesperrt

Wer ist online?

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