web-dev-qa-db-fra.com

Comment définir des variables dans un modèle de lame Laravel

Je lis Laravel Blade documentation et je ne sais pas comment affecter des variables dans un modèle pour une utilisation ultérieure. Je ne peux pas faire {{ $old_section = "whatever" }} parce que cela va faire écho à "n'importe quoi" et je ne le veux pas.

Je comprends que je peux faire <?php $old_section = "whatever"; ?>, mais ce n’est pas élégant.

Existe-t-il un moyen plus élégant d’élaborer un modèle de lame?

189
duality_

Il est déconseillé de le faire dans une vue, il n'y a donc pas de balise de lame pour celle-ci . Si vous souhaitez le faire dans votre vue de lame, vous pouvez simplement ouvrir une balise php comme vous l'avez écrit ou enregistrer une nouvelle balise de lame. . Juste un exemple:

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php ${1} ?>', $value);
});
105
TLGreg

LARAVEL 5.2 ET PLUS

Vous pouvez simplement utiliser:

@php ($i = 1)

Ou vous pouvez l'utiliser dans une déclaration de bloc:

@php
$i = 1
@endphp

LARAVEL 5

Étendre la lame comme ceci:

/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @define $variable = "whatever"
| </code>
|--------------------------------------------------------------------------
*/

\Blade::extend(function($value) {
    return preg_replace('/\@define(.+)/', '<?php ${1}; ?>', $value);
});

Ensuite, effectuez l’une des opérations suivantes:

Solution rapide: si vous êtes paresseux, insérez simplement le code dans la fonction boot () de AppServiceProvider.php.

Solution plus intéressante: Créez votre propre fournisseur de services. Voir https://stackoverflow.com/a/28641054/2169147 pour savoir comment étendre la lame dans Laravel 5. Cela demande un peu plus de travail, mais constitue un bon exercice d'utilisation des fournisseurs :)

LARAVEL 4

Vous pouvez simplement mettre le code ci-dessus au bas de app/start/global.php (ou à tout autre endroit si vous pensez que c'est mieux).


Après les modifications ci-dessus, vous pouvez utiliser:

@define $i = 1

définir une variable.

265
Pim

Dans laravel-4 , vous pouvez utiliser la syntaxe de commentaire du modèle pour définir/définir les variables.

La syntaxe de commentaire est {{-- anything here is comment --}} et elle est rendue par blade engine en tant que

<?php /* anything here is comment */ ?>

donc, avec un petit truc, nous pouvons l'utiliser pour définir des variables, par exemple

{{-- */$i=0;/* --}}

sera rendu par blade as <?php /* */$i=0;/* */ ?> qui définit la variable pour nous. Sans changer aucune ligne de code.

111
Trying Tobemyself

Il existe une solution de contournement simple qui ne vous oblige à modifier aucun code, et elle fonctionne également dans Laravel 4.

Vous utilisez simplement un opérateur d'affectation (=) dans l'expression transmise à une instruction @if à la place (par exemple) d'un opérateur tel que ==.

@if ($variable = 'any data, be it string, variable or OOP') @endif

Ensuite, vous pouvez l'utiliser n'importe où, vous pouvez utiliser n'importe quelle autre variable

{{ $variable }}

Le seul inconvénient, c’est que votre tâche ressemble à une erreur commise par une personne qui n’a pas conscience que vous le faites comme solution de contournement.

48
BTMPL

Tu vas rendre les choses trop compliquées. 

Il suffit d'utiliser php plain 

<?php $i = 1; ?>
{{$i}}

donesies.

(ou https://github.com/alexdover/blade-set est assez simple aussi)

Nous sommes tous un peu "en train de" pirater le système en définissant des variables dans les vues, alors pourquoi rendre le "hack" plus compliqué qu'il ne le devrait?

Testé à Laravel 4.

Un autre avantage est que la coloration syntaxique fonctionne correctement (j’utilisais des commentaires avant et c’était horrible à lire)

20
Sabrina Leggett

Depuis Laravel 5.2.23, vous avez la directive @php Blade , que vous pouvez utiliser en ligne ou sous forme d’instruction de bloc:

@php($old_section = "whatever")

ou

@php
    $old_section = "whatever"
@endphp
17
Daan

Vous pouvez définir des variables dans le moteur de gabarit de lame de la manière suivante:

1. Général PHP Block
Variable de réglage: <?php $hello = "Hello World!"; ?>
Sortie: {{$hello}}

2. Blade PHP Bloquer
Variable de réglage: @php $hello = "Hello World!"; @endphp
Sortie: {{$hello}}

15
Prince Ahmed

Dans Laravel 4:

Si vous voulez que la variable soit accessible dans toutes vos vues, pas seulement dans votre modèle, View::share est une excellente méthode ( plus d'informations sur ce blog ).

Ajoutez simplement ce qui suit dans app/controllers/BaseController.php

class BaseController extends Controller
{
  public function __construct()
  {                   
    // Share a var with all views
    View::share('myvar', 'some value');
  }
}

et maintenant $myvar sera disponible pour toutes vos vues - y compris votre modèle. 

Je l'ai utilisé pour définir des URL d'actif spécifiques à l'environnement pour mes images.

12
Justin

Vous pouvez définir une variable dans le fichier de vue, mais elle sera imprimée telle que vous la définissez. Quoi qu'il en soit, il existe une solution de contournement. Vous pouvez définir la variable dans une section inutilisée. Exemple:

@section('someSection')
  {{ $yourVar = 'Your value' }}
@endsection

Alors {{ $yourVar }} imprimera Your value où vous le souhaitez, mais vous n'obtiendrez pas le résultat lorsque vous enregistrez la variable.

EDIT: nommer la section est obligatoire sinon une exception sera levée.

10
Vasile Goian

Et tout à coup, rien ne va apparaître ... De mon expérience, si vous devez faire quelque chose comme ceci, préparez le code HTML dans la méthode d'un modèle ou réorganisez votre code dans des tableaux ou quelque chose du genre. 

Il n'y a jamais qu'un seul moyen.

{{ $x = 1 ? '' : '' }}
8
Michael J. Calkins

Je vais prolonger la réponse donnée par @Pim.

Ajoutez ceci à la méthode de démarrage de votre AppServiceProvider

<?php
/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @set(name, value)
| </code>
|--------------------------------------------------------------------------
*/

Blade::directive('set', function($expression) {
    list($name, $val) = explode(',', $expression);
    return "<?php {$name} = {$val}; ?>";
});

De cette façon, vous n'exposez pas la possibilité d'écrire une expression php.

Vous pouvez utiliser cette directive comme:

@set($var, 10)
@set($var2, 'some string')
5
Carson Evans

Vous pouvez utiliser le paquet que j'ai publié: https://github.com/sineld/bladeset

Ensuite, vous définissez facilement votre variable:

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")
4
Sinan Eldem

Dans Laravel 5.1, 5.2:

https://laravel.com/docs/5.2/views#sharing-data-with-all-views

Vous devrez peut-être partager une partie de données avec toutes les vues rendues par votre application. Vous pouvez le faire en utilisant la méthode de partage de la vue usine. En règle générale, vous devez passer des appels à partager dans la méthode de démarrage d'un fournisseur de services. Vous êtes libre de les ajouter à AppServiceProvider ou de générer un fournisseur de services distinct pour les héberger.

Editer le fichier: /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

class AppServiceProvider extends ServiceProvider
{        
    public function boot()
    {
        view()->share('key', 'value');
    }

    public function register()
    {
        // ...
    }
}
4
Justin

Quant à ma manière élégante est comme suit

{{ ''; $old_section = "whatever"; }}

Et faites simplement écho à votre variable $old_section.

{{ $old_section }}
3
Set Kyar Wa Lar

Je ne pense pas que vous puissiez le faire - mais encore une fois, ce genre de logique devrait probablement être gérée dans votre contrôleur et passée dans la vue déjà définie.

2
Darren Craig

Si vous avez PHP 7.0:

Le moyen le plus simple et le plus efficace consiste à utiliser l'affectation entre crochets.

La règle est simple: utilisez-vous votre variable plus d'une fois? Puis déclarez-le pour la première fois qu'il est utilisé entre crochets, restez calme et continuez.

@if(($users = User::all())->count())
  @foreach($users as $user)
    {{ $user->name }}
  @endforeach
@else
  There are no users.
@endif

Et oui, je connais @forelse, ceci est juste une démo.

Étant donné que vos variables sont maintenant déclarées au fur et à mesure de leur utilisation, aucune solution de contournement de lame n'est nécessaire.

2
Jonathan

Je cherchais un moyen d'attribuer une valeur à une clé et de l'utiliser plusieurs fois à mon avis. Dans ce cas, vous pouvez utiliser @section{"key", "value"} en premier lieu, puis appeler @yield{"key"} pour afficher la valeur à d'autres endroits de votre vue ou de son enfant.

1
Hafez Divandari

Pirater des commentaires n'est pas une façon très lisible de le faire. Les éditeurs le colorieront également sous forme de commentaire et il se peut que quelqu'un l'oublie en parcourant le code.

Essayez quelque chose comme ça:

{{ ''; $hello = 'world' }}

Il va compiler en:

<?php echo ''; $hello = 'world'; ?>

... et faire la cession et ne rien faire écho.

1
rotaercz

laravel 5, vous pouvez facilement le faire. voir ci-dessous 

{{--*/ @$variable_name = 'value'  /*--}}
1
tapos ghosh

Il est préférable de s’exercer à définir une variable dans Controller puis à passer à l’affichage à l’aide de la méthode compact() ou ->with().

Sinon, #TLGreg a donné la meilleure réponse.

1
Mandeep Gill

Attribuer une variable au modèle de lame, Voici les solutions

Nous pouvons utiliser la balise <?php ?> dans la page de la lame

<?php $var = 'test'; ?>
{{ $var }

OR

Nous pouvons utiliser le commentaire de la lame avec une syntaxe spéciale 

{{--*/ $var = 'test' /*--}}
{{ $var }}
1
Nikunj K.

Il existe une très bonne extension pour Blade radic/blade-extensions . Après l'avoir ajouté, vous pouvez utiliser @set (nom_variable, valeur_variable)

@set(var, 33)
{{$var}}
1
belov91

J'avais une question similaire et j'ai trouvé ce que je pensais être la bonne solution avec View Composers

Les compositeurs de vues vous permettent de définir des variables chaque fois qu'une vue donnée est appelée. Il peut s'agir de vues spécifiques ou de modèles de vues entiers. Quoi qu'il en soit, je sais que ce n'est pas une réponse directe à la question (et 2 ans trop tard), mais cela semble être une solution plus élégante que de définir des variables dans une vue avec blade.

View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
    $view->with(array('bodyClass' => 'admin'));
});
0
dug

À mon avis, il serait préférable de conserver la logique dans le contrôleur et de la transmettre à la vue. Cela peut être fait de deux manières en utilisant la méthode 'View :: make'. J'utilise actuellement Laravel 3 mais je suis sûr que c'est la même chose dans Laravel 4.

public function action_hello($userName)
{
    return View::make('hello')->with('name', $userName);
}

ou

public function action_hello($first, $last)
{
    $data = array(
        'forename'  => $first,
        'surname' => $last
    );
    return View::make('hello', $data);
}

La méthode 'with' est chaînable. Vous utiliseriez alors ce qui précède comme ceci:

<p>Hello {{$name}}</p>

Plus d'informations ici:

http://three.laravel.com/docs/views

http://codehappy.daylerees.com/using-controllers

0
Robert Brisita

fonctionne dans toutes les versions de la lame.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
0
Bakhtawar GIll

Vous pouvez étendre la lame en utilisant la méthode d’extension illustrée ci-dessous.

Blade::extend(function($value) {
    return preg_replace('/\@var(.+)/', '<?php ${1}; ?>', $value);
});

après cela initialiser les variables comme suit.

@var $var = "var"
0
Lakitha Dias