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



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



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


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



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

827   8  

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

    Ничего не найдено.