Перемикач у 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

4
laravel 5.5 представляє оператори switch. ваш код повинен відображатися належним чином.
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; за замовчуванням (T_DEFAULT) `
mkmnstr

@mkmnstr, Спробуйте замінити `` на `` `у методі preg_replace?
Гермі

5
Хтось голосував за ці коментарі? Це працює?
Джонатан

1
Використання Laravel 5.4 мені не підходить. Клас FatalThrowableError 'App \ Providers \ Blade' не знайдено
Kyle Challis

1
Це працює на 5.5. Мені було б просто цікаво, як змусити його працювати з автозавершенням phpstorm (або будь-якою IDE) @Germey?
Michael Villeneuve

22

У ЛАРАВЕЛІ 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 це працює як лезо:

<?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

Якщо між перемикачем (): і першим випадком є ​​пробіли, тоді весь блок коду вийде з ладу. Це обмеження 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 у подання.


9
Чесно кажучи, твердження про перемикання, безумовно, можуть належати до точки зору. Наприклад, якщо ви встановлюєте класи CSS на основі діапазонів даних у таблиці, ви не хочете вбудовувати логіку відображення в контролер.
CashIsClay

"Бізнес-логіка не призначена для поглядів,". Бізнес-логіка - це візуальний рівень, рівень логіки та рівень стійкості. Це нудно і зайво, але код якості робить це.
magallanes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.