[php] Lame de Laravel: comment puis-je définir des variables dans un modèle?



Answers

LARAVEL 5.2 et UP

Vous pouvez simplement 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 ${1}; ?>', $value);
});

Ensuite, faites l'une des choses suivantes:

Solution rapide: Si vous êtes paresseux, mettez simplement le code dans la fonction boot () du AppServiceProvider.php.

Meilleure solution: créer un propre fournisseur de services. 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 placer le code ci-dessus en bas de app / start / global.php (ou tout autre endroit si vous pensez que c'est mieux).

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

@define $i = 1

pour définir une variable.

Question

Je lis les documents de modèle de Laravel Blade et je ne peux pas trouver comment je peux assigner 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 cela fera écho "quoi que" et je ne le veux pas.

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

Existe-t-il une manière élégante de le faire dans Blade?




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



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

@section
  {{ $yourVar = 'Your value' }}
@endsection

Alors {{ $yourVar }} affichera Your value où vous le voulez, mais vous n'obtiendrez pas la sortie lorsque vous enregistrez la variable.




À mon avis, il serait préférable de garder la logique dans le contrôleur et le passer à la vue d'utiliser. Cela peut être fait de deux manières en utilisant la méthode 'View :: make'. J'utilise actuellement Laravel 3 mais je suis à peu près 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 le dessus comme ceci:

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

Plus d'informations ici:

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

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




Quant à ma manière élégante est comme le suivant

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

Et faites simplement écho à votre variable $old_section .

{{ $old_section }}



Dans Laravel 4:

Si vous voulez que la variable soit accessible dans toutes vos vues, pas seulement votre modèle, View::share est une excellente méthode ( plus d'infos 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'actifs spécifiques à l'environnement pour mes images.




Je vais étendre 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')



Il existe une solution de contournement simple qui ne nécessite aucun changement de code, et cela fonctionne également dans Laravel 4.

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

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

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

{{ $variable }}

Le seul inconvénient est que votre mission ressemblera à une erreur de quelqu'un ne sachant pas que vous faites cela comme une solution de contournement.




Il y a une très bonne extension pour les extensions radic/blade-extensions Blade. Après l'avoir ajouté, vous pouvez utiliser @set (variable_name, variable_value)

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



fonctionne dans toutes les versions de la lame.

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



Je cherchais un moyen d'attribuer une valeur à une clé et je l'utilise 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.




Le piratage des commentaires n'est pas une manière très lisible de le faire. Les éditeurs vont également colorier comme un commentaire et quelqu'un peut le manquer lors de la lecture du code.

Essayez quelque chose comme ceci:

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

Il se compilera en:

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

... et faire le devoir et ne rien faire écho.




Links