web-dev-qa-db-ja.com

スイッチインLaravel 5-ブレード

ブレードテンプレートでスイッチを使用するにはどうすればよいですか?私が使用したとき:

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

その結果、このテキストはプレーンテキストとして表示されます。 ifを使用するときよりもクリーンであるため、いくつかのコードでswitchを使用することを好みます。

しかし、それが不可能な場合は、それを書いてください。

65
ventaquil

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
100
Margus Pala

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

お楽しみください〜

27
Germey

IN LARAVEL 5.2以降:

PHPステートメントの開始と終了の間に通常のコードを記述します。

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

これはLaravel 5.5に組み込まれています https://laravel.com/docs/5.5/blade#switch-statements

5
Bader

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;
    }
?>
5
JeffK

「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;
  });
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():と最初のケースの間に空白がある場合、コードブロック全体が失敗します。これは、ブレードの制限ではなく、PHPの制限です。あなたは通常の構文を強制することでそれをバイパスすることができるかもしれません、例えば:

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

しかし、これは少し間違っているように感じます。

0
apokryfos