切换到Laravel 5 – 刀片

如何使用刀片模板中的开关? 当我使用:

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

结果我看到这个文本是明文的。 我更喜欢使用less量的代码开关,因为它比我使用if更干净。

但如果不可能的话就写下来。

    不幸的是,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 

    选项2:

     @php switch ($login_error) { case 1: echo "`E-mail` input is empty!"; break; case 2: echo "`Password` input is empty!"; } @endphp 

    备选案文3:

     <?php switch ($login_error) { case 1: echo "`E-mail` input is empty!"; break; case 2: echo "`Password` input is empty!"; } ?> 

    您可以在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 

    享受吧〜

    在LARAVEL 5.2及以上:

    在开头和结尾的PHP语句之间写下通常的代码。

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

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

    你可以像这样扩展刀片:

      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()和第一个case之间有空格,那么整个代码块将会失败。 这是一个PHP限制,而不是一个刀片限制。 你可以通过强制正常的语法来绕过它:

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

    但是这感觉有点不对劲。

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

    在视图中开始使用switch语句时,通常表明可以进一步重新分配代码。 业务逻辑不是意味着视图,我宁愿build议你在你的控制器中执行switch语句,然后把switch语句结果传递给视图。