Laravel5-ブレードに切り替える


80

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

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

結果として、私はこのテキストを平文として見ています。私は、ifを使用する場合よりもクリーンであるため、いくつかのコードでswitchを使用することを好みます。

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



@ventaquil選択した回答が正しくありません。回答を私が投稿したものに変更できますか?
キャプテンブラック2016年

@captainblack申し訳ありませんが、このソリューションはLaravel5.2以降用です-5.1LTSを使用しています。
ventaquil 2016

4
laravel5.5ではswitchステートメントが導入されています。コードは正しくレンダリングされるはずです。
szaman 2017

回答:


129

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を使用するか、プレーン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

29

これらのコードは、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

お楽しみください〜


これは機能しません。parse error, expecting &quot; endswitch(T_ENDSWITCH)&quot;&#039; または&quot;case (T_CASE)&quot;&#039; or &quot; default(T_DEFAULT) `
mkmnstr 2016

@ mkmnstr、preg_replaceメソッドで `''`を `" `に置き換えてみませんか?
Germey 2016

5
これらのコメント以来、誰もが賛成しましたか?これは機能しますか?
ジョナサン

1
Laravel 5.4を使用すると、うまくいきません。FatalThrowableErrorクラス 'App \ Providers \ Blade'が見つかりません
Kyle Challis

1
5.5では動作します。phpstormオートコンプリート(または任意のIDE)@Germeyで動作させる方法に興味がありますか?
Michael Villeneuve

22

LARAVEL 5.2以降:

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

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

2
この@php構文は、L5.2で非常に役立ちます>
Alexander Kim


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

次のようにブレードを拡張できます。

    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 } ?>";
});

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


-2

'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;
  });

-5

ビュー内でswitchステートメントの使用を開始すると、通常、コードをさらにリファクタリングできることを示します。ビジネスロジックはビューを対象としたものではありません。コントローラー内でswitchステートメントを実行してから、switchステートメントの結果をビューに渡すことをお勧めします。


9
公平を期すために、switchステートメントは確かにビューに属することができます。たとえば、テーブルのデータ範囲に基づいてCSSクラスを設定している場合、コントローラーに表示ロジックを埋め込むことは望ましくありません。
CashIsClay 2015

「ビジネスロジックはビューを対象としたものではありません」。ビジネスロジックは、ビジュアルレイヤー、ロジックレイヤー、および永続性レイヤー用です。その退屈で冗長ですが、高品質のコードがそれを行います。
magallanes 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.