web-dev-qa-db-fra.com

Basculer dans Laravel 5 - Lame

Comment utiliser un commutateur dans les modèles de lame? Quand j'ai utilisé:

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

en conséquence, je vois ce texte en texte clair. Je préfère utiliser switch dans quelques morceaux de code car il est plus propre que lorsque j'utilise if.

Mais si ce n'est pas possible, écrivez-le.

70
ventaquil

Réponse mise à jour 2019

Depuis Laravel 5.5, le @ commutateur est intégré à la lame. Utilisez-le comme indiqué ci-dessous.

@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

Réponse plus ancienne

Malheureusement, Laravel La lame n'a pas d'instruction switch. Vous pouvez utiliser Laravel si vous utilisez une autre approche ou utilisez le commutateur plain PHP. Vous pouvez utiliser un simple PHP dans les modèles de lame, comme dans toute autre application PHP. À partir de Laravel 5.2 et supérieur, utilisez l'instruction @php.

Option 1:

@if ($login_error == 1)
    `E-mail` input is empty!
@elseif ($login_error == 2)
    `Password` input is empty!
@endif
107
Margus Pala

Vous pouvez simplement ajouter ce code dans la méthode de démarrage de la classe 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;
    });

alors vous pouvez utiliser comme:

@switch( $item )
    @case( condition_1 )
        // do something
    @breakswitch
    @case( condition_2 )
        // do something else
    @breakswitch
    @default
        // do default behaviour
    @breakswitch
@endswitch

Profitez-en ~

29
Germey

IN LARAVEL 5.2 ET PLUS:

Ecrivez votre code habituel entre les instructions PHP d'ouverture et de fermeture.

@php
switch (x) {
    case 1:
        //code to be executed
        break;
    default:
        //code to be executed
}
@endphp
22
captainblack

Ceci est maintenant construit dans Laravel 5.5 https://laravel.com/docs/5.5/blade#switch-statements

5
Bader

Dans Laravel 5.1, cela fonctionne dans une lame:

<?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;
    }
?>
5
JeffK

Pour surmonter l'espace dans 'switch ()', vous pouvez utiliser le code:

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;
  });
0
Thomas W. Effendi

Vous pouvez prolonger la lame comme ceci:

    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; ?>";
    });

Vous pouvez ensuite utiliser les éléments suivants:

@switch($test)
@case(1)
        Words
@break
@case(2)
    Other Words
    @break
@default
    Default words
@endswitch

Cependant, notez les avertissements dans: http://php.net/manual/en/control-structures.alternative-syntax.php

S'il y a des espaces blancs entre switch (): et le premier cas, le bloc de code entier échouera. Il s’agit d’une limitation de PHP plutôt que d’une limitation de lame. Vous pourrez peut-être le contourner en forçant la syntaxe normale, par exemple:

Blade::directive('switch', function ($expression) {
    return "<?php switch($expression) { ?>";
});
Blade::directive('endswitch', function ($) {
    return "<?php } ?>";
});

Mais cela semble un peu faux.

0
apokryfos