Переключатель в Laravel 5-Blade
Как я могу использовать переключатель лезвия шаблоны? Когда я использовал:
@switch($login_error)
@case(1)
`E-mail` input is empty!
@break
@case(2)
`Password` input is empty!
@break
@endswitch
в результате я вижу этот текст как обычный текст. Я предпочитаю использовать switch в нескольких фрагментах кода, потому что это более чисто для меня, чем когда я использую if.
но если это невозможно просто написать.
8 ответов:
обновление версии 2018
Так как Laravel 5.5 переключатель @встроен в лезвие. Используйте его, как показано ниже.
@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
вы можете просто добавить этот код в метод загрузки класса AppServiceProvider.
Blade::extend(function($value, $compiler){ $value = preg_replace('/(\s*)@switch\((.*)\)(?=\s)/', '<?php switch():', $value); $value = preg_replace('/(\s*)@endswitch(?=\s)/', 'endswitch; ?>', $value); $value = preg_replace('/(\s*)@case\((.*)\)(?=\s)/', 'case : ?>', $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 это работает в лезвии:
<?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; } ?>
Это теперь построено в Laravel 5.5 https://laravel.com/docs/5.5/blade#switch-statements
вы можете расширить лезвие вот так:
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
Если есть какие-либо пробелы между коммутатором(): и первый случай, то весь блок кода не будет работать. Это ограничение 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)/', '<?php switch():', $value); $value = preg_replace('/(\s*)@endswitch(?=\s)/', 'endswitch; ?>', $value); $value = preg_replace('/(\s*)@case[ ]*\((.*)\)(?=\s)/', 'case : ?>', $value); $value = preg_replace('/(?<=\s)@default(?=\s)/', 'default: ?>', $value); $value = preg_replace('/(?<=\s)@breakswitch(?=\s)/', '<?php break;', $value); return $value; });
когда вы начинаете использовать операторы switch в своих представлениях, это обычно указывает на то, что вы можете дополнительно изменить свой код. Бизнес-логика не предназначена для представлений, я бы скорее предложил вам сделать оператор switch в вашем контроллере, а затем передать результат операторов switch в представление.
Comments