Frage

Ich versuche, Ajax-spezifische Antworten von meinen Controllern zu generieren, indem ich die Methode Request::ajax() verwende, die einwandfrei funktioniert.Das einzige Problem ist, dass die Art und Weise, wie ich es derzeit eingerichtet habe, keine wirklich schöne Lösung darstellt.

Mein Controller:

class HomeController extends BaseController {

protected $layout = 'layouts/main';

public function __construct()
{
    $this->beforeFilter('auth');
}

public function getIndex()
{
    $view = View::make('content.home.index');
    if(Request::ajax()) return $view; //For ajax calls we only want to return the content to be placed inside our container, without the layout
    $this->layout->menu = 'content.menu';
    $this->layout->content = $view;
}

}

Daher muss ich jetzt für jede Methode, die ich in meinen Controllern definiere, das Code-Snippet hinzufügen, das nach einer AJAX-Anfrage sucht und eine einzelne Ansicht zurückgibt, wenn die Anweisung „true“ zurückgibt.

Dies führt zu meiner Frage, die wahrscheinlich mehr mit PHP als mit dem Framework zu tun hat.

Gibt es eine Möglichkeit, meine AJAX-Prüfung bei jedem Methodenaufruf auszuführen, ohne sie tatsächlich in die Methode einzufügen?Oder gibt es eine andere Lösung, um meinen Code trocken zu halten?

Dank im Voraus!

PS:Dies ist mein erster Beitrag zum Thema Stackoverflow. Sie können mich also gerne korrigieren, wenn ich Fehler gemacht habe

War es hilfreich?

Lösung

Erstellen Sie ein neues Barebone-Layout mit dem Namen „layouts/ajax“ (oder einem beliebigen Namen).

    <?php echo $content ?>

Überschreiben Sie dies in Ihrem Base-Controller setupLayout() Funktion.

protected function setupLayout()
{
    if ( ! is_null($this->layout))
    {
        $layout = Request::ajax() ? 'layouts/ajax' : $this->layout;
        $this->layout = View::make($layout);            
    }
}

Ändere dein getIndex() Funktion dazu.

public function getIndex()
{
    $view = View::make('content.home.index');
    $this->layout->menu = 'content.menu';
    $this->layout->content = $view;
}

Jetzt werden Nicht-Ajax-Anfragen mit gerendert layout im Controller festgelegt, wobei Ajax-Anfragen das erhalten, was festgelegt wurde $this->layout->content.

Notiz :Der Controller vernachlässigt die Layout-Einrichtung in setupLayout(), wenn die aufgerufene Methode einen wahrheitsgemäßen Wert zurückgibt.Daher funktioniert diese Methode nicht für Funktionen wie die folgenden.

public function getIndex()
{
    return View::make('content.home.index');
}

Andere Tipps

Sie können einfach die Layout-Eigenschaft in den Konstruktor ändern, wenn es sich um eine AJAX-Anforderung handelt:

generasacodicetagpre.

Wenn es nicht funktioniert, versuchen Sie es stattdessen auf NULL.

Warum würden Sie eine Ansicht über AJAX zurückgeben?Verwenden Sie es, um ein Spa zu erstellen?Wenn ja, gibt es bessere Wege.Ich bin im Allgemeinen gegen die Rückkehr von HTML über AJAX.

Die Route, die ich in Ihre Position gehen würde, ist wahrscheinlich das Gegenteil, wie Sie es tun.Rendern Sie die Ansicht, egal was, wenn die Anforderung Ajax ist, die zusätzlichen Daten zurückgeben und JS die Daten auf der Seite rendern lassen.Das ist im Wesentlichen, wie die meisten JavaScript-MVC-Frameworks funktionieren.

Es tut mir leid, wenn ich den Punkt hier total fehlt, nun mit der Annahme Ihres Endziels mit den von Ihnen angegebenen Informationen einzugehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top