Seite 1 von 1

Kein Zugriff auf Context

Verfasst: 07.01.2011, 04:23:04
von Thalo
Hi,

ist das gewollt, dass ich trotz

Code: Alles auswählen

$page = new Page();
$page->setContext('blah');
in von APFObject geerbten Objekten nur einen leeren Context bekomme? Ein

Code: Alles auswählen

$this->getContext();
ist jedesmal ohne Wert und

Code: Alles auswählen

$this->__getServiceObject('','');
findet bei mir nie die Konfigurationsfiles wegen fehlendem Context :roll:

Mach ich was falsch oder ist das ein Bug?

Ausserdem habe ich noch ein Problem mit dem ConnectionManager. Beim MySQLi Treiber werden mir merkwürdigerweise keine Fehler angezeigt. Tausche ich den MySQLi gegen den MySQL Treiber aus, bekomme ich auch wieder Fehler angezeigt. :?

Re: Kein Zugriff auf Context

Verfasst: 07.01.2011, 10:05:48
von dr.e.
Hallo Thalo,

theoretisch wird der Context in jedem Objekt, das von APFObject erbt propagiert. Das ist jedoch an die Bedingung geknüpft, dass jedes dieser Objekte über APF-Mechanismen (Page-Controller, ServiceManager, DIServiceManager) erzeugt wird. Wird die Kette irgendwo dazwischen unterbrochen, fehlt der Context. Sollte das in einem der genannten Mechanismen passieren, ist das ein Bug.

In welcher Konstellation tritt denn dieser Fehler auf?
Ausserdem habe ich noch ein Problem mit dem ConnectionManager. Beim MySQLi Treiber werden mir merkwürdigerweise keine Fehler angezeigt. Tausche ich den MySQLi gegen den MySQL Treiber aus, bekomme ich auch wieder Fehler angezeigt. :?
Wie sieht denn der Code dazu aus? Welche Version des APF nutzt du?

Re: Kein Zugriff auf Context

Verfasst: 07.01.2011, 14:57:14
von Thalo
Hi Doc,

danke für deine schnelle Rückmeldung.
theoretisch wird der Context in jedem Objekt, das von APFObject erbt propagiert. Das ist jedoch an die Bedingung geknüpft, dass jedes dieser Objekte über APF-Mechanismen (Page-Controller, ServiceManager, DIServiceManager) erzeugt wird. Wird die Kette irgendwo dazwischen unterbrochen, fehlt der Context. Sollte das in einem der genannten Mechanismen passieren, ist das ein Bug.

In welcher Konstellation tritt denn dieser Fehler auf?
War wohl gestern schon zu spät, hab den Fehler gefunden :)

Wie sieht denn der Code dazu aus? Welche Version des APF nutzt du?
Version: Experimental: APF 1.13-RC1

Es war vorerst nur ein Test daher gibts noch keinen wirklichen Code..

Code: Alles auswählen

class SimpleTestMapper extends APFObject {
    public function doSomeStuff() {
        $connectionManager = $this->__getServiceObject('core::database', 'ConnectionManager');
        $connectionManager->getConnection('connection');
        $connection->executeTextStatement('SELECT 1 FROM  testtable');

    }
}
Hier würde MySQLi nun stillschweigen und MySQL (wie erwartet) melden, dass die Tabelle nicht existiert.

Re: Kein Zugriff auf Context

Verfasst: 07.01.2011, 16:00:04
von dr.e.
Hi Thalo,
War wohl gestern schon zu spät, hab den Fehler gefunden :)
Dannn ist ja alles gut. :)
Hier würde MySQLi nun stillschweigen und MySQL (wie erwartet) melden, dass die Tabelle nicht existiert.
... was nicht der erste Unterschied zwischen der MySQLi- und MySQL-Extension von PHP wäre. Ich habe mir die Implementierung angesehen und diese scheint mir für beide Methoden sauber zu sein. Warum

Code: Alles auswählen

!empty($this->__dbConn->error) || !empty($this->__dbConn->errno)
kein true liefert ist mir schleierhaft. Ich schau mir das aber am Wochenende nochmal in Ruhe an und versuche das herauszufinden. Melde mich hier wieder.

Re: Kein Zugriff auf Context

Verfasst: 07.01.2011, 20:09:33
von dr.e.
Hallo Thalo,

das Verhalten des MySQLiHandler ist definitiv ein Bug. Innerhalb von empty() wird der Zugriff auf die öffnetliche Variable error bzw. errno der MySQLi-Connection nicht evaluiert. Das Verhalten ist mir für Methoden klar, nicht aber für Variablen, denn lt. Doku sollte der Zugriff auf Variablen aller Art funktionieren.

Ich habe das jedoch mit einem Workaround gelöst, in dem die Inhalte zuerst direkt ausgelesen und dann evaluiert werden. Mit Commit #1184 wirft der MySQLiHandler nun auch eine Exception.

Vielen Dank für den Hinweis! :)

Re: Kein Zugriff auf Context

Verfasst: 07.01.2011, 20:37:47
von Thalo
Hi Doc,
dr.e. hat geschrieben:Hallo Thalo,
das Verhalten des MySQLiHandler ist definitiv ein Bug. Innerhalb von empty() wird der Zugriff auf die öffnetliche Variable error bzw. errno der MySQLi-Connection nicht evaluiert. Das Verhalten ist mir für Methoden klar, nicht aber für Variablen, denn lt. Doku sollte der Zugriff auf Variablen aller Art funktionieren.
Warum ist das für Methoden klar? Könntest du mir den Auszug aus der Doku dazu posten? :)

Re: Kein Zugriff auf Context

Verfasst: 08.01.2011, 01:22:30
von dr.e.
Hi Thalo,

ich zittiere http://de2.php.net/empty:
Note:

empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).
Damit ist klar, dass ein

Code: Alles auswählen

$foo->getBar()
nicht funktionieren sollte. Laut user contributes notes (siehe http://de2.php.net/manual/en/function.empty.php#93117) sind Objekt-Attribute aber zulässig. In diesem Fall funktioniert ein
$this->__dbConn->error
aber offensichtlich genauso wenig. Warum erschließt sich mir zwar nicht, aber nunja. :roll:

Re: Kein Zugriff auf Context

Verfasst: 10.01.2011, 04:01:57
von Thalo
Hi,
aber offensichtlich genauso wenig. Warum erschließt sich mir zwar nicht, aber nunja. :roll:
Schleierhaft, dass PHP hier differenziert. Müsst man mal in die Sourcen schauen, eventuell ein Bug? Wenn nicht, sollte das jedenfalls mit in die Doku. :)

Re: Kein Zugriff auf Context

Verfasst: 10.01.2011, 11:29:17
von dr.e.
Hallo Thalo,

ich habe in den user contributed notes keinen Hinweis darauf gefunden, dass es nicht gehen sollte. Bugs sind dazu auch keine vorhanden - es sei denn ich habe einen übersehen. Werde bei Gelegenheit noch eine user contributed note anlegen, damit dieser Fall wenigstens dort auftaucht.