Comment passer une variable à la mise en page en utilisant le modèle Blade de Laravel?

91

Dans Laravel 4, mon contrôleur utilise une disposition Blade:

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

La mise en page principale a produit le titre de la variable, puis affiche une vue:

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

Cependant, dans mon contrôleur, il semble que je ne puisse transmettre des variables qu'à la sous-vue, pas à la présentation. Par exemple, une action pourrait être:

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

Cela ne passera la $titlevariable qu'à la section de contenu de la vue. Comment puis-je fournir cette variable à l'ensemble de la vue, ou à tout le moins à la mise en page principale?

Dwight
la source

Réponses:

217

Si vous utilisez @extendsdans votre mise en page de contenu, vous pouvez utiliser ceci:

@extends('master', ['title' => $title])
s3v3n
la source
1
Il m'a fallu beaucoup de recherches sur Google pour trouver ça! C'est juste cette syntaxe que vous devez être parfaite et les documents ne montrent pas toutes ces subtilités. Je veux dire que c'est ce que disent les documents officiels @component('alert', ['foo' => 'bar'])......
Arthur Tarasov
Je fais cela et j'obtiens une erreur non définie sur la page de mise en page. Des idées?
LucyTurtle
45

Pour les futurs Google qui utilisent Laravel 5, vous pouvez désormais également l'utiliser avec des inclusions,

@include('views.otherView', ['variable' => 1])
Chilion
la source
c'est ce que je cherche pour enfin créer une application basée sur des composants sur laravel, merci!
Ron Michael
si je passe seulement ["un"], comment puis-je l'obtenir dans le modèle?
Javier J Solis Flores
20

J'ai pu résoudre ce problème en ajoutant ceci à ma méthode de contrôleur:

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

$ this-> layout-> title = 'Page d'accueil'; n'a pas fonctionné non plus.

Tim Truston
la source
Cela a fonctionné pour moi dans laravel 5.1. Le moyen le plus simple de résoudre le problème.
CodeChuck
16

Dans le modèle de lame: définissez une variable comme celle-ci

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

Et dans l'app.blade.php ou tout autre de votre choix (je suis juste la configuration par défaut de Laravel 5)

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

Ceci est ma première réponse ici. J'espère que ça marche Bonne chance!

Rohan Krishna
la source
Cela m'a permis de gagner quelques heures ..! Je l'ai utilisé dans Laravel 5.4 et cela fonctionne très bien .. Merci pour la réponse ...
Saiyan Prince
2
Je devais faire:{{ $title ?? 'Default Title' }}
Damien Ó Ceallaigh
5

Le moyen le plus simple de résoudre:

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

Ou en utilisant View Facade:

use View;

...

View::share('title', 'My Title Here');
Efra
la source
puis-je l'exécuter dans un middleware de route?
mukade
4

Il semble que je puisse transmettre des variables à l'ensemble de la mise en page en utilisant des attributs sur l'objet de mise en page, par exemple pour résoudre mon problème, j'ai pu faire ce qui suit:

$this->layout->title = 'Home page';
Dwight
la source
8
Cela n'a pas fonctionné pour moi. J'obtiens actuellement une erreur indiquant qu'elle n'existe pas en tant que variable.
Adam Libonatti-Roche
où puis-je trouver l'objet de mise en page?
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');
    }
}

Dans le fichier de modèle de lame, N'OUBLIEZ PAS d'utiliser @ devant la variable.

...
<title>{{ $title or '' }}</title>
...
@yield('content')
...
Shiro
la source
@YevgeniyAfanasyev, cette question que vous devriez poser au propriétaire du message. Je fais simplement référence à son codage. Un peu bizarre tu me demandes de retour .... Et cela a été répondu en 2014. Bien sûr, je faisais référence à la version qu'il demandait qui est Laravel 4.
Shiro
0

Tu peux essayer:

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

essayez simplement cette méthode simple: dans le contrôleur: -

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

Et dans votre mise en page (app.blade.php):

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

C'est tout.

Décodage Web
la source
Pouvez-vous expliquer comment cela résout le problème? Et quelle nouveauté cela apporte-t-il au-delà des réponses précédentes (particulièrement acceptées)?
gst
Bienvenue à SO! Lorsque vous placez une réponse, même si elle est correcte, vous devez l'expliquer un peu, et dans votre cas, comme il y en a une similaire, essayez d'expliquer les avantages et les inconvénients de votre réponse.
David García Bodego
0

si vous voulez obtenir les variables des sections, vous pouvez payer comme ceci:

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

Je l'ai fait jusqu'à présent parce que j'avais besoin à la fois de la vue et du fichier maître. Il semble que si vous n'utilisez pas $ this-> layout-> title, il ne sera pas disponible dans la mise en page principale. Les améliorations sont les bienvenues!

Anthony Vipond
la source