【问题标题】:Switch in Laravel 5 - Blade在 Laravel 5 中切换 - 刀片
【发布时间】:2015-07-06 00:14:59
【问题描述】:

如何在刀片模板中使用 switch?我用的时候:

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

结果我将此文本视为纯文本。我更喜欢在几段代码中使用 switch,因为它对我来说比使用 if 时更干净。

但如果不可能,就写吧。

【问题讨论】:

  • @ventaquil 选择的答案不正确。答案可以改成我发的那个吗?
  • @captainblack 抱歉,这个解决方案适用于 Laravel 5.2+ - 我们使用的是 5.1 LTS。
  • laravel 5.5 引入了 switch 语句。您的代码应该正确呈现。

标签: php laravel switch-statement laravel-5 blade


【解决方案1】:

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

旧答案

很遗憾 Laravel Blade 没有 switch 语句。如果其他方法或使用普通 PHP 开关,您可以使用 Laravel。您可以在刀片模板中使用纯 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

【讨论】:

    【解决方案2】:

    当您开始在视图中使用 switch 语句时,这通常表明您可以进一步重构代码。业务逻辑不适用于视图,我宁愿建议您在控制器中执行 switch 语句,然后将 switch 语句结果传递给视图。

    【讨论】:

    • 公平地说,switch语句当然可以属于视图。例如,如果您要根据表格中的数据范围设置 CSS 类,则您不希望在控制器中嵌入显示逻辑。
    • “业务逻辑不适用于视图”。业务逻辑用于可视层、逻辑层和持久层。它乏味且多余,但高质量的代码可以做到这一点。
    【解决方案3】:

    您可以在 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 "endswitch (T_ENDSWITCH)"'或&amp;quot;case (T_CASE)&amp;quot;&amp;#039; or "default (T_DEFAULT)`
    • @mkmnstr,尝试在 preg_replace 方法中将 ` ' ` 替换为 ` " `?
    • 自从这些 cmets 以来有人投票吗?这行得通吗?
    • 使用 Laravel 5.4,对我不起作用。找不到 FatalThrowableError 类“App\Providers\Blade”
    • 它确实适用于 5.5。我只是想知道如何让它与 phpstorm 自动完成(或任何 IDE)@Germey 一起工作?
    【解决方案4】:

    在 LARAVEL 5.2 及更高版本中:

    在开始和结束 PHP 语句之间编写常用代码。

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

    【讨论】:

    • 这个@php语法在L5.2中非常有用>
    【解决方案5】:

    在 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;
        }
    ?>
    

    【讨论】:

      【解决方案6】:

      你可以像这样扩展刀片:

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

      但这感觉有点不对劲。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          【讨论】:

            【解决方案9】:

            这有点离题,但由于某种原因,如果“案例”是字符串,使用双引号 @case("foo") 无法按预期工作,以防您遇到此类问题,单引号似乎工作,所以不要使用@case("foo") 使用@case('foo')。也许有更多信息的人可以对此有所了解。

            问候。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-01-05
              • 1970-01-01
              • 2016-12-18
              • 1970-01-01
              • 2016-03-08
              • 2015-04-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多