在Laravel 5中切换-刀片


80

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

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

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

但是,如果不可能,只需编写它。



@ventaquil所选答案不正确。答案可以更改为我发布的答案吗?
captainblack

@captainblack很抱歉,但是此解决方案适用于Laravel 5.2+-我们使用的是5.1 LTS。
ventaquil

4
laravel 5.5引入了switch语句。您的代码应正确呈现。
szaman '17

Answers:


128

更新的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语句。您可以使用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 “默认(T_DEFAULT)”
mkmnstr

@mkmnstr,尝试在preg_replace方法
中将

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中,这适用于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;
    }
?>


0

您可以像这样扩展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::directive('switch', function ($expression) {
    return "<?php switch($expression) { ?>";
});
Blade::directive('endswitch', function ($) {
    return "<?php } ?>";
});

但这感觉有点不对劲。


-1

为了克服'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年

“业务逻辑不适合视图。” 业务逻辑用于可视层,逻辑层和持久层。它繁琐而冗长,但是高质量的代码可以做到这一点。
magallanes16年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.