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?
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);
});
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.
dans laravel-4 , 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 lame 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 lame comme
<?php /* */$i=0;/* */ ?>
qui définit la variable pour nous.
Sans changer la moindre ligne de code.
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.
ç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)
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
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.
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.
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 ? '' : '' }}
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')
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}}
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()
{
// ...
}
}
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!")
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.
quant à ma façon élégante est comme la suivante
{{ ''; $old_section = "whatever"; }}
et faites juste écho à votre variable $old_section
.
{{ $old_section }}
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.
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.
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.
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}}
laravel 5, vous pouvez facilement faire cela . voir ci-dessous
{{--*/ @$variable_name = 'value' /*--}}
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.
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 }}
À 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:
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'));
});
fonctionne dans toutes les versions de lame.
{{--*/ $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}