2015-04-27 57 views
53

如何在刀片模板中使用開關?當我用:Laravel 5中的開關 - 刀片

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

結果我看到這個文本爲明文。我更喜歡在少量代碼中使用開關,因爲它比我使用if時更乾淨。

但是,如果不可能,就寫下來。

+3

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

+0

@ventaquil所選答案不正確。答案可以更改爲我發佈的答案嗎? – captainblack

+0

@captainblack對不起,但此解決方案是爲Laravel 5.2+ - 我們正在使用5.1 LTS。 – ventaquil

回答

60

更新版本2018

由於Laravel 5.5 @switch內置的刀片。如下所示使用它。

@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 

年長的回答

不幸的是Laravel刀片沒有switch語句。您可以使用Laravel if else方法或使用純PHP開關。您可以在任何其他PHP應用程序中使用刀片模板中的普通PHP。從Laravel 5.2開始,使用@php語句。

選項1:

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

很高興我找到了答案,但我不喜歡它。 – Robert

-4

當你開始使用您的視圖中的switch語句,這通常表明您可以進一步重新因子代碼。業務邏輯不適用於視圖,我寧願建議您在控制器中執行switch語句,然後將switch語句結果傳遞給視圖。

+9

公平起見,switch語句肯定屬於視圖。例如,如果您基於表中的數據範圍設置CSS類,則不希望在控制器中嵌入顯示邏輯。 – CashIsClay

+7

or loading partials ... –

+0

「業務邏輯不適用於視圖」。業務邏輯用於可視層,邏輯層和持久層。它的繁瑣和冗餘,但質量代碼就是這樣做的。 – magallanes

25

您可以在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; 
    }); 

那麼你可以使用如:

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

享受吧〜

+0

這不起作用。 '解析錯誤,期待'" endswitch(T_ENDSWITCH)" '或'"情況下(T_CASE)" '或'"默認(T_DEFAULT)' – mkmnstr

+0

@mkmnstr,嘗試更換''''到「'中的preg_replace方法? – Germey

+0

那不會因爲反斜槓而起作用.. – mkmnstr

20

IN LARAVEL 5.2以上:

寫的開啓和關閉PHP語句之間的常規碼。

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

這個'@ php'語法在L5.2中非常有用> –

5

在Laravel 5.1,這部作品在刀片:

<?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

這在技術上是正確的。最好的一種正確。 – apokryfos

0

你可以像這樣擴展刀片:

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

然後,您可以使用以下方法:

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

但請注意:http://php.net/manual/en/control-structures.alternative-syntax.php

如果switch():和第一個case之間有空格,那麼整個代碼塊將會失敗。這是一個PHP限制,而不是刀片限制。您可以通過強制使用正常的語法來繞過它。:

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

但是這感覺有點不對。

0

爲了克服空間 '開關()',你可以使用代碼:

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