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?

Réponses:


217

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

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

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])

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.


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!


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');

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';

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')
...

@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'));
}

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.


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"
]
*/

-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!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.