Bagaimana cara mengirimkan variabel ke layout menggunakan Laravel 'Blade templating?

91

Di Laravel 4, pengontrol saya menggunakan tata letak Blade:

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

Tata letak master mengeluarkan judul variabel dan kemudian menampilkan tampilan:

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

Namun, di pengontrol saya, saya hanya tampak dapat meneruskan variabel ke subview, bukan tata letak. Misalnya, suatu tindakan bisa berupa:

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

Ini hanya akan meneruskan $titlevariabel ke bagian konten tampilan. Bagaimana cara memberikan variabel itu ke seluruh tampilan, atau setidaknya tata letak master?

Dwight
sumber

Jawaban:

217

Jika Anda menggunakan @extendstata letak konten Anda, Anda dapat menggunakan ini:

@extends('master', ['title' => $title])
s3v3n
sumber
1
Saya butuh banyak googling untuk menemukan ini! Ini hanya sintaksis yang Anda harus menjadi sempurna dan dokumen tidak menunjukkan semua kehalusan ini. Maksud saya, inilah yang dikatakan dokumen resmi @component('alert', ['foo' => 'bar'])......
Arthur Tarasov
Saya melakukan ini dan saya mendapatkan kesalahan yang tidak ditentukan pada halaman tata letak. Ada ide?
LucyTurtle
45

Untuk Google di masa mendatang yang menggunakan Laravel 5, Anda sekarang juga dapat menggunakannya dengan menyertakan,

@include('views.otherView', ['variable' => 1])
Chilion
sumber
inilah yang saya cari untuk akhirnya membuat aplikasi berbasis komponen di laravel, terima kasih!
Ron Michael
jika saya hanya lolos ["satu"], bagaimana cara mendapatkannya di template?
Javier J Solis Flores
20

Saya dapat menyelesaikan masalah itu dengan menambahkan ini ke metode pengontrol saya:

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

$ this-> layout-> title = 'Beranda'; tidak berhasil.

Tim Truston
sumber
Ini berhasil untuk saya di laravel 5.1. Cara termudah untuk menyelesaikan masalah.
CodeChuck
16

Di Template Blade: tentukan variabel seperti ini

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

Dan di app.blade.php atau pilihan Anda lainnya (Saya hanya mengikuti pengaturan Laravel 5 default)

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

Ini adalah jawaban pertama saya di sini. Semoga berhasil. Semoga berhasil!

Rohan Krishna
sumber
Ini membantu saya menghemat beberapa jam ..! Digunakan di Laravel 5.4 dan bekerja dengan baik .. Terima kasih atas jawabannya ...
Saiyan Prince
2
Saya harus melakukan:{{ $title ?? 'Default Title' }}
Damien Ó Ceallaigh
5

Cara termudah untuk menyelesaikannya:

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

Atau menggunakan tampilan Fasad:

use View;

...

View::share('title', 'My Title Here');
Efra
sumber
dapatkah saya menjalankannya di middleware rute?
mukade
4

Tampaknya seolah-olah saya dapat meneruskan variabel ke seluruh tata letak menggunakan atribut pada objek tata letak, misalnya untuk menyelesaikan masalah saya, saya dapat melakukan hal berikut:

$this->layout->title = 'Home page';
Dwight
sumber
8
Ini tidak berhasil untuk saya. Saat ini saya mendapatkan kesalahan yang menyatakan bahwa itu tidak ada sebagai variabel.
Adam Libonatti-Roche
di mana saya bisa menemukan objek layout?
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');
    }
}

Pada file Template Blade, INGAT menggunakan @ di depan variabel.

...
<title>{{ $title or '' }}</title>
...
@yield('content')
...
Shiro
sumber
@YevgeniyAfanasyev, pertanyaan ini harus Anda tanyakan kembali kepada pemilik postingan. Saya hanya mereferensikan kembali kodingnya. Agak aneh Anda bertanya kembali kepada saya .... Dan ini dijawab pada tahun 2014. Tentu saja saya mengacu pada versi yang dia tanyakan yaitu Laravel 4.
Shiro
0

Anda dapat mencoba:

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

coba saja metode sederhana ini: dalam pengontrol: -

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

Dan di tata letak Anda (app.blade.php):

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

Itu saja.

Dekode Web
sumber
Bisakah Anda menjelaskan bagaimana ini menyelesaikan masalah? Dan apa yang baru yang disumbangkannya di atas jawaban sebelumnya (yang diterima secara khusus)?
gst
Selamat datang di SO! Ketika Anda memberikan jawaban, meskipun tidak apa-apa, Anda harus menjelaskannya sedikit, dan dalam kasus Anda, karena ada yang serupa, coba jelaskan pro dan kontra dari jawaban Anda.
David García Bodego
0

jika Anda ingin mendapatkan variabel bagian, Anda dapat membayar seperti ini:

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

Saya telah melakukan ini sejauh ini karena saya membutuhkan file view dan master. Tampaknya jika Anda tidak menggunakan $ this-> layout-> title itu tidak akan tersedia di master layout. Perbaikan diterima!

Anthony Vipond
sumber