How do I pass a variable to the layout using Laravel' Blade templating?
LaravelLaravel 4BladeLaravel Problem Overview
In Laravel 4, my controller uses a Blade layout:
class PagesController extends BaseController {
protected $layout = 'layouts.master';
}
The master layout has outputs the variable title and then displays a view:
...
<title>{{ $title }}</title>
...
@yield('content')
....
However, in my controller I only appear to be able to pass variables to the subview, not the layout. For example, an action could be:
public function index()
{
$this->layout->content = View::make('pages/index', array('title' => 'Home page'));
}
This will only pass the $title
variable to the content section of the view. How can I provide that variable to the whole view, or at the very least the master layout?
Laravel Solutions
Solution 1 - Laravel
If you're using @extends
in your content layout you can use this:
@extends('master', ['title' => $title])
Note that same as above works with children, like:
> >@include('views.subView', ['my_variable' => 'my-value']) >
Usage
Then where variable is passed to, use it like:
<title>{{ $title ?? 'Default Title' }}</title>
Solution 2 - Laravel
For future Google'rs that use Laravel 5, you can now also use it with includes,
@include('views.otherView', ['variable' => 1])
Solution 3 - Laravel
In the Blade Template : define a variable like this
@extends('app',['title' => 'Your Title Goes Here'])
@section('content')
And in the app.blade.php or any other of your choice ( I'm just following default Laravel 5 setup )
<title>{{ $title or 'Default title Information if not set explicitly' }}</title>
This is my first answer here. Hope it works.Good luck!
Solution 4 - Laravel
I was able to solve that problem by adding this to my controller method:
$title = 'My Title Here';
View::share('title', $title);
$this->layout->title = 'Home page'; did not work either.
Solution 5 - Laravel
Simplest way to solve:
view()->share('title', 'My Title Here');
Or using view Facade:
use View;
...
View::share('title', 'My Title Here');
Solution 6 - Laravel
It appears as though I can pass variables to the entire layout using attributes on the layout object, for example to solve my problem I was able to do the following:
$this->layout->title = 'Home page';
Solution 7 - Laravel
class PagesController extends BaseController {
protected $layout = 'layouts.master';
public function index()
{
$this->layout->title = "Home page";
$this->layout->content = View::make('pages/index');
}
}
At the Blade Template file, REMEMBER to use @ in front the variable.
...
<title>{{ $title or '' }}</title>
...
@yield('content')
...
Solution 8 - Laravel
if you want to get the variables of sections you can pay like this:
$_view = new \View;
$_sections = $_view->getFacadeRoot()->getSections();
dd($_sections);
/*
Out:
array:1 [▼
"title" => "Painel"
]
*/
Solution 9 - Laravel
just try this simple method: in controller:-
public function index()
{
$data = array(
'title' => 'Home',
'otherData' => 'Data Here'
);
return view('front.landing')->with($data);
}
And in you layout (app.blade.php) :
<title>{{ $title }} - {{ config('app.name') }} </title>
Thats all.
Solution 10 - Laravel
Following is simple solution worked for me. In layout
<title>@yield('Page-Title') </title>
in your blade
@section('Page-Title')
Add {{ucFirst($payor->name)}}
@endsection
Solution 11 - Laravel
You can try:
public function index()
{
return View::make('pages/index', array('title' => 'Home page'));
}
Solution 12 - Laravel
$data['title'] = $this->layout->title = 'The Home Page';
$this->layout->content = View::make('home', $data);
I've done this so far because I needed in both the view and master file. It seems if you don't use $this->layout->title it won't be available in the master layout. Improvements welcome!