Schalten Sie Laravel 5 - Blade ein

80

Wie kann ich Switch in Blade-Vorlagen verwenden? Als ich benutzte:

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

im Ergebnis sehe ich diesen Text als Klartext. Ich bevorzuge die Verwendung von Switch in wenigen Codeteilen, da diese für mich sauberer sind als bei Verwendung von if.

Aber wenn es nicht möglich ist, schreibe es einfach.

ventaquil
quelle
@ventaquil Die ausgewählte Antwort ist falsch. Kann die Antwort in die von mir gepostete geändert werden?
Captainblack
@captainblack Entschuldigung, aber diese Lösung ist für Laravel 5.2+ - wir verwenden 5.1 LTS.
Ventaquil
4
Laravel 5.5 führt switch-Anweisungen ein. Ihr Code sollte ordnungsgemäß gerendert werden.
Szaman

Antworten:

128

Aktualisierte 2020 Antwort

Seit Laravel 5.5 ist der @ -Switch in die Blade eingebaut. Verwenden Sie es wie unten gezeigt.

@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

Ältere Antwort

Leider hat Laravel Blade keine switch-Anweisung. Sie können Laravel verwenden, wenn Sie sich einem anderen PHP-Switch nähern oder ihn verwenden. Sie können einfaches PHP in Blade-Vorlagen wie in jeder anderen PHP-Anwendung verwenden. Verwenden Sie ab Laravel 5.2 die Anweisung @php.

Option 1:

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

Sie können diesen Code einfach in die Startmethode der AppServiceProvider-Klasse einfügen.

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

dann können Sie verwenden als:

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

Genieße es ~

Germey
quelle
Das funktioniert nicht. parse error, expecting "Endschalter (T_ENDSWITCH)" & # 039; oder &quot;case (T_CASE)&quot;&#039; or & quot; default (T_DEFAULT) `
mkmnstr
@mkmnstr, Versuchen Sie, `` `
durch`
5
Hat jemand seit diesen Kommentaren positiv gestimmt? Funktioniert das?
Jonathan
1
Die Verwendung von Laravel 5.4 funktioniert bei mir nicht. FatalThrowableError Klasse 'App \ Providers \ Blade' nicht gefunden
Kyle Challis
1
Es funktioniert auf 5.5. Ich wäre nur neugierig, wie ich es mit phpstorm autocompletion (oder einer IDE) @Germey zum Laufen bringen kann.
Michael Villeneuve
22

IN LARAVEL 5.2 UND OBEN:

Schreiben Sie Ihren üblichen Code zwischen den öffnenden und schließenden PHP-Anweisungen.

@php
switch (x) {
    case 1:
        //code to be executed
        break;
    default:
        //code to be executed
}
@endphp
Captainblack
quelle
2
Diese @phpSyntax ist sehr nützlich in L5.2>
Alexander Kim
5

In Laravel 5.1 funktioniert dies in einem 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;
    }
?>
JeffK
quelle
0

Sie können die Klinge wie folgt verlängern:

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

Sie können dann Folgendes verwenden:

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

Beachten Sie jedoch die Warnungen unter: http://php.net/manual/en/control-structures.alternative-syntax.php

Wenn zwischen switch (): und dem ersten Fall ein Leerzeichen steht, schlägt der gesamte Codeblock fehl. Dies ist eher eine PHP-Einschränkung als eine Blade-Einschränkung. Sie können es möglicherweise umgehen, indem Sie die normale Syntax erzwingen, z.

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

Aber das fühlt sich ein bisschen falsch an.

Apokryfos
quelle
-1

Um das Leerzeichen in 'switch ()' zu überwinden, können Sie folgenden Code verwenden:

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

Wenn Sie in Ihren Ansichten switch-Anweisungen verwenden, bedeutet dies normalerweise, dass Sie Ihren Code weiter neu faktorisieren können. Geschäftslogik ist nicht für Ansichten gedacht. Ich würde Ihnen eher empfehlen, die switch-Anweisung in Ihrem Controller auszuführen und dann das Ergebnis der switch-Anweisungen an die Ansicht zu übergeben.

Kreshnik Hasanaj
quelle
9
Um fair zu sein, können switch-Anweisungen sicherlich in die Ansicht gehören. Wenn Sie beispielsweise CSS-Klassen basierend auf Datenbereichen in einer Tabelle festlegen, möchten Sie die Anzeigelogik nicht in den Controller einbetten.
CashIsClay
"Geschäftslogik ist nicht für Ansichten gedacht". Geschäftslogik ist für die visuelle Schicht, die Logikschicht und die Persistenzschicht. Es ist langweilig und überflüssig, aber ein Qualitätscode macht das.
magallanes