切换到 Laravel 5 - Blade
Switch in Laravel 5 - Blade
如何在 blade 模板中使用开关?当我使用:
@switch($login_error)
@case(1)
`E-mail` input is empty!
@break
@case(2)
`Password` input is empty!
@break
@endswitch
结果我将此文本视为明文。我更喜欢在几段代码中使用 switch,因为它对我来说比使用 if 时更干净。
但如果不可能就写吧。
2020 年答案更新
因为 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
较早的答案
遗憾的是LaravelBlade没有switch语句。您可以使用 Laravel if else 方法或使用普通 PHP 开关。您可以像在任何其他 PHP 应用程序中一样在 blade 模板中使用纯 PHP。从 Laravel 5.2 开始使用 @php 语句。
选项 1:
@if ($login_error == 1)
`E-mail` input is empty!
@elseif ($login_error == 2)
`Password` input is empty!
@endif
当您开始在视图中使用 switch 语句时,这通常表明您可以进一步重构代码。业务逻辑不适用于视图,我宁愿建议您在控制器中执行 switch 语句,然后将 switch 语句结果传递给视图。
您可以在 AppServiceProvider class 引导方法中添加这些代码。
Blade::extend(function($value, $compiler){
$value = preg_replace('/(\s*)@switch\((.*)\)(?=\s)/', '<?php switch():', $value);
$value = preg_replace('/(\s*)@endswitch(?=\s)/', 'endswitch; ?>', $value);
$value = preg_replace('/(\s*)@case\((.*)\)(?=\s)/', 'case : ?>', $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;
}
?>
您可以像这样扩展 blade:
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 限制。您可以通过强制使用正常语法来绕过它,例如:
Blade::directive('switch', function ($expression) {
return "<?php switch($expression) { ?>";
});
Blade::directive('endswitch', function ($) {
return "<?php } ?>";
});
但这感觉有点不对。
要克服'switch ()'中的space,您可以使用代码:
Blade::extend(function($value, $compiler){
$value = preg_replace('/(\s*)@switch[ ]*\((.*)\)(?=\s)/', '<?php switch():', $value);
$value = preg_replace('/(\s*)@endswitch(?=\s)/', 'endswitch; ?>', $value);
$value = preg_replace('/(\s*)@case[ ]*\((.*)\)(?=\s)/', 'case : ?>', $value);
$value = preg_replace('/(?<=\s)@default(?=\s)/', 'default: ?>', $value);
$value = preg_replace('/(?<=\s)@breakswitch(?=\s)/', '<?php break;', $value);
return $value;
});
现在已内置 Laravel 5.5
https://laravel.com/docs/5.5/blade#switch-statements
有点跑题了,但出于某种原因,如果 'cases' 是字符串,那么使用双引号 @case("foo")
不会按预期工作,以防你遇到这样的问题问题,单引号似乎有效,所以不用 @case("foo")
使用 @case('foo')
。也许有更多信息的人可以对此有所了解。
此致。
如何在 blade 模板中使用开关?当我使用:
@switch($login_error)
@case(1)
`E-mail` input is empty!
@break
@case(2)
`Password` input is empty!
@break
@endswitch
结果我将此文本视为明文。我更喜欢在几段代码中使用 switch,因为它对我来说比使用 if 时更干净。
但如果不可能就写吧。
2020 年答案更新
因为 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
较早的答案
遗憾的是LaravelBlade没有switch语句。您可以使用 Laravel if else 方法或使用普通 PHP 开关。您可以像在任何其他 PHP 应用程序中一样在 blade 模板中使用纯 PHP。从 Laravel 5.2 开始使用 @php 语句。
选项 1:
@if ($login_error == 1)
`E-mail` input is empty!
@elseif ($login_error == 2)
`Password` input is empty!
@endif
当您开始在视图中使用 switch 语句时,这通常表明您可以进一步重构代码。业务逻辑不适用于视图,我宁愿建议您在控制器中执行 switch 语句,然后将 switch 语句结果传递给视图。
您可以在 AppServiceProvider class 引导方法中添加这些代码。
Blade::extend(function($value, $compiler){
$value = preg_replace('/(\s*)@switch\((.*)\)(?=\s)/', '<?php switch():', $value);
$value = preg_replace('/(\s*)@endswitch(?=\s)/', 'endswitch; ?>', $value);
$value = preg_replace('/(\s*)@case\((.*)\)(?=\s)/', 'case : ?>', $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;
}
?>
您可以像这样扩展 blade:
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 限制。您可以通过强制使用正常语法来绕过它,例如:
Blade::directive('switch', function ($expression) {
return "<?php switch($expression) { ?>";
});
Blade::directive('endswitch', function ($) {
return "<?php } ?>";
});
但这感觉有点不对。
要克服'switch ()'中的space,您可以使用代码:
Blade::extend(function($value, $compiler){
$value = preg_replace('/(\s*)@switch[ ]*\((.*)\)(?=\s)/', '<?php switch():', $value);
$value = preg_replace('/(\s*)@endswitch(?=\s)/', 'endswitch; ?>', $value);
$value = preg_replace('/(\s*)@case[ ]*\((.*)\)(?=\s)/', 'case : ?>', $value);
$value = preg_replace('/(?<=\s)@default(?=\s)/', 'default: ?>', $value);
$value = preg_replace('/(?<=\s)@breakswitch(?=\s)/', '<?php break;', $value);
return $value;
});
现在已内置 Laravel 5.5 https://laravel.com/docs/5.5/blade#switch-statements
有点跑题了,但出于某种原因,如果 'cases' 是字符串,那么使用双引号 @case("foo")
不会按预期工作,以防你遇到这样的问题问题,单引号似乎有效,所以不用 @case("foo")
使用 @case('foo')
。也许有更多信息的人可以对此有所了解。
此致。