2016-09-06 2 views
1

Ich bin ein bisschen verwirrt bei der Arbeit View Composer in Laravel und ich dachte, ich könnte einen Rat fragen.Laravel 5.3 View Composer - Ändern von Daten aus dem Controller zur Ansicht

Zum Beispiel hat meine Website Pläne, in Plänen Tabelle habe ich die übliche ID etc etc, aber ich habe auch 'space_allowed', die meine eine Zahl vertreten ist, habe ich 'unbegrenzt' als NULL dargestellt, so dass ich nicht muss ändere eine meiner (Anzahl) Funktionalitäten.

in meinem Controller Also, habe ich so etwas wie diese

$plans = Plan::where('is_active', 1)->get(); 
return view('pricing', ['plans' => $plans]); 

Nun, wenn im in der Ansicht nur ich über die Pläne @foreach und die Details ausspucken.

ABER, da im 'unbegrenzten' Raum als NULL zu speichern, spiegelt die Ansicht das wieder.

Also ich denke, dass, da es sich auf die ganze Website bezieht, es eine gute Idee wäre, zu überprüfen, ob der Wert null ist, und wenn es ist, gibt 'unlimited' zurück, und wenn der Wert nicht null ist, dann spuck es einfach wie an einem Ort aus.

Daher die Idee für den View-Composer.

So habe ich die ComposerServiceProvider.php erstellt, hinzugefügt, um das Boot und Methoden registrieren und innerhalb des Boot-Methode i folgendes haben:

View::composer('*', function ($view) { 
}); 

So denke ich fast dort im.

Aber im verloren, wie man den Code zu implementieren, die in diesem Verschluss geht zu überprüfen, ob die storage_allowed

Jede Hilfe wäre null ist sehr zu schätzen.

Antwort

2

Sie können dies nur im Hinblick Komponisten tun, indem Sie eine Menge Daten zu duplizieren, so tun, nur diese Prüfung in Blade-Vorlage:

@foreach ($plans as $plan) 
    .... 
    {{ empty($plan->space) ? 'Unlimited' : $plan->space }} 
    .... 
@endforeach 
+1

Ihr sehr gut, ich denke, das könnte meine beste Option sein ... Vielen Dank für das :) – BigJobbies

+0

@BigJobbies Als Alternative Sie eine 'getSpaceNiceAttribute könnte hinzufügen() 'Funktion auf Ihrem Plan, der die if-Anweisung enthält und dann verwenden Sie einfach $ plan-> space_nice', um den Wert in Ihren Vorlagen zu erhalten? – Hailwood

+0

@Hailwood - Das ist auch eine gute Idee, wenn Sie "auf Ihrem Plan" sagen, meinen Sie in der Plan-Modell-Datei? Gibt es eine Chance, dass du mir ein Beispiel geben kannst? – BigJobbies

2

Etwas, das manchmal nützlich ist, ist Attribut rein zur Anzeige hinzuzufügen. ich diese in der Regel postfix mit „nett“ so in Ihrem Fall oben

class Plan extends Model { 

    public function getSpaceNiceAttribute(){ 
     return is_null($this->space) ? 'Unlimited' : $this->space; 
    } 

} 

Dann in Ihrer Vorlage können Sie einfach {{ $plan->space_nice }}

Der Vorteil dieser Methode ist, dass es die Ausgabe konsistent überall hält müssen Sie diese Logik, anstatt es überall in Ihren Vorlagen zu replizieren und erlaubt mehr Bedingungen (zB wenn Sie "keine" anstelle von "0" anzeigen möchten, können Sie das in nur dieser Funktion machen und alle Ihre Vorlagen werden es widerspiegeln).

+0

Ohhhh, ich sehe ... das macht Sinn :) – BigJobbies

0

Wahrscheinlich ein bisschen spät für Sie, aber ich werde nur für zukünftige Referenz veröffentlichen. Was immer Sie von Ihrem Controller an die Ansicht übergeben, ist in der Closure zugänglich, auf die Sie in der Composer-Methode zugreifen. So zum Beispiel, wenn Sie eine Seite Variable haben, die Sie von der Steuerung entlang geführt würden Sie in der Lage, darauf zuzugreifen vom Verschluss wie folgt aus:

public function compose(View $view) 
{ 
    $page = $view->getData()['page']; 
    $data = ['menu' => $this->generateSideBarHTML($page)]; 
    $view->with($data); 
} 

Jetzt können Sie das $ Menü von Blade-Vorlage zugreifen . Für Ihr Beispiel würde es so etwas wie dieses:

public function compose(View $view) 
{ 
    $plans = $view->getData()['plans']; 
    //Iterate on the plans here... 
    $view->with($data); 
} 
Verwandte Themen