Переключатель в Laravel 5 - Blade

80

Как я могу использовать переключатель в шаблонах лезвий? Когда я использовал:

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

в результате я вижу этот текст как открытый текст. Я предпочитаю использовать переключатель в нескольких фрагментах кода, потому что он для меня более понятен, чем когда я использую if.

Но если это невозможно, просто напишите.

вентаквиль
источник
@ventaquil Выбран неверный ответ. Можно ли изменить ответ на опубликованный мной?
captainblack
@captainblack извините, но это решение для Laravel 5.2+ - мы используем 5.1 LTS.
ventaquil 01
4
laravel 5.5 вводит операторы переключения. ваш код должен отображаться правильно.
szaman

Ответы:

129

Обновленный ответ 2020 г.

Начиная с 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 нет оператора переключения. Вы можете использовать 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
Маргус Пала
источник
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

Наслаждайся ~

Гермей
источник
Это не работает. parse error, expecting & quot; концевой выключатель (T_ENDSWITCH) & quot; & # 039; или &quot;case (T_CASE)&quot;&#039; or & quot; default (T_DEFAULT) `
mkmnstr
@mkmnstr, попробуйте заменить `'` на `" `в методе preg_replace?
Герми
5
Кто-нибудь проголосовал за эти комментарии? Это работает?
Джонатан
1
Использование Laravel 5.4 у меня не работает. FatalThrowableError Class 'App \ Providers \ Blade' не найден
Кайл Чаллис,
1
Он действительно работает на 5.5. Мне было бы просто интересно, как заставить его работать с автозаполнением phpstorm (или любой IDE) @Germey?
Михаэль Вильнев
22

В LARAVEL 5.2 И выше:

Напишите свой обычный код между открывающими и закрывающими операторами PHP.

@php
switch (x) {
    case 1:
        //code to be executed
        break;
    default:
        //code to be executed
}
@endphp
капитанчерный
источник
2
Этот @phpсинтаксис очень полезен в L5.2>
Александр Ким
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 } ?>";
});

Но это немного неправильно.

апокрифос
источник
-2

Чтобы преодолеть пробел в 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;
  });
Томас В. Эффенди
источник
-5

Когда вы начинаете использовать операторы switch в своих представлениях, это обычно указывает на то, что вы можете дополнительно перефакторить свой код. Бизнес-логика не предназначена для представлений, я бы предпочел предложить вам сделать оператор switch в вашем контроллере, а затем передать результат операторов switch в представление.

Крешник Хасанай
источник
9
Честно говоря, операторы switch, безусловно, могут входить в представление. Например, если вы устанавливаете классы CSS на основе диапазонов данных в таблице, вы не захотите встраивать логику отображения в контроллер.
CashIsClay
«Бизнес-логика не предназначена для представлений». Бизнес-логика предназначена для визуального уровня, уровня логики и уровня сохраняемости. Это утомительно и излишне, но качественный код делает это.
magallanes 07