PHP Sammelthread: Zend Framework und alles was dazugehört

Du könntest einen Default-Wert festlegen, dann matcht die Route.

Ob das der korrekte Weg ist, kann ich dir nicht sagen, weil ich nicht weiß was da nun bei dir dahintersteckt (also ob Default-Werte logisch sind)
 
Jo, das passt so, danke :)

Und schon die nächste Frage :ugly:
Für meine bestehenden Projekte hatte ich eine Klasse, womit ich die Fehlermeldungen an den User einfach ausgeben konnte. Ich habe ein Array mit den Fehlern an eine Klasse übergeben, und die hat mir dann nen grafisch verschönerten HTML-Code für die Meldungen zurückgegeben, was ich dann bequem ans Templatesystem weitergereicht habe. Jeztt ist die Frage, ob es sowas fürs Zend Framework bereits fertig gibt oder ob ich mir da selber was schreiben muss?
 
Gar nicht!
Ein Benutzer des Systems darf niemals nie Informationen bekommen, welche Fehler in einem System auftreten.
Wenn deine User eine Blinde SQL-Injection ausführen, und es kommt eine Fehlermeldung in der du sagst, dass ein Fehler mit der Datenbank aufgetreten ist, wissen sie ja schon, dass sie auf dem richtigen Weg sind!

Nimm einfach den ErrorHandler des ErrorControllers und sage bei einer Exception, dass ein Fehler aufgetreten ist. (Bei NoController und NoAction leitest du einfach auf die Startseite)
 
Hehe, das meint ich gar nicht und sowas sag ich dem User auch nicht :)

Ich meine einfach nur Meldungen wie, der User wurde nicht gefunden etc. ;) Aber manchmal will ich bei bestimmten Aktionen auch mehrere Meldungen ausgeben, da hat meine alte Klasse aus nem Array ne Liste gebaut und das konnte ich dann mit einer Zeile generieren. Das war bequemer als jedesmal das alles neu zu schreiben :mrgreen:
 
Neija du solltest dann schon spezifizieren, was du als Fehler verstehst.

Meine Auffassung: Eine Ausnahme, welche den normalen Programmfluss abbricht. Als Beispiel eine Exception, da springt dann der ErrorController an.

Wenn ich dem User sagen möchte, dass ein User nicht gefunden wurde, gibt es ja mehrere Möglichkeiten:
  1. Er hat den Usernamen in einem Formular eingegeben:
    • Bei einem Login, werde ich ihm kaum sagen, dass es den User nicht gibt (Informationsleck). Hier werde ich ihm nur mitteilen, dass die Username-Passwort-Kombination falsch ist.
    • (bezogen auf Loseseiten:) Sollte er einem anderen User Lose schicken wollen, dann kann dies ein Formular-Validator übernehmen (Zend_Validate_Db_NoRecordExists oder ein eigener).
  2. Die Eingabe kam aus einer URL:
    • Hier regel ich es meist so, dass dies als Malicious-Input (also ein gewollter Angriff) gewertet wird, und ich darauf reagiere.
      Also zuerst einmal in der Controller-Action-Hierarchie soweit den Request zurück-forwarden, von wo der Request gekommen sein kann.
      Bei der Entscheidung ob der Request noch geloggt wird (oder ähnliches), ist entscheidend, ob es wirklich ein Versehen sein kann oder man direkt weiß, dass dies ein gewollter Angriff ist.
 
Immer noch nicht ganz genau das, was ich meine. Egal, komm ich später nochmal drauf zurück, jetzt erstmal ne andere Frage :p

Ich erstell mit folgendem Befehl eine Url:
PHP:
<?php echo $this->url(array('page' => $page), 'suche'); ?>
Die URL sieht dann wie folgt aus /suche/12345, das entspricht der aktuellen URL. Das page wird komplett ignoriert :-? Ich habe auch schon einige Variationen versucht, aber es klappt einfach nicht.

PHP:
<?php echo $this->url(array('controller' => 'suche', 'page' => $page), 'suche'); ?>
<?php echo $this->url(array('controller' => 'index', 'action' => 'suche', 'page' => $page), 'suche'); ?>
<?php echo $this->url(array('controller' => 'index', 'action' => 'suche', 'page' => $page)); ?>
<?php echo $this->url(array('controller' => 'index', 'action' => 'suche', 'page' => $page), null, true); ?>

Aber immer wird das page einfach ignoriert. $page ist auch nicht leer!

Hat jemand ne Idee?
Und zum Code von oben, wenn ich ne Route habe, ist das richtig, dass ich den Controller dann als suche angebe, obwohl der Controller in wirklichkeit ja ein ganz anderer ist? (von der URL her wärs ja nur quasi der Controller)
 
Zuletzt bearbeitet:
PHP:
<?php echo $this->url(array('page' => $page), 'suche'); ?>
Die URL sieht dann wie folgt aus /suche/12345, das entspricht der aktuellen URL. Das page wird komplett ignoriert :-? Ich habe auch schon einige Variationen versucht, aber es klappt einfach nicht.

Also mit Standard-Route funktionierts bei mir so:

PHP:
<?php
echo $this->url(array('controller' => 'foo', 'action' => 'bar', 'page' => 12345));
Ohne es jetzt getestet zu haben, aber wenn du wirklich mit deiner eigenen Route arbeiten willst, musst du page wahrscheinlich darin definieren :think:

Controller bleibt suche, das Routen auf den richtigen Controller übernimmt ja die Route ;)
 
PHP:
<?php
echo $this->url(array('controller' => 'foo', 'action' => 'bar', 'suche' => 12345, 'page' => 3));
?>
Dann halt so:ugly:

Gibt bei mir das aus:

public/foo/bar/suche/12345/page/3

public weil ich ZF in ein paar Unterordnern ausführe ;)
 
Dann klappt es. Aber dann will der den Parameter page ja immer haben. Gibt es da ne Möglichkeit den nur optional zu verlangen?
 
Gibt es da ne Möglichkeit den nur optional zu verlangen?

Wieder nen Default-Wert festlegen? :think:

Alternativ könntest du ja auch noch versuchen, mittels Default-Route zu routen. Nur wie man die angiebt weiß ich noch nicht. Ich teste mal eben8)

EDIT: Gib mal als 2. Parameter einfach 'default' an, vl. gehts dann :mrgreen:
 
Zuletzt bearbeitet:
ne blöde idee:
an das Ende der Routen-Definition vllt ein Stern anhängen?

also statt:
Code:
foo/bar/:suchid
dieses:
Code:
foo/bar/:suchid/*
vllt übernimmt er dann den page-Parameter als Key-Value-Paar. Aber eigentlich sollte er das doch glaube ich immer übernehmen es seidenn in deiner Route wurde :page definiert oder ?
 
Also ich hatte page vorher nicht definiert - erst nachher.
Ich hab das jetzt mal mit dem * versucht, jetzt wird der Parameter aber vollständig ignoriert :-?

Die Lösung von gestern ist aber auch nicht so das ware, wie ich nachher gemerkt habe. Der Page Parameter muss nämlich angegeben werden, ich dachte zwischendurch der wäre es nicht. Ich hab das jetzt so (unsauber) gelöst.

PHP:
$route = new Zend_Controller_Router_Route('suche/:zipcode/:seite/:page',
	array(
		'module' => 'default',
		'controller' => 'index',
		'action' => 'suche',
		'zipcode' => 0,
		'seite' => 'page',
		'page' => 1
	)
);

seite kann also alles sein, oder auch leer. Ist aber glaub ich unschön oder? :-?
 
Also ich habe es heute auch mal ausprobiert, du musst scheinbar wirklich ne neue Route anlegen, wenn du mit dem Url-ViewHelper die URL zusammenstellen willst, dabei aber eine Route verwenden und etwas hinzufügen willst.
 
So, ich habe heute mal einen interessantes Projekt zum Vorstellen:
ZendCasts - engl. Webcasts über das ZendFramework

die momentanen Themen sind z.B.:
  • Unit Testing
  • Zend_Navigation
  • Introduction to Zend (Framework) 1.8
  • und und und

Die Qualität der Feeds (nicht die Videoqualität, der Inhalt :p) soll wohl durchaus ganz gut sein, ich habe mir noch keinen angeschaut, da ich zu ungeduldig bin mir einen 40 Minuten Feed über UnitTesting anzusehen, wenn ich zichmal schneller das Manual gelesen habe :biggrin: