Jak przekazać zmienną do układu za pomocą szablonu Laravel 'Blade?

91

W Laravel 4 mój kontroler używa układu Blade:

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

Układ główny wyprowadza tytuł zmiennej, a następnie wyświetla widok:

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

Jednak w moim kontrolerze wydaje mi się, że jestem w stanie przekazywać zmienne do widoku podrzędnego, a nie do układu. Na przykład działaniem może być:

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

Spowoduje to przekazanie $titlezmiennej tylko do sekcji zawartości widoku. Jak mogę dostarczyć tę zmienną do całego widoku lub przynajmniej do układu głównego?

Dwight
źródło

Odpowiedzi:

217

Jeśli używasz @extendsw układzie treści, możesz użyć tego:

@extends('master', ['title' => $title])
s3v3n
źródło
1
Znalezienie tego zajęło mi dużo googlowania! Tylko ta składnia musi być doskonała, a dokumenty nie pokazują wszystkich tych subtelności. Mam na myśli to, co mówią oficjalni doktorzy @component('alert', ['foo' => 'bar'])......
Arthur Tarasov
Robię to i na stronie układu pojawia się nieokreślony błąd. Jakieś pomysły?
LucyTurtle
45

Dla przyszłych użytkowników Google, którzy używają Laravel 5, możesz teraz używać go również z dołączeniami,

@include('views.otherView', ['variable' => 1])
Chilion
źródło
właśnie tego szukam, aby w końcu stworzyć aplikację opartą na komponentach na laravel, dzięki!
Ron Michael,
jeśli zdam tylko ["jeden"], jak mogę to umieścić w szablonie?
Javier J Solis Flores
20

Udało mi się rozwiązać ten problem, dodając to do mojej metody kontrolera:

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

$ this-> layout-> title = 'Strona główna'; nie zadziałało.

Tim Truston
źródło
To zadziałało dla mnie w Laravel 5.1. Najłatwiejszy sposób rozwiązania problemu.
CodeChuck
16

W szablonie ostrza: zdefiniuj taką zmienną

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

I w app.blade.php lub innym wybranym przez Ciebie (ja tylko podążam za domyślną konfiguracją Laravel 5)

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

To jest moja pierwsza odpowiedź. Mam nadzieję, że to zadziała. Powodzenia!

Rohan Krishna
źródło
Pomogło mi to zaoszczędzić kilka godzin ..! Użyłem go w Laravel 5.4 i działa świetnie. Dzięki za odpowiedź ...
Saiyan Prince,
2
Musiałem zrobić:{{ $title ?? 'Default Title' }}
Damien Ó Ceallaigh
5

Najprostszy sposób rozwiązania:

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

Lub używając widoku Fasada:

use View;

...

View::share('title', 'My Title Here');
Efra
źródło
czy mogę to wykonać w oprogramowaniu pośredniczącym tras?
mukade
4

Wygląda na to, że mogę przekazywać zmienne do całego układu za pomocą atrybutów w obiekcie układu, na przykład w celu rozwiązania mojego problemu udało mi się wykonać następujące czynności:

$this->layout->title = 'Home page';
Dwight
źródło
8
To nie zadziałało dla mnie. Obecnie pojawia się błąd informujący, że nie istnieje jako zmienna.
Adam Libonatti-Roche
gdzie mogę znaleźć obiekt układu?
Yevgeniy Afanasyev
1
class PagesController extends BaseController {
    protected $layout = 'layouts.master';

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

W pliku szablonu ostrza PAMIĘTAJ, aby umieścić znak @ na początku zmiennej.

...
<title>{{ $title or '' }}</title>
...
@yield('content')
...
Shiro
źródło
@YevgeniyAfanasyev, to pytanie powinieneś zadać właścicielowi posta. Po prostu odnoszę się do jego kodowania. Trochę dziwne, że pytasz mnie… A odpowiedź otrzymałem w 2014 roku. Oczywiście odnosiłem się do wersji, o którą pytał, czyli Laravel 4.
Shiro
0

Możesz spróbować:

public function index()
{
    return View::make('pages/index', array('title' => 'Home page'));
}
Melvin
źródło
0

po prostu wypróbuj tę prostą metodę: w kontrolerze: -

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

A w twoim układzie (app.blade.php):

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

To wszystko.

Dekodowanie sieciowe
źródło
Czy mógłbyś wyjaśnić, jak to rozwiązuje problem? I co nowego wnosi on poza poprzednie (szczególnie akceptowane) odpowiedzi?
gst
Witamy w SO! Kiedy umieścisz odpowiedź, nawet jeśli jest w porządku, powinieneś to trochę wyjaśnić, aw twoim przypadku, ponieważ jest jedna podobna, spróbuj wyjaśnić wady i zalety swojej odpowiedzi.
David García Bodego
0

jeśli chcesz uzyskać zmienne sekcji, możesz zapłacić w ten sposób:

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

Zrobiłem to do tej pory, ponieważ potrzebowałem zarówno widoku, jak i pliku głównego. Wygląda na to, że jeśli nie użyjesz $ this-> layout-> title, nie będzie on dostępny w głównym układzie. Mile widziane ulepszenia!

Anthony Vipond
źródło