2010-11-20 4 views
4

Update: Ich schrieb einige falsche Aussagen über die Verwendung von Header in PHP; Also vergessen Sie diesen Teil :)CakePHP interne Umleitung vom Controller zu einem anderen Controller

Was ich will, ist zu holen und anzuzeigen eine Controller-Ansicht (mit Controller-Daten) von einem anderen Controller, ohne URL-Änderung im Browser.

Einige Details:

  1. Redirect den Job nicht tun, weil eine direkte Umleitung (via Browser) ist
  2. request nicht mir CSS und Bilder erlaubt richtig

zu holen Ich brauche diese Sache, weil ich einen Controller-Dispatcher habe, der intern zu den anderen Controllern umleitet.

Ich denke, die einzige (richtige) Lösung ist die Verwendung von routes.php in/config mit Router :: connect und dort die Logik, die in der Dispatcher-Controller war.

+1

"Internes Neuschreiben" wird normalerweise mit Routes durchgeführt. Was ist das Besondere an Ihrem "Controller Dispatcher", dass Sie mit Routen nicht dasselbe machen können? – deceze

+0

Wie Sie gesagt haben, ist die Lösung, die Interaktion zwischen Datenbank und Routes zu tun ... aber ich weiß nicht, ob es möglich ist – apelliciari

+0

Sie wollen Daten von einem Modell in einer Controller-Aktion in einem anderen Modell angezeigt? – Nigel

Antwort

12

ummm ... header() ist die Funktion für eine Weiterleitung, es sei denn, die PHP-Dokumentation ist falsch. (http://php.net/manual/en/function.header.php) Der Core in cakePHP verwendet Header für die Redirect-Funktion (siehe Zeilen 721 - 730 von cake/libs/controller.php).

Also ich bin mir nicht sicher, was Sie "wie normale PHP" meinen. CakePHP ist PHP, es ist nur auf objektorientiertem Code aufgebaut. Es ist keine Magie oder verdrehte Art, Dinge zu tun. Um eine Umleitung in Kuchen zu tun, können Sie einfach verwenden:

Und es wird die Funktion header() aufrufen.

Jetzt. Wenn Sie keine Weiterleitung verwenden (z. B. wenn Sie auf eine externe Site gehen), können Sie im Code header() aufrufen. Stellen Sie sicher, dass Sie den Ausgang setzen(); nach dem Header-Aufruf:

Es wird genauso wie redirect funktionieren. Es ist nur eine Menge unnötiger Zusatzarbeit. Beachten Sie, dass die Verwendung von Redirect den Domainnamen verwaltet und automatisch die URL für Sie erstellt.

+0

ja du hast recht Ich habe die Verwendung von Header verwechselt. Ich überarbeite die Frage so schnell wie möglich. Ich brauche etwas wie htaccess URL-Umleitung (und seine Transparenz) – apelliciari

+0

FYI Sie können Header verwenden, um zu relativen Pfaden zu gehen – apelliciari

2

Im Allgemeinen ist das Verbinden von URLs mit Controllern die Aufgabe von Routen. Wenn Ihre Logik ziemlich komplex ist und normale Routen es nicht schneiden, können Sie sogar Ihre eigene Route-Parser-Klasse schreiben, die komplexere Logik ausführt (das ist alles im Handbuch).

Wenn diese Routing-Logik Datenbankabfragen oder irgendeine andere Art von Steuerungslogik beinhaltet und zu sehr unterschiedlichen Ausgaben für dieselbe URL führen kann, basierend auf einem internen Status, machen Sie eine sehr RESTless Anwendung, die ich Ihnen abschicke sollte überdenken, was Sie versuchen zu tun. Abgesehen davon können Sie jede Ansicht von jeder Controller-Aktion mit $this->render() rendern. Die Steuerungslogik für jede Ansicht könnte in den AppController oder möglicherweise (teilweise) in die Modelle eingegeben werden, die von überall her aufgerufen werden. Anstatt also auf einen anderen Controller zu "umleiten", routet eine Route wie üblich nur zu einer bestimmten Controller-Aktion. Diese Aktion ruft dynamisch Code auf, den sie aufrufen muss, und rendert dann die Ansicht, die sie rendern muss.

Wenn Sie möchten, dass Ihre App auf derselben URL bleibt, aber sehr unterschiedliche Inhalte anzeigt, sollten Sie wahrscheinlich auch nachsehen, wie Sie eine AJAX-App erstellen.

Die richtige Lösung für Sie liegt wahrscheinlich irgendwo dazwischen.