切换Laravel 5 - 刀片

问题描述 投票:64回答:8

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

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

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

但如果不可能只写它。

php laravel switch-statement laravel-5 blade
8个回答
107
投票

更新2019答​​案

从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 if else方法或使用普通的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

享受吧〜


22
投票

在LARAVEL 5.2及以上:

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

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

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::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
投票

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

-4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.