Cambiar en Laravel 5 - Blade

80

¿Cómo puedo usar el interruptor en las plantillas blade? Cuando usé:

@switch($login_error)
    @case(1)
        `E-mail` input is empty!
        @break
    @case(2)
        `Password` input is empty!
        @break
@endswitch

en consecuencia, veo este texto como texto sin formato. Prefiero usar switch en algunos fragmentos de código porque es más limpio para mí que cuando uso if.

Pero si no es posible, escríbalo.

ventaquil
fuente
@ventaquil La respuesta seleccionada es incorrecta. ¿Se puede cambiar la respuesta a la que he publicado?
captainblack
@captainblack lo siento, pero esta solución es para Laravel 5.2+ - estamos usando 5.1 LTS.
ventaquil
4
laravel 5.5 introduce declaraciones de cambio. su código debería renderizarse correctamente.
szaman

Respuestas:

129

Respuesta actualizada 2020

Desde Laravel 5.5, el @switch está integrado en Blade. Úselo como se muestra a continuación.

@switch($login_error)
    @case(1)
        <span> `E-mail` input is empty!</span>
        @break

    @case(2)
        <span>`Password` input is empty!</span>
        @break

    @default
        <span>Something went wrong, please try again</span>
@endswitch

Respuesta anterior

Desafortunadamente, Laravel Blade no tiene una declaración de cambio. Puede usar Laravel si se acerca o usar el modificador PHP simple. Puede usar PHP simple en plantillas blade como en cualquier otra aplicación PHP. A partir de Laravel 5.2, use la declaración @php.

Opción 1:

@if ($login_error == 1)
    `E-mail` input is empty!
@elseif ($login_error == 2)
    `Password` input is empty!
@endif
Margus Pala
fuente
29

Puede simplemente agregar este código en el método de arranque de la clase AppServiceProvider.

Blade::extend(function($value, $compiler){
        $value = preg_replace('/(\s*)@switch\((.*)\)(?=\s)/', '$1<?php switch($2):', $value);
        $value = preg_replace('/(\s*)@endswitch(?=\s)/', '$1endswitch; ?>', $value);
        $value = preg_replace('/(\s*)@case\((.*)\)(?=\s)/', '$1case $2: ?>', $value);
        $value = preg_replace('/(?<=\s)@default(?=\s)/', 'default: ?>', $value);
        $value = preg_replace('/(?<=\s)@breakswitch(?=\s)/', '<?php break;', $value);
        return $value;
    });

entonces puedes usar como:

@switch( $item )
    @case( condition_1 )
        // do something
    @breakswitch
    @case( condition_2 )
        // do something else
    @breakswitch
    @default
        // do default behaviour
    @breakswitch
@endswitch

Disfrútalo ~

Germey
fuente
Esto no funciona. parse error, expecting & quot; interruptor final (T_ENDSWITCH) & quot; & # 039; o &quot;case (T_CASE)&quot;&#039; or & quot; predeterminado (T_DEFAULT) `
mkmnstr
@mkmnstr, ¿intenta reemplazar `'` por `" `en el método preg_replace?
Germey
5
¿Alguien ha votado a favor desde estos comentarios? ¿Esto funciona?
Jonathan
1
Usar Laravel 5.4, no funciona para mí. FatalThrowableError Class 'App \ Providers \ Blade' no encontrada
Kyle Challis
1
Funciona en 5.5. Solo tendría curiosidad sobre cómo hacer que funcione con el autocompletado de phpstorm (o cualquier IDE) @Germey.
Michael Villeneuve
22

EN LARAVEL 5.2 Y ARRIBA:

Escriba su código habitual entre las declaraciones PHP de apertura y cierre.

@php
switch (x) {
    case 1:
        //code to be executed
        break;
    default:
        //code to be executed
}
@endphp
capitán negro
fuente
2
Esta @phpsintaxis es muy útil en L5.2>
Alexander Kim
5

En Laravel 5.1, esto funciona en un Blade:

<?php
    switch( $machine->disposal ) {
        case 'DISPO': echo 'Send to Property Disposition'; break;
        case 'UNIT':  echo 'Send to Unit'; break;
        case 'CASCADE': echo 'Cascade the machine'; break;
        case 'TBD':   echo 'To Be Determined (TBD)'; break;
    }
?>
JeffK
fuente
0

Puedes extender la hoja así:

    Blade::directive('switch', function ($expression) {
        return "<?php switch($expression): ?>";
    });
    Blade::directive('case', function ($expression) {
        return "<?php case $expression: ?>";
    });
    Blade::directive('break', function () {
        return "<?php break; ?>";
    });
    Blade::directive('default', function () {
        return "<?php default: ?>";
    });
    Blade::directive('endswitch', function () {
        return "<?php endswitch; ?>";
    });

Luego puede usar lo siguiente:

@switch($test)
@case(1)
        Words
@break
@case(2)
    Other Words
    @break
@default
    Default words
@endswitch

Sin embargo, tenga en cuenta las advertencias en: http://php.net/manual/en/control-structures.alternative-syntax.php

Si hay algún espacio en blanco entre switch (): y el primer caso, todo el bloque de código fallará. Esa es una limitación de PHP en lugar de una limitación de la hoja. Es posible que pueda omitirlo forzando la sintaxis normal, por ejemplo:

Blade::directive('switch', function ($expression) {
    return "<?php switch($expression) { ?>";
});
Blade::directive('endswitch', function ($) {
    return "<?php } ?>";
});

Pero esto se siente un poco mal.

apokryfos
fuente
-2

Para superar el espacio en 'switch ()', puede usar el código:

Blade::extend(function($value, $compiler){
    $value = preg_replace('/(\s*)@switch[ ]*\((.*)\)(?=\s)/', '$1<?php switch($2):', $value);
    $value = preg_replace('/(\s*)@endswitch(?=\s)/', '$1endswitch; ?>', $value);
    $value = preg_replace('/(\s*)@case[ ]*\((.*)\)(?=\s)/', '$1case $2: ?>', $value);
    $value = preg_replace('/(?<=\s)@default(?=\s)/', 'default: ?>', $value);
    $value = preg_replace('/(?<=\s)@breakswitch(?=\s)/', '<?php break;', $value);
    return $value;
  });
Thomas W. Effendi
fuente
-5

Cuando comienza a usar declaraciones de cambio dentro de sus vistas, eso generalmente indica que puede volver a factorizar su código. La lógica empresarial no está pensada para las vistas, prefiero sugerirle que haga la instrucción de cambio dentro de su controlador y luego pase el resultado de las declaraciones de cambio a la vista.

Kreshnik Hasanaj
fuente
9
Para ser justos, las declaraciones de cambio ciertamente pueden pertenecer a la vista. Por ejemplo, si configura clases CSS basadas en rangos de datos en una tabla, no querrá incrustar la lógica de visualización en el controlador.
CashIsClay
"La lógica empresarial no está pensada para las vistas". La lógica empresarial es para la capa visual, la capa lógica y la capa de persistencia. Es tedioso y redundante, pero un código de calidad hace eso.
magallanes