PHP Klassenkonstanten Existenz prüfen

strolch00

redraft.de
ID: 155297
L
21 April 2006
1.684
72
Hi @all,

also ich hab nen Problem mit Klassenkonstanten. Und zwar möchte ich mit folgender Methode die Existenz prüfen und den richtigen String zurückbekommen.

PHP:
	protected function _getUrl()
	{
		$bool = defined(self::URL);
		Zend_Debug::dump($bool);
		if($bool == TRUE) {
			return self::URL;
		}
		return '';
	}

Ich habe schon gegoogled und probiert aber alles ohne Erfolg, was mich nur wundert das der aktuelle Code kein FALSE liefert sondern folgenden Fehler
PHP schrieb:
Fatal error: Undefined class constant 'URL' in G:\xampp\htdocs_paid4Zf\library\Project\Form\Abstract.php on line 113
 
defined ist auch nicht für Klassenkonstanten sondern für Konstanten da.
Zu welchem Zweck brauchst du das denn? kommt mir irgendwie wie verkrüppeltes Klassendesign vor.

Die Reflection-API wäre die Lösung, falls du den Weg wirklich weitergehen möchtest.
 
Hi Ice, also um es kurz zu sagen, ich bin dabei was zu realisieren was ich auf php-security oder so gelesen hatte. Und zwar Geht es konkret um das ZF und Zend_Form::setAction().

Ich habe gelesen das man in action="" nicht PHP_SELF machen soll, weil das ein Sicherheitsrisiko darstellt. Also dachte ich mir nehme ich $this->_request->getRequestUrl(); nur dabei ist das Problem, im Zusammenspiel mit Zend_Auth das bei nicht ausreichenden Rechten intern umgeleitet wird.

Also Beispiel: User greift auf /account/profil zu dabei bleibt diese Url stehen und er wird intern auch /account/login geleitet weil er nocht nicht eingeloggt ist.

In diesem Fall bring getRequestUrl() logischerweise, /account/profil anstatt /account/login wo ja das Form verarbeitet wird.

Also dachte ich mache ich es mit einer Konstante und nu häng ich bei diesem Problem, kann auch einfach sein das ich nen Denkfehler habe und du hast evtl. nen besseren Ansatz.

Noch als Hinweis, alle Forms erben von Project_Form_Abstract wo in dessen Constructor immer die mindest Daten wie method und action gesetzt werden, jedoch mit den eigentlichen Formoptions überschrieben werden können.

*edit
Mein erster Ansatz war auch die Prüfung per isset() was normal keinen Fehler werfen sollte, aber das geht erstrecht nicht, da bekam ich immer
Parse error: parse error, expecting `'('' in G:\xampp\htdocs_paid4Zf\library\Project\Form\Abstract.php on line 113
was in meinen Augen eigentlich gar keinen Sinn macht, bei folgendem Code
PHP:
	protected function _getUrl()
	{
		if(isset(self::URL)) {
			return self::URL;
		}
		return '';
	}
 
Ich habe gelesen das man in action="" nicht PHP_SELF machen soll, weil das ein Sicherheitsrisiko darstellt. Also dachte ich mir nehme ich $this->_request->getRequestUrl(); nur dabei ist das Problem, im Zusammenspiel mit Zend_Auth das bei nicht ausreichenden Rechten intern umgeleitet wird.
wenn du für die action einen leeren String übergibst, bedeutet das in HTML das Gleiche wie PHP_SELF, nur mit dem Unterschied, dass keine XSS-Angriffe mögliche sind.


Also Beispiel: User greift auf /account/profil zu dabei bleibt diese Url stehen und er wird intern auch /account/login geleitet weil er nocht nicht eingeloggt ist.

In diesem Fall bring getRequestUrl() logischerweise, /account/profil anstatt /account/login wo ja das Form verarbeitet wird.
da würde dir aber auch PHP_SELF nicht helfen, das ist einzig und alleine nen Denkfehler.
Entweder du leitest wirklich per HHTP auf /Account/login weiter oder du forwardest den Request auf die Login-Seite wo dann die Überprüfung stattfinden kann.

Also dachte ich mache ich es mit einer Konstante und nu häng ich bei diesem Problem, kann auch einfach sein das ich nen Denkfehler habe und du hast evtl. nen besseren Ansatz.
ich setze meine URLs direkt im Form, da habe ich das Problem nicht.
 
ich setze meine URLs direkt im Form, da habe ich das Problem nicht.

Und genau das wollte ich standardmäßig machen, nur hab ich nach ewigen google Versuchen und Studieren des Manuals kein Plan wie ich an so einen intern dispatchte "url" rankommen kann. Sowas gibt es nicht oder?

Wenn nein dann werde ich es so machen, das ich die Action direkt in der Form setzte. Ich hatte das ursprünglich mal implementiert für den Fall das ich es in der Form vergesse und hätte es funktioniert dann hätte es das Entwickeln noch ein bisschen einfacher gemacht.

Btw: Umleitung erfolgt im Plugin so
PHP:
$_request->setModuleName('default')
	     ->setControllerName('account')
	     ->setActionName(Project_Acl::isGuest(Project_Auth::getRole()) ? 'login' : 'forbidden');