切换到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语句结果传递给视图。