Schalten Sie Laravel 5 – Blade ein

Lesezeit: 4 Minuten

Benutzer-Avatar
Ventaquil

Wie kann ich Schalter in Blade-Vorlagen verwenden? Als ich verwendet habe:

@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 ziehe es vor, switch in wenigen Codestücken zu verwenden, weil es für mich sauberer ist als wenn ich if verwende.

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

  • github.com/laravel/framework/issues/1857

    – ceejayoz

    27. April 2015 um 13:49 Uhr

  • @ventaquil Die ausgewählte Antwort ist falsch. Kann die Antwort auf die von mir gepostete geändert werden?

    – kapitänschwarz

    24. November 2016 um 10:38 Uhr


  • @captainblack Entschuldigung, aber diese Lösung ist für Laravel 5.2+ – wir verwenden 5.1 LTS.

    – Bauchspeicheldrüse

    1. Dezember 2016 um 8:05 Uhr

  • laravel 5.5 führt switch-Anweisungen ein. Ihr Code sollte richtig gerendert werden.

    – szaman

    31. August 2017 um 11:56 Uhr


Benutzer-Avatar
Margus Pala

Aktualisierte Antwort 2020

Seit Laravel 5.5 ist der @switch im 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 sonst nähern oder den einfachen PHP-Switch verwenden. Sie können einfaches PHP in Blade-Vorlagen wie in jeder anderen PHP-Anwendung verwenden. Ab Laravel 5.2 und höher verwenden Sie die @php-Anweisung.

Option 1:

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

Benutzer-Avatar
Deutschland

Sie können diesen Code einfach in der Startmethode der AppServiceProvider-Klasse hinzufü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ßen Sie es ~

  • Das funktioniert nicht. parse error, expecting "Endschalter (T_ENDSWITCH)"' oder &quot;case (T_CASE)&quot;&#039; or “Standard (T_DEFAULT)”.

    – mkmnstr

    26. Februar 2016 um 23:50 Uhr


  • @mkmnstr, Versuchen Sie, ` ‘ ` in der Methode preg_replace durch ` ” ` zu ersetzen?

    – Deutschland

    27. Februar 2016 um 6:26 Uhr

  • Hat jemand seit diesen Kommentaren upvoted? Funktioniert das?

    – Jonathan

    10. November 2016 um 10:52 Uhr

  • Mit Laravel 5.4 funktioniert es bei mir nicht. FatalThrowableError Klasse „App\Providers\Blade“ nicht gefunden

    – Kyle Challis

    8. August 2017 um 23:15 Uhr

  • Unter 5.5 funktioniert es. Ich wäre nur neugierig, wie ich es mit der automatischen Vervollständigung von phpstorm (oder einer beliebigen IDE) @Germey zum Laufen bringen kann?

    – Michael Villeneuve

    23. Oktober 2017 um 2:20 Uhr

IN LARAVEL 5.2 UND HÖHER:

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

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

  • Dies @php Syntax ist sehr nützlich in L5.2 >

    – Alexander Kim

    16. Dezember 2016 um 6:11 Uhr


Dies ist jetzt in Laravel 5.5 eingebaut
https://laravel.com/docs/5.5/blade#switch-statements

In Laravel 5.1 funktioniert das 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;
    }
?>

Benutzer-Avatar
Apokryfos

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 in: http://php.net/manual/en/control-structures.alternative-syntax.php

Wenn sich zwischen switch(): und dem ersten Fall ein Leerzeichen befindet, schlägt der gesamte Codeblock fehl. Das ist eher eine PHP-Beschränkung als eine Blade-Beschrä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.

Benutzer-Avatar
Michael Kiari

Es ist ein bisschen off-topic, aber aus irgendeinem Grund, wenn die ‘Fälle’ Zeichenfolgen sind, werden doppelte Anführungszeichen als solche verwendet @case("foo") nicht wie erwartet funktioniert, falls Sie ein solches Problem haben, einfache Anführungszeichen scheinen zu funktionieren, also statt @case("foo") verwenden @case('foo'). Vielleicht kann jemand mit mehr Informationen etwas Licht ins Dunkel bringen.

Grüße.

1353500cookie-checkSchalten Sie Laravel 5 – Blade ein

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy