Laravel’s Blade: ¿cómo puedo establecer las variables en una plantilla?

Estoy leyendo los documentos de plantillas de Laravel Blade y no puedo encontrar cómo puedo asignar variables dentro de una plantilla para utilizarlas más adelante en la plantilla. No puedo hacer {{ $old_section = "whatever" }} porque eso hará eco de “lo que sea” y no quiero eso.

Veo que puedo hacer , pero eso no es elegante.

¿Hay alguna manera elegante de hacer eso en Blade?

Se desaconseja hacerlo en una vista, por lo que no hay una etiqueta blade para ello. Si desea hacer esto en su vista de hoja, puede simplemente abrir una etiqueta php tal como la escribió o registrar una nueva etiqueta blade. Solo un ejemplo:

  * {? $old_section = "whatever" ?} *  */ Blade::extend(function($value) { return preg_replace('/\{\?(.+)\?\}/', '', $value); }); 

LARAVEL 5.2 Y ARRIBA

Puedes simplemente usar:

 @php ($i = 1) 

O puede usarlo en una statement de bloque:

 @php $i = 1 @endphp 

LARAVEL 5

Extienda Blade así:

 /* |-------------------------------------------------------------------------- | Extend blade so we can define a variable |  | @define $variable = "whatever" |  |-------------------------------------------------------------------------- */ \Blade::extend(function($value) { return preg_replace('/\@define(.+)/', '', $value); }); 

Luego, haga una de las siguientes cosas:

Solución rápida: si es flojo, simplemente ponga el código en la función boot () de AppServiceProvider.php.

Solución más sencilla: cree un proveedor de servicios propio. Consulte https://stackoverflow.com/a/28641054/2169147 sobre cómo extender blade en Laravel 5. Es un poco más trabajo de esta manera, pero es un buen ejercicio sobre cómo usar Providers 🙂

LARAVEL 4

Puedes poner el código anterior en la parte inferior de la aplicación / start / global.php (o en cualquier otro lugar si crees que es mejor).


Después de los cambios anteriores, puede usar:

 @define $i = 1 

para definir una variable.

En laravel-4 , puede usar la syntax del comentario de la plantilla para definir / establecer variables.

La syntax de los comentarios es {{-- anything here is comment --}} y es renderizada por Blade Engine como

entonces con un pequeño truco podemos usarlo para definir variables, por ejemplo

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

será renderizado por blade como que establece la variable para nosotros. Sin cambiar ninguna línea de código.

Existe una solución simple que no requiere que cambie ningún código, y también funciona en Laravel 4.

Simplemente usa un operador de asignación ( = ) en la expresión pasada a una instrucción @if , en lugar de (por ejemplo) un operador como == .

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

Entonces puedes usarlo en cualquier lugar donde puedas usar cualquier otra variable

 {{ $variable }} 

El único inconveniente es que su tarea parecerá un error para alguien que no se da cuenta de que está haciendo esto como una solución alternativa.

Ya lo harás muy complicado.

Solo usa php simple

  {{$i}} 

donesies.

(o https://github.com/alexdover/blade-set se ve bastante directo también)

Todos estamos “pirateando” el sistema configurando variables en vistas, entonces, ¿por qué hacer que el “truco” sea más complicado de lo necesario?

Probado en Laravel 4.

Otro beneficio es que el resaltado de syntax funciona correctamente (estaba usando el hack de comentarios antes y era horrible de leer)

Desde Laravel 5.2.23, tiene la directiva @php Blade , que puede usar en línea o como instrucción de bloque:

 @php($old_section = "whatever") 

o

 @php $old_section = "whatever" @endphp 

En Laravel 4:

Si desea que la variable sea accesible en todas sus vistas, no solo en su plantilla, View::share es un excelente método ( más información en este blog ).

Solo agregue lo siguiente en la aplicación / controladores / BaseController.php

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

y ahora $myvar estará disponible para todas sus visitas, incluida su plantilla.

Lo usé para establecer URL de activos específicos del entorno para mis imágenes.

Puede establecer una variable en el archivo de vista, pero se imprimirá tal como lo configuró. De todos modos, hay una solución. Puede establecer la variable dentro de una sección no utilizada. Ejemplo:

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

Entonces {{ $yourVar }} imprimirá Your value donde quieras, pero no obtendrás el resultado cuando guardes la variable.

EDITAR: se requiere nombrar la sección; de lo contrario, se lanzará una excepción.

Y de repente nada aparecerá. Desde mi experiencia, si tienes que hacer algo como esto, prepara el html en el método de un modelo o reorganiza tu código en matrices o algo así.

Nunca hay solo 1 camino

 {{ $x = 1 ? '' : '' }} 

Voy a extender la respuesta dada por @Pim.

Agregue esto al método de arranque de su AppServiceProvider

  | @set(name, value) |  |-------------------------------------------------------------------------- */ Blade::directive('set', function($expression) { list($name, $val) = explode(',', $expression); return ""; }); 

De esta forma no expones la capacidad de escribir ninguna expresión php.

Puede usar esta directiva como:

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

En Laravel 5.1, 5.2 :

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

Es posible que necesite compartir un dato con todas las vistas que su aplicación le brinda. Puede hacerlo utilizando el método de compartir de fábrica de vista. Por lo general, debe realizar llamadas para compartir en el método de inicio de un proveedor de servicios. Usted es libre de agregarlos al AppServiceProvider o generar un proveedor de servicios separado para alojarlos.

Editar archivo: /app/Providers/AppServiceProvider.php

 share('key', 'value'); } public function register() { // ... } } 

Puede usar el paquete que he publicado: https://github.com/sineld/bladeset

Luego puedes configurar fácilmente tu variable:

 @set('myVariable', $existing_variable) // or @set("myVariable", "Hello, World!") 

Puede establecer variables en el motor de plantillas Blade de las siguientes maneras:

1. Bloque PHP general
Variable de configuración:
Salida: {{$hello}}

2. Bloque PHP Blade
Variable de configuración: @php $hello = "Hello World!"; @endphp @php $hello = "Hello World!"; @endphp
Salida: {{$hello}}

No creo que pueda hacerlo, pero, de nuevo, este tipo de lógica probablemente debería manejarse en su controlador y pasar a la vista ya configurada.

En cuanto a mi manera elegante es como la siguiente

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

Y solo $old_section variable $old_section .

 {{ $old_section }} 

Si tienes PHP 7.0:

La forma más simple y efectiva es con la asignación entre corchetes .

La regla es simple: ¿usa su variable más de una vez? Luego, declare que es la primera vez que se usa entre paréntesis, mantenga la calma y continúe.

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

Y sí, sé sobre @forelse , esto es solo una demostración.

Dado que sus variables ahora se declaran como y cuando se utilizan, no hay necesidad de ninguna solución alternativa de blade.

La piratería de comentarios no es una forma muy fácil de hacerlo. Además, los editores lo colorearán como un comentario y es posible que alguien lo pierda al consultar el código.

Pruebe algo como esto:

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

Se comstackrá en:

  

… y hacer la tarea y no hacer eco de nada.

Es mejor practicar para definir variables en Controller y luego pasar a ver usando el método compact() o ->with() .

De lo contrario, #TLGreg dio la mejor respuesta.

Hay una muy buena extensión para Blade radic / blade-extensions . Después de agregarlo, puede usar @set (variable_name, variable_value)

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

laravel 5 puedes hacer esto fácilmente. vea abajo

 {{--*/ @$variable_name = 'value' /*--}} 

Estaba buscando una manera de asignar un valor a una clave y usarla muchas veces desde mi punto de vista. Para este caso, puede usar @section{"key", "value"} en primer lugar y luego llamar a @yield{"key"} para mostrar el valor en otros lugares de su vista o de su hijo.

Asignar variable a la plantilla de hoja, estas son las soluciones

Podemos usar la etiqueta En la página de la cuchilla

  {{ $var } 

O

Podemos usar el comentario blade con syntax especial

 {{--*/ $var = 'test' /*--}} {{ $var }} 

En mi opinión, sería mejor mantener la lógica en el controlador y pasarla a la vista para usar. Esto puede hacerse de dos maneras usando el método ‘View :: make’. Actualmente estoy usando Laravel 3, pero estoy bastante seguro de que es lo mismo en Laravel 4.

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

o

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

El método ‘con’ es encadenable. Entonces usarías lo anterior como así:

 

Hello {{$name}}

Más información aquí:

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

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

Tuve una pregunta similar y encontré lo que creo que es la solución correcta con View Composers

Los compositores de vista le permiten establecer variables cada vez que se llama a una determinada vista, y pueden ser vistas específicas o plantillas de vista completas. De todos modos, sé que no es una respuesta directa a la pregunta (y 2 años demasiado tarde), pero parece una solución más elegante que la configuración de variables dentro de una vista con blade.

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

funciona en todas las versiones de blade.

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