Wie übergebe ich eine Variable mithilfe von Laravel 'Blade-Vorlagen an das Layout?

87

In Laravel 4 verwendet mein Controller ein Blade-Layout:

class PagesController extends BaseController {
    protected $layout = 'layouts.master';
}

Das Master-Layout hat den Variablentitel ausgegeben und zeigt dann eine Ansicht an:

...
<title>{{ $title }}</title>
...
@yield('content')
....

In meinem Controller kann ich jedoch anscheinend nur Variablen an die Unteransicht übergeben, nicht an das Layout. Eine Aktion könnte beispielsweise sein:

public function index()
{
    $this->layout->content = View::make('pages/index', array('title' => 'Home page'));
}

Dadurch wird die $titleVariable nur an den Inhaltsbereich der Ansicht übergeben. Wie kann ich diese Variable für die gesamte Ansicht oder zumindest für das Master-Layout bereitstellen?

Dwight
quelle

Antworten:

211

Wenn Sie @extendsin Ihrem Inhaltslayout verwenden, können Sie Folgendes verwenden:

@extends('master', ['title' => $title])
s3v3n
quelle
1
Ich habe viel gegoogelt, um das zu finden! Es ist nur diese Syntax, die Sie perfekt machen müssen, und Dokumente zeigen nicht alle diese Feinheiten. Ich meine, das sagen offizielle Dokumente @component('alert', ['foo' => 'bar'])......
Arthur Tarasov
Ich mache das und erhalte einen undefinierten Fehler auf der Layoutseite. Irgendwelche Ideen?
LucyTurtle
45

Für zukünftige Google-Benutzer, die Laravel 5 verwenden, können Sie es jetzt auch mit Includes verwenden:

@include('views.otherView', ['variable' => 1])
Chilion
quelle
Das ist es, wonach ich suche, um endlich eine komponentenbasierte Anwendung auf Laravel zu erstellen. Danke!
Ron Michael
Wenn ich nur ["eins"] übergebe, wie bekomme ich es in die Vorlage?
Javier J Solis Flores
20

Ich konnte dieses Problem lösen, indem ich dies meiner Controller-Methode hinzufügte:

    $title = 'My Title Here';
    View::share('title', $title);

$ this-> layout-> title = 'Homepage'; hat auch nicht funktioniert.

Mwirabua Tim
quelle
Dies hat bei mir in Laravel 5.1 funktioniert. Der einfachste Weg, um das Problem zu lösen.
Chuy
16

In der Blade-Vorlage: Definieren Sie eine Variable wie diese

@extends('app',['title' => 'Your Title Goes Here'])
@section('content')

Und in der app.blade.php oder einer anderen Ihrer Wahl (ich folge nur dem Standard-Laravel 5-Setup)

<title>{{ $title or 'Default title Information if not set explicitly' }}</title>

Dies ist meine erste Antwort hier. Hoffe es funktioniert. Viel Glück!

Rohan Krishna
quelle
Das hat mir geholfen, ein paar Stunden zu sparen ..! Verwendet es in Laravel 5.4 und es funktioniert großartig. Danke für die Antwort ...
Saiyajin Prinz
2
Ich musste tun:{{ $title ?? 'Default Title' }}
Damien Ó Ceallaigh
5

Einfachste Lösung:

view()->share('title', 'My Title Here');

Oder mit Ansicht Fassade:

use View;

...

View::share('title', 'My Title Here');
Efra
quelle
Kann ich es in einer Route Middleware ausführen?
Mukade
4

Es scheint, als ob ich mithilfe von Attributen für das Layoutobjekt Variablen an das gesamte Layout übergeben kann. Um beispielsweise mein Problem zu lösen, konnte ich Folgendes tun:

$this->layout->title = 'Home page';
Dwight
quelle
8
Das hat bei mir nicht funktioniert. Ich erhalte derzeit eine Fehlermeldung, dass es nicht als Variable existiert.
Adam Libonatti-Roche
Wo finde ich das Layoutobjekt?
Jewgenij Afanasjew
1
class PagesController extends BaseController {
    protected $layout = 'layouts.master';

    public function index()
    {
        $this->layout->title = "Home page";
        $this->layout->content = View::make('pages/index');
    }
}

Denken Sie in der Blade-Vorlagendatei daran, @ vor der Variablen zu verwenden.

...
<title>{{ $title or '' }}</title>
...
@yield('content')
...
Shiro
quelle
@YevgeniyAfanasyev, diese Frage sollten Sie dem Postbesitzer zurückstellen. Ich beziehe mich nur auf seine Kodierung. Irgendwie komisch fragst du mich zurück .... Und das wurde 2014 beantwortet. Natürlich bezog ich mich auf die Version, die er fragte, nämlich Laravel 4.
Shiro
0

Du kannst es versuchen:

public function index()
{
    return View::make('pages/index', array('title' => 'Home page'));
}
Melvin
quelle
0

Probieren Sie einfach diese einfache Methode aus: im Controller: -

 public function index()
   {
        $data = array(
            'title' => 'Home',
            'otherData' => 'Data Here'
        );
        return view('front.landing')->with($data);
   }

Und in Ihrem Layout (app.blade.php):

<title>{{ $title }} - {{ config('app.name') }} </title>

Das ist alles.

Webdecodierung
quelle
Können Sie erklären, wie dies das Problem löst? Und was Neues trägt es über die vorherigen (besonders akzeptierten) Antworten hinaus bei?
gst
Willkommen bei SO! Wenn Sie eine Antwort geben, sollten Sie sie, auch wenn sie in Ordnung ist, ein wenig erklären und in Ihrem Fall, da es eine ähnliche gibt, versuchen, die Vor- und Nachteile Ihrer Antwort zu erklären.
David García Bodego
0

Wenn Sie die Variablen von Abschnitten erhalten möchten, können Sie wie folgt bezahlen:

$_view      = new \View;
$_sections  = $_view->getFacadeRoot()->getSections();
dd($_sections);
/*
Out:
array:1 [▼
  "title" => "Painel"
]
*/
DEV Tiago França
quelle
-2
$data['title'] = $this->layout->title = 'The Home Page';
$this->layout->content = View::make('home', $data);

Ich habe dies bisher getan, weil ich sowohl in der Ansicht als auch in der Master-Datei brauchte. Wenn Sie $ this-> layout-> title nicht verwenden, ist es anscheinend nicht im Master-Layout verfügbar. Verbesserungen willkommen!

Anthony Vipond
quelle