2015-04-27 26 views
53

Wie kann ich Schalter in Blade-Vorlagen verwenden? Als ich verwendete:Switch in Laravel 5 - Blade

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

im Ergebnis sehe ich diesen Text als Klartext. Ich bevorzuge es, in ein paar Stück Code zu wechseln, weil es für mich sauberer ist als wenn ich es verwende.

Aber wenn es nicht möglich ist, schreibe es einfach.

+3

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

+0

@ventaquil Die ausgewählte Antwort ist falsch. Kann die Antwort zu der von mir geposteten geändert werden? – captainblack

+0

@captainblack Tut mir leid, aber diese Lösung ist für Laravel 5.2 + - wir verwenden 5.1 LTS. – ventaquil

Antwort

60

-Update 2018 Version

Seit Laravel 5.5 die @switch in die Klinge integriert ist. Verwenden Sie es wie unten gezeigt.

@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 

Ältere Antwort

Leider Laravel Klinge nicht switch-Anweisung haben. Sie können Laravel verwenden, wenn Sie sich sonst einfach PHP-Schalter bedienen oder verwenden. Sie können einfaches PHP in Blade-Templates verwenden wie in jeder anderen PHP-Anwendung. Ab Laravel 5.2 verwenden Sie die @ php-Anweisung.

Option 1:

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

Froh, dass ich die Antwort gefunden habe, aber ich mag es nicht. – Robert

-4

Wenn Sie beginnen mit Switch-Anweisungen in Ihren Ansichten, die in der Regel angeben, dass Sie weiter erneut Faktor Code. Geschäftslogik ist nicht für Ansichten gedacht. Ich würde Ihnen eher empfehlen, die switch-Anweisung in Ihrem Controller auszuführen und dann das Ergebnis der switch-Anweisungen an die Ansicht zu übergeben.

+9

Fairerweise können Switch-Statements durchaus in die Ansicht gehören. Wenn Sie beispielsweise CSS-Klassen basierend auf Datenbereichen in einer Tabelle festlegen, möchten Sie die Anzeigelogik nicht in den Controller einbetten. – CashIsClay

+7

Oder Laden Teilt ... –

+0

"Business-Logik ist nicht für Ansichten gedacht,". Geschäftslogik ist für die visuelle Schicht, die logische Schicht und die Persistenzschicht. Es ist langwierig und überflüssig, aber ein Qualitätscode tut das. – magallanes

25

Sie können diesen Code einfach in der Boot-Methode AppServiceProvider hinzufügen.

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

dann können Sie verwenden, wie:

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

Es Genießen ~

+0

Dies funktioniert nicht. 'Analysieren Fehler, erwarten' " endswitch (T_ENDSWITCH) " ' oder '" Fall (T_CASE) " ' oder' " default (T_Default) ' – mkmnstr

+0

@mkmnstr, zu ersetzen versuchen' ' 'auf' "' in preg_replace Methode? – Germey

+0

That funktioniert nicht wegen der Backslashes .. – mkmnstr

20

IN Laravel 5.2 und UP:

Ihren üblichen Code zwischen den öffnenden Schreiben und Schließen PHP-Anweisungen .

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

Diese '@ php'-Syntax ist sehr nützlich in L5.2> –

5

In Laravel 5.1 funktioniert dies in einem 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; 
    } 
?> 
+0

Das ist technisch korrekt. Die beste Art von Korrektheit. – apokryfos

0

Sie können Klinge erstrecken, wie so:

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

Sie können dann mit der folgenden:

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

Beachten Sie jedoch die Warnungen in: http://php.net/manual/en/control-structures.alternative-syntax.php

Wenn zwischen dem Schalter(): und dem ersten Fall Leerzeichen vorhanden sind, schlägt der gesamte Codeblock fehl. Das ist eher eine PHP-Einschränkung als eine Blade-Begrenzung. Sie können es möglicherweise umgehen, indem Sie die normale Syntax erzwingen, z.:

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

Aber das fühlt sich ein bisschen falsch an.

0

Um den Raum in '-Schalter()' zu überwinden, Sie Code verwenden können:

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