ブレードテンプレートでスイッチを使用するにはどうすればよいですか?私が使用したとき:
@switch($login_error)
@case(1)
`E-mail` input is empty!
@break
@case(2)
`Password` input is empty!
@break
@endswitch
その結果、このテキストはプレーンテキストとして表示されます。 ifを使用するときよりもクリーンであるため、いくつかのコードでswitchを使用することを好みます。
しかし、それが不可能な場合は、それを書いてください。
2019年の回答を更新
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 Bladeにはswitchステートメントがありません。他にアプローチする場合はLaravelを使用でき、プレーン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
お楽しみください〜
IN LARAVEL 5.2以降:
PHPステートメントの開始と終了の間に通常のコードを記述します。
@php
switch (x) {
case 1:
//code to be executed
break;
default:
//code to be executed
}
@endphp
これはLaravel 5.5に組み込まれています https://laravel.com/docs/5.5/blade#switch-statements
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;
}
?>
「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;
});
次のようにブレードを拡張できます。
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 } ?>";
});
しかし、これは少し間違っているように感じます。