Come faccio a passare una variabile al layout utilizzando i modelli Blade di Laravel?


92

In Laravel 4, il mio controller utilizza un layout Blade:

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

Il layout principale ha come output il titolo della variabile e quindi mostra una vista:

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

Tuttavia, nel mio controller sembra che solo io sia in grado di passare variabili alla sottoview, non al layout. Ad esempio, un'azione potrebbe essere:

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

Questo passerà la $titlevariabile solo alla sezione del contenuto della vista. Come posso fornire quella variabile all'intera vista, o almeno al layout principale?

Risposte:


218

Se stai usando @extendsnel layout dei contenuti puoi usare questo:

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

1
Mi ci sono volute molte ricerche su Google per trovarlo! È solo questa sintassi che devi ottenere perfetta e i documenti non mostrano tutte queste sottigliezze. Voglio dire, questo è ciò che dicono i documenti ufficiali @component('alert', ['foo' => 'bar'])...
Arthur Tarasov

Lo sto facendo e ricevo un errore indefinito nella pagina di layout. Qualche idea?
LucyTurtle

45

Per i futuri Google che utilizzano Laravel 5, ora puoi anche usarlo con include,

@include('views.otherView', ['variable' => 1])

questo è quello che sto cercando per creare finalmente un'applicazione basata su componenti su laravel, grazie!
Ron Michael

se passo solo ["uno"], come lo ottengo nel modello?
Javier J Solis Flores

20

Sono stato in grado di risolvere il problema aggiungendo questo al metodo del controller:

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

$ this-> layout-> title = 'Home page'; non ha funzionato neanche.


Questo ha funzionato per me in laravel 5.1. Il modo più semplice per risolvere il problema.
CodeChuck

16

Nel Blade Template: definire una variabile come questa

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

E nell'app.blade.php o in qualsiasi altro a tua scelta (sto solo seguendo la configurazione predefinita di Laravel 5)

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

Questa è la mia prima risposta qui. Spero che funzioni Buona fortuna!


Questo mi ha aiutato a risparmiare poche ore ..! L'ho usato in Laravel 5.4 e funziona benissimo .. Grazie per la risposta ...
Saiyan Prince

2
Dovevo fare:{{ $title ?? 'Default Title' }}
Damien Bezborodow

5

Il modo più semplice per risolvere:

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

O usando la vista Facciata:

use View;

...

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

posso eseguirlo in un middleware di route?
mukade

4

Sembra che io possa passare variabili all'intero layout utilizzando gli attributi sull'oggetto layout, ad esempio per risolvere il mio problema sono stato in grado di fare quanto segue:

$this->layout->title = 'Home page';

8
Questo non ha funzionato per me. Al momento ricevo un errore che indica che non esiste come variabile.
Adam Libonatti-Roche

dove posso trovare l'oggetto 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');
    }
}

Nel file Blade Template, RICORDA di usare @ davanti alla variabile.

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

@YevgeniyAfanasyev, questa domanda dovresti chiedere al proprietario del post. Mi riferisco solo alla sua codifica. Un po 'strano se me lo chiedi ... E questa è stata risposta nel 2014. Ovviamente mi riferivo alla versione che chiedeva, che è Laravel 4.
Shiro

1

se vuoi ottenere le variabili delle sezioni puoi pagare in questo modo:

$_view      = new \View;
$_sections  = $_view->getFacadeRoot()->getSections();
dd($_sections);
/*
Out:
array:1 [▼
  "title" => "Painel"
]
*/

0

Puoi provare:

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

0

prova questo semplice metodo: nel controller: -

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

E nel tuo layout (app.blade.php):

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

È tutto.


Puoi spiegare come questo risolve il problema? E quale novità apporta oltre alle precedenti (specialmente accettate) risposte?
gst

Benvenuto in SO! Quando inserisci una risposta, anche se va bene, dovresti spiegarla un po ', e nel tuo caso, poiché ce ne sono una simile, prova a spiegare i pro ei contro della tua risposta.
David García Bodego

-2
$data['title'] = $this->layout->title = 'The Home Page';
$this->layout->content = View::make('home', $data);

L'ho fatto finora perché avevo bisogno sia della vista che del file principale. Sembra che se non usi $ this-> layout-> title non sarà disponibile nel layout principale. Miglioramenti benvenuti!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.