Lame de Laravel: comment définir des variables dans un modèle?

je lis les docs templating de Laravel Blade et je ne trouve pas comment je peux affecter des variables à l'intérieur d'un modèle pour une utilisation ultérieure dans le modèle. Je ne peux pas faire {{ $old_section = "whatever" }} parce que ça fera écho à" n'importe quoi " et je ne veux pas ça.

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

y a-t-il une façon élégante de faire cela dans Blade?

177
demandé sur Trying Tobemyself 2012-10-22 02:02:08

25 réponses

il est déconseillé de le faire dans une vue de sorte qu'il n'y a pas d'étiquette de lame pour elle. Si vous voulez faire dans votre lame de vue, vous pouvez soit ouvrir une balise php comme vous l'avez écrit ou enregistrer une nouvelle lame de balise. Juste un exemple:

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php  ?>', $value);
});
101
répondu TLGreg 2012-10-22 20:32:18

LARAVEL 5.2 ET PLUS

vous pouvez juste utiliser:

@php ($i = 1)

Ou vous pouvez l'utiliser dans une instruction 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 ; ?>', $value);
});

ensuite, faites l'une des opérations suivantes:

solution rapide: si vous êtes paresseux, il suffit de mettre le code dans la fonction boot() de la AppServiceProvider.php.

plus belle la solution: Créer un propre fournisseur de service. Voir https://stackoverflow.com/a/28641054/2169147 sur la façon d'étendre la lame dans Laravel 5. C'est un peu plus de travail de cette façon, mais un bon exercice sur la façon d'utiliser les Fournisseurs :)

LARAVEL 4

vous pouvez simplement mettre le code ci-dessus sur le 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

pour définir une variable.

234
répondu Pim 2017-05-23 11:55:03

dans , vous pouvez utiliser la syntaxe de commentaire de modèle pour définir/définir des variables.

Commentaire syntaxe est {{-- anything here is comment --}} et qu'il est rendu par moteur

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

donc avec little trick nous pouvons l'utiliser pour définir des variables, par exemple

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

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

109
répondu Trying Tobemyself 2013-09-27 11:56:00

il y a une solution de contournement simple qui ne nécessite pas de changer de code, et cela fonctionne aussi bien dans Laravel 4.

il suffit d'utiliser un opérateur d'affectation ( = ) dans l'expression passée à une instruction @if , au lieu (par exemple) d'un opérateur tel que == .

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

, Alors vous pouvez l'utiliser partout où vous pouvez utiliser une autre variable

{{ $variable }}

le seul inconvénient est votre l'attribution de look comme une erreur à quelqu'un de ne pas conscient que vous êtes en train de faire cela comme une solution de contournement.

45
répondu BTMPL 2014-05-21 15:55:30

ça va être trop compliqué.

utiliser simplement php

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

donesies.

(ou https://github.com/alexdover/blade-set a l'air assez compliqué aussi)

nous sommes tous en quelque sorte "hacking" le système en définissant les variables dans les vues, alors pourquoi rendre le "hack" plus compliqué que cela doit être?

testé dans Laravel 4.

un autre avantage est que la mise en évidence de la syntaxe fonctionne correctement (j'ai utilisé comment hack avant et il était terrible de lire)

16
répondu Sabrina Leggett 2016-04-21 14:18:38

depuis Laravel 5.2.23, vous avez la directive @php Blade , que vous pouvez utiliser en ligne ou comme instruction de bloc:

@php($old_section = "whatever")

ou

@php
    $old_section = "whatever"
@endphp
13
répondu Daan 2016-08-11 19:34:05

In Laravel 4:

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

il suffit d'ajouter 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 seront disponibles pour toutes vos vues, y compris votre modèle.

j'ai utilisé ceci pour définir des URLs d'actifs spécifiques à l'environnement pour mes images.

12
répondu Justin 2016-04-21 21:00:35

vous pouvez définir une variable dans le fichier view, mais elle sera imprimée comme vous l'avez définie. De toute façon, il y a une solution. Vous pouvez définir la variable dans une section non utilisée. Exemple:

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

puis {{ $yourVar }} affichera Your value où que vous le vouliez, mais vous n'obtenez pas la sortie lorsque vous sauvegardez la variable.

EDIT: "151990920 la désignation de la section est obligatoire sinon une exception sera levée.

10
répondu Vasile Goian 2018-06-13 11:24:33

et tout à coup rien n'apparaîtra. D'après mon expérience, si vous devez faire quelque chose comme ça, préparez le html dans la méthode d'un modèle ou réorganisez votre code en tableaux ou quelque chose comme ça.

il n'y a jamais qu'un seul chemin.

{{ $x = 1 ? '' : '' }}
8
répondu Michael J. Calkins 2013-03-27 15:53:49

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

ajoutez ceci à la méthode de démarrage de votre Applserviceprovider

<?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 capacité d'écrire une expression php.

vous pouvez utiliser cette directive comme:

@set($var, 10)
@set($var2, 'some string')
5
répondu Carson Evans 2016-05-02 11:25:35

Vous Pouvez Définir Des Variables Dans Le Moteur De Templation Des Pales De La Manière Suivante::



1. Bloc PHP général

variable de réglage: <?php $hello = "Hello World!"; ?>

résultats: {{$hello}}



2. Blade PHP Block

variable de réglage: @php $hello = "Hello World!"; @endphp

résultats: {{$hello}}

5
répondu Prince Ahmed 2018-05-13 05:59:23

In Laravel 5.1, 5.2 :

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

vous pouvez avoir besoin de partager une donnée avec toutes les vues qui sont rendues par votre application. Vous pouvez le faire en utilisant la méthode share De view factory. Généralement, vous devez passer des appels pour partager dans la méthode de démarrage d'un fournisseur de services. Vous êtes libre à ajouter ils sont fournis au fournisseur D'Appservic ou génèrent un fournisseur de services distinct pour les héberger.

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

<?php

namespace App\Providers;

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

    public function register()
    {
        // ...
    }
}
3
répondu Justin 2016-04-21 21:09:29

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!")
3
répondu Sinan Eldem 2016-10-11 12:29:10

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

2
répondu Darren Craig 2012-10-21 22:18:32

quant à ma façon élégante est comme la suivante

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

et faites juste écho à votre variable $old_section .

{{ $old_section }}
2
répondu Set Kyar Wa Lar 2014-10-17 04:30:43

si vous avez PHP 7.0:

la méthode la plus simple et la plus efficace consiste à assigner entre crochets .

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

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

Et oui, je sais à propos de @forelse , c'est juste une démo.

étant donné que vos variables sont maintenant déclarées au fur et à mesure qu'elles sont utilisées, il n'est pas nécessaire de recourir à des solutions de rechange pour les pales.

2
répondu Jonathan 2016-07-26 17:25:05

le Piratage des commentaires n'est pas très lisible façon de le faire. En outre, les éditeurs vont le colorer comme un commentaire et quelqu'un peut le manquer en regardant à travers le code.

Essayez quelque chose comme ceci:

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

il se compilera en:

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

...et faire la mission et ne pas faire écho à quoi que ce soit.

1
répondu rotaercz 2014-12-11 06:46:07

il est préférable de s'entraîner à définir la variable dans le contrôleur et passer ensuite à la vue en utilisant compact() ou ->with() méthode.

sinon # TLGreg a donné la meilleure réponse.

1
répondu Mandeep Gill 2015-07-05 12:02:21

il y a une très bonne extension pour la lame radic/blade-extensions . Après l'avoir ajouté, vous pouvez utiliser @set (NOM_VARIABLE, valeur_variable)

@set(var, 33)
{{$var}}
1
répondu belov91 2015-12-09 13:04:15

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

{{--*/ @$variable_name = 'value'  /*--}}
1
répondu tapos ghosh 2016-03-12 09:19:12

je cherchais un moyen d'affecter une valeur à une clé et l'utiliser de nombreuses fois dans ma vue. Dans ce cas, vous pouvez utiliser @section{"key", "value"} en premier lieu et ensuite appeler @yield{"key"} pour afficher la valeur dans d'autres endroits de votre vue ou de son enfant.

1
répondu Hafez Divandari 2016-04-22 22:15:59

Assignez variable au modèle de lame, Voici les solutions

Nous pouvons utiliser <?php ?> tag de la lame de la page

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

ou

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

{{--*/ $var = 'test' /*--}}
{{ $var }}
1
répondu Nikunj K. 2016-10-24 12:56:13

À mon avis, il serait préférable de garder la logique du contrôleur et passez à la vue à utiliser. Ceci peut être fait de deux façons en utilisant la méthode 'View::make'. J'utilise actuellement Laravel 3 mais je suis assez sûr que C'est la même chose avec 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 "avec la" méthode est chainable. Vous utiliserez 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
répondu Robert Brisita 2013-08-22 18:07:16

j'ai eu une question similaire et j'ai trouvé ce que je pense être la bonne solution avec voir compositeurs

les compositeurs de vue vous permettent de définir des variables chaque fois qu'une certaine vue est appelée, et ils peuvent être des vues spécifiques, ou des gabarits de vue entière. 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 gracieuse 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
répondu dug 2014-08-18 07:12:50

fonctionne dans toutes les versions de lame.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
0
répondu Bakhtawar GIll 2016-10-06 07:05:31