Como eu passo uma variável para o layout usando o template do Laravel 'Blade?

92

No Laravel 4, meu controlador usa um layout Blade:

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

O layout mestre produz o título da variável e, em seguida, exibe uma visualização:

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

No entanto, em meu controlador, só consigo passar variáveis ​​para a subvisualização, não para o layout. Por exemplo, uma ação pode ser:

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

Isso apenas passará a $titlevariável para a seção de conteúdo da visualização. Como posso fornecer essa variável para toda a visualização, ou pelo menos o layout mestre?

Dwight
fonte

Respostas:

218

Se estiver usando @extendsem seu layout de conteúdo, você pode usar isto:

@extends('master', ['title' => $title])
s3v3n
fonte
1
Levei muito pesquise no Google para encontrar isso! É exatamente essa sintaxe que você precisa para ficar perfeita e os documentos não mostram todas essas sutilezas. Quero dizer, isso é o que os documentos oficiais dizem @component('alert', ['foo' => 'bar'])...
Arthur Tarasov
Estou fazendo isso e estou recebendo um erro indefinido na página de layout. Alguma ideia?
LucyTurtle de
45

Para futuros Google's que usam o Laravel 5, agora você também pode usá-lo com inclusões,

@include('views.otherView', ['variable' => 1])
Chilion
fonte
é isso que estou procurando para finalmente criar um aplicativo baseado em componentes em laravel, obrigado!
Ron Michael
se eu só passar ["um"], como faço para colocá-lo no modelo?
Javier J Solis Flores
20

Consegui resolver esse problema adicionando isto ao meu método de controlador:

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

$ this-> layout-> title = 'Página inicial'; também não funcionou.

Tim Truston
fonte
Isso funcionou para mim no laravel 5.1. A maneira mais fácil de resolver o problema.
CodeChuck
16

No modelo Blade: defina uma variável como esta

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

E no app.blade.php ou qualquer outro de sua escolha (estou apenas seguindo a configuração padrão do Laravel 5)

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

Esta é minha primeira resposta aqui. Espero que funcione. Boa sorte!

Rohan Krishna
fonte
Isso me ajudou a economizar algumas horas ..! Usei no Laravel 5.4 e funciona muito bem .. Obrigado pela resposta ...
Saiyan Prince
2
Eu tive que fazer:{{ $title ?? 'Default Title' }}
Damien Bezborodow
5

Maneira mais simples de resolver:

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

Ou usando view Facade:

use View;

...

View::share('title', 'My Title Here');
Efra
fonte
posso executá-lo em um middleware de rota?
mukade
4

Parece que posso passar variáveis ​​para todo o layout usando atributos no objeto de layout, por exemplo, para resolver meu problema, fui capaz de fazer o seguinte:

$this->layout->title = 'Home page';
Dwight
fonte
8
Isso não funcionou para mim. Atualmente, recebo um erro informando que ele não existe como uma variável.
Adam Libonatti-Roche
onde posso encontrar o objeto de 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');
    }
}

No arquivo de modelo do Blade, LEMBRE-SE de usar @ na frente da variável.

...
<title>{{ $title or '' }}</title>
...
@yield('content')
...
Shiro
fonte
@YevgeniyAfanasyev, esta pergunta você deve perguntar ao proprietário do post Eu apenas refiro sua codificação. Meio estranho você me perguntar de volta ... E isso foi respondido em 2014. Claro que eu estava me referindo à versão que ele está perguntando que é o Laravel 4.
Shiro
1

se você deseja obter as variáveis ​​das seções, pode pagar assim:

$_view      = new \View;
$_sections  = $_view->getFacadeRoot()->getSections();
dd($_sections);
/*
Out:
array:1 [▼
  "title" => "Painel"
]
*/
DEV Tiago França
fonte
0

Podes tentar:

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

tente este método simples: no controlador: -

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

E em seu layout (app.blade.php):

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

Isso é tudo.

Web Decode
fonte
Você poderia explicar como isso resolve o problema? E com que novo ele contribui além das respostas anteriores (especialmente aceitas)?
gst
Bem-vindo ao SO! Ao colocar uma resposta, mesmo que esteja ok, você deve explicá-la um pouco e, no seu caso, como há uma semelhante, tente explicar os prós e os contras da sua resposta.
David García Bodego
-2
$data['title'] = $this->layout->title = 'The Home Page';
$this->layout->content = View::make('home', $data);

Eu fiz isso até agora porque precisava da visualização e do arquivo mestre. Parece que se você não usar $ this-> layout-> title, ele não estará disponível no layout mestre. Melhorias bem-vindas!

Anthony Vipond
fonte