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

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 ~


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

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


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.


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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.