php - switch - variables en blade laravel
Laravel''s Blade: ¿cómo puedo establecer las variables en una plantilla? (25)
Estoy leyendo los documentos de templating 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 <?php $old_section = "whatever"; ?>
<?php $old_section = "whatever"; ?>
, pero eso no es elegante.
¿Hay alguna manera elegante de hacer eso en Blade?
Asignar variable a la plantilla de hoja, estas son las soluciones
Podemos usar la etiqueta <?php ?>
En la página de la cuchilla
<?php $var = ''test''; ?>
{{ $var }
O
Podemos usar el comentario blade con sintaxis especial
{{--*/ $var = ''test'' /*--}}
{{ $var }}
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 cuanto a mi manera elegante es como la siguiente
{{ ''''; $old_section = "whatever"; }}
Y solo $old_section
variable $old_section
.
{{ $old_section }}
En laravel-4 , puede usar la sintaxis del comentario de la plantilla para definir / establecer variables.
La sintaxis de los comentarios es {{-- anything here is comment --}}
y es renderizada por blade Engine como
<?php /* anything here is comment */ ?>
entonces con un pequeño truco podemos usarlo para definir variables, por ejemplo
{{-- */$i=0;/* --}}
será renderizado por blade como <?php /* */$i=0;/* */ ?>
que establece la variable para nosotros. Sin cambiar ninguna línea de código.
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í:
<p>Hello {{$name}}</p>
Más información aquí:
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.
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.
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.
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}}
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 compilará en:
<?php echo ''''; $hello = ''world''; ?>
... y hacer la tarea y no hacer eco de nada.
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.
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
{{ $yourVar = ''Your value'' }}
@endsection
Entonces {{ $yourVar }}
imprimirá Your value
donde quieras, pero no obtendrás el resultado cuando guardes la variable.
Puede establecer variables en el motor de plantillas Blade de las siguientes maneras:
1. Bloque PHP general
Variable de configuración: <?php $hello = "Hello World!"; ?>
<?php $hello = "Hello World!"; ?>
Salida: {{$hello}}
2. Bloque PHP Blade
Variable de configuración: @php $hello = "Hello World!"; @endphp
@php $hello = "Hello World!"; @endphp
Salida: {{$hello}}
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!")
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:
<?php
/**
* <code>
* {? $old_section = "whatever" ?}
* </code>
*/
Blade::extend(function($value) {
return preg_replace(''//{/?(.+)/?/}/'', ''<?php ${1} ?>'', $value);
});
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''));
});
Voy a extender la respuesta dada por @Pim.
Agregue esto al método de arranque de su 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 esta forma no expones la capacidad de escribir ninguna expresión php.
Puede usar esta directiva como:
@set($var, 10)
@set($var2, ''some string'')
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 ? '''' : '''' }}
Ya lo harás muy complicado.
Solo usa php simple
<?php $i = 1; ?>
{{$i}}
donesies.
(o https://github.com/alexdover/blade-set 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 sintaxis funciona correctamente (estaba usando el hack de comentarios antes y era horrible de leer)
funciona en todas las versiones de blade.
{{--*/ $optionsArray = [''A'', ''B'', ''C'', ''D'',''E'',''F'',''G'',''H'',''J'',''K''] /*--}}
laravel 5 puedes hacer esto fácilmente. vea abajo
{{--*/ @$variable_name = ''value'' /*--}}
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.
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
<?php
namespace App/Providers;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
view()->share(''key'', ''value'');
}
public function register()
{
// ...
}
}
LARAVEL 5.2 Y ARRIBA
Puedes simplemente usar:
@php ($i = 1)
O puede usarlo en una declaración de bloque:
@php
$i = 1
@endphp
LARAVEL 5
Extienda Blade así:
/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @define $variable = "whatever"
| </code>
|--------------------------------------------------------------------------
*/
/Blade::extend(function($value) {
return preg_replace(''//@define(.+)/'', ''<?php ${1}; ?>'', $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://.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.
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.