2015-04-27 6 views
53

Come posso utilizzare il cambio dei modelli blade? Quando ho usato:Switch in Laravel 5 - Blade

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

nel risultato Vedo questo testo come testo normale. Preferisco usare switch in pochi pezzi di codice perché è più pulito per me rispetto a quando utilizzo if.

Ma se non è possibile basta scriverlo.

+3

https://github.com/laravel/framework/issues/1857 – ceejayoz

+0

@ventaquil La risposta selezionata non è corretta. La risposta può essere cambiata con quella che ho postato? – captainblack

+0

@captainblack scusa ma questa soluzione è per Laravel 5.2+ - stiamo usando 5.1 LTS. – ventaquil

risposta

60

Aggiornamento 2018 versione

Dal laravel 5.5 il @switch è costruito nella lama. Usalo come mostrato di seguito.

@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 

risposta Più

Purtroppo laravel lama non hai switch. Puoi usare Laravel se altri si avvicinano o usano il semplice switch PHP. Puoi usare il semplice PHP nei template blade come in qualsiasi altra applicazione PHP. A partire da Laravel 5.2 e versioni successive utilizzare l'istruzione @php.

Opzione 1:

@if ($login_error == 1) 
    `E-mail` input is empty! 
@elseif ($login_error == 2) 
    `Password` input is empty! 
@endif 
+6

Contento di aver trovato la risposta ma non mi piace. – Robert

-4

Quando si avvia utilizzando istruzioni switch all'interno dei vostri punti di vista, che di solito indicano che si può ulteriormente ri-factor il codice. La logica aziendale non è pensata per le visualizzazioni, vorrei piuttosto suggerire di fare l'istruzione switch all'interno del controller e quindi passare il risultato delle istruzioni switch alla vista.

+9

Per essere onesti, le dichiarazioni switch possono certamente appartenere alla vista. Ad esempio, se si impostano le classi CSS in base agli intervalli di dati in una tabella, non si desidera incorporare la logica di visualizzazione nel controller. – CashIsClay

+7

Oppure caricamento partial ... –

+0

"La logica aziendale non è destinata alle viste". La logica aziendale è per il livello visivo, il livello logico e il livello di persistenza. È noioso e ridondante ma un codice di qualità lo fa. – magallanes

25

È possibile aggiungere questi codici solo nel metodo di avvio della classe 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; 
    }); 

allora si può usare come:

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

goderne ~

+0

Questo non funziona. 'Errore di analisi, aspettandosi' " endswitch (T_ENDSWITCH) " ' o '" caso (T_CASE) " ' o' " predefinito (T_DEFAULT) ' – mkmnstr

+0

@mkmnstr, provare a sostituire' ' 'a' "' in preg_replace metodo? – Germey

+0

Che non funziona a causa delle barre rovesciate .. – mkmnstr

20

IN laravel 5.2 E UP:

Scrivere il codice di consueto tra l'apertura e la chiusura dichiarazioni PHP .

@php 
switch (x) { 
    case 1: 
     //code to be executed 
     break; 
    default: 
     //code to be executed 
} 
@endphp 
+1

Questa sintassi '@ php' è molto utile in L5.2> –

5

In laravel 5.1, questo funziona in un lama:

<?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; 
    } 
?> 
+0

Questo è tecnicamente corretto. Il miglior tipo di corretto. – apokryfos

0

è possibile estendere lama in questo modo:

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; ?>"; 
    }); 

è possibile utilizzare il seguente:

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

Tuttavia si noti le avvertenze in: http://php.net/manual/en/control-structures.alternative-syntax.php

Se c'è uno spazio tra lo switch(): e il primo caso, l'intero blocco di codice fallirà. Questa è una limitazione di PHP piuttosto che una limitazione di blade. Potresti essere in grado di bypassarlo forzando la sintassi normale, ad es.:

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

Ma questo sembra un po 'sbagliato.

0

Per superare lo spazio in 'interruttore()', è possibile utilizzare il codice:

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; 
    });