如何在刀片模板中使用switch?我用的时候:
@switch($login_error)
@case(1)
`E-mail` input is empty!
@break
@case(2)
`Password` input is empty!
@break
@endswitch
结果我将此文本视为明文。我更喜欢在几段代码中使用switch,因为它比我使用if时更干净。
但如果不可能只写它。
更新2019答案
从Laravel 5.5开始,@ switch就内置于Blade中。使用它如下所示。
@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 Blade没有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
您只需在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
享受吧〜
在LARAVEL 5.2及以上:
在开始和结束PHP语句之间编写常用代码。
@php
switch (x) {
case 1:
//code to be executed
break;
default:
//code to be executed
}
@endphp
在Laravel 5.1中,这适用于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;
}
?>
现在建在Laravel 5.5 https://laravel.com/docs/5.5/blade#switch-statements
您可以像这样扩展刀片:
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():和第一种情况之间有任何空格,则整个代码块将失败。这是PHP限制而不是刀片限制。您可以通过强制正常语法来绕过它,例如:
Blade::directive('switch', function ($expression) {
return "<?php switch($expression) { ?>";
});
Blade::directive('endswitch', function ($) {
return "<?php } ?>";
});
但这感觉有点不对劲。
要克服'switch()'中的空格,您可以使用代码:
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语句时,通常表明您可以进一步重新计算代码。业务逻辑不适用于视图,我宁愿建议您在控制器中执行switch语句,然后将switch语句结果传递给视图。