切换到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; });
这现在build在Laravel 5.5 https://laravel.com/docs/5.5/blade#switch-statements
在视图中开始使用switch语句时,通常表明可以进一步重新分配代码。 业务逻辑不是意味着视图,我宁愿build议你在你的控制器中执行switch语句,然后把switch语句结果传递给视图。