2015-04-27 40 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; 
    });