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?

Antworten:


211

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

@extends('master', ['title' => $title])

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])

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.


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!


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');

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';

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')
...

@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'));
}

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.


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"
]
*/

-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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.