Przełącz się w Laravel 5 - Blade

80

Jak mogę używać przełącznika w szablonach ostrzy? Kiedy użyłem:

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

w rezultacie widzę ten tekst jako zwykły tekst. Wolę używać przełącznika w kilku fragmentach kodu, ponieważ jest dla mnie bardziej przejrzysty niż gdy używam if.

Ale jeśli nie jest to możliwe, po prostu to napisz.

ventaquil
źródło
@ventaquil Wybrana odpowiedź jest nieprawidłowa. Czy odpowiedź można zmienić na opublikowaną przeze mnie?
captainblack
@captainblack przepraszam, ale to rozwiązanie jest dla Laravel 5.2+ - używamy 5.1 LTS.
ventaquil
4
laravel 5.5 wprowadza instrukcje przełączania. Twój kod powinien renderować się poprawnie.
szaman

Odpowiedzi:

129

Zaktualizowana odpowiedź z 2020 r

Od Laravel 5.5 przełącznik @switch jest wbudowany w Blade. Użyj go, jak pokazano poniżej.

@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

Starsza odpowiedź

Niestety Laravel Blade nie ma instrukcji przełączania. Możesz użyć Laravel, jeśli inaczej, lub użyć zwykłego przełącznika PHP. Możesz używać zwykłego PHP w szablonach blade, tak jak w każdej innej aplikacji PHP. Począwszy od Laravel 5.2 i nowszych użyj instrukcji @php.

Opcja 1:

@if ($login_error == 1)
    `E-mail` input is empty!
@elseif ($login_error == 2)
    `Password` input is empty!
@endif
Margus Pala
źródło
29

Możesz po prostu dodać ten kod w metodzie rozruchu klasy 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;
    });

wtedy możesz użyć jako:

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

Ciesz się tym ~

Germey
źródło
To nie działa. parse error, expecting & bdquo; przełącznik krańcowy (T_ENDSWITCH) & rdquo; & # 039; lub &quot;case (T_CASE)&quot;&#039; or "default (T_DEFAULT)"
mkmnstr
@mkmnstr, Czy próbować zamienić `` '' na `` '' w metodzie preg_replace?
Germey,
5
Czy ktoś zagłosował za tymi komentarzami? czy to działa?
Jonathan
1
Używanie Laravel 5.4 nie działa dla mnie. Nie znaleziono klasy FatalThrowableError „App \ Providers \ Blade”
Kyle Challis
1
Działa na 5.5. Byłbym po prostu ciekawy, jak sprawić, by działał z autouzupełnianiem phpstorm (lub dowolnym IDE) @Germey?
Michael Villeneuve
22

W LARAVEL 5.2 i nowszych:

Napisz swój zwykły kod między otwierającymi i zamykającymi instrukcjami PHP.

@php
switch (x) {
    case 1:
        //code to be executed
        break;
    default:
        //code to be executed
}
@endphp
captainblack
źródło
2
Ta @phpskładnia jest bardzo przydatna w L5.2>
Alexander Kim
5

W Laravel 5.1 działa to w 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
źródło
0

Możesz przedłużyć ostrze w następujący sposób:

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

Następnie możesz użyć następujących:

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

Jednak zwróć uwagę na ostrzeżenia w: http://php.net/manual/en/control-structures.alternative-syntax.php

Jeśli między przełącznikiem (): a pierwszym przypadkiem znajduje się spacja, cały blok kodu zawiedzie. Jest to raczej ograniczenie PHP niż ograniczenie ostrza. Możesz to ominąć, wymuszając normalną składnię, np .:

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

Ale to trochę źle.

apokryfos
źródło
-2

Aby wyeliminować spację w 'switch ()', możesz użyć kodu:

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
źródło
-5

Kiedy zaczynasz używać instrukcji switch w swoich widokach, zwykle oznacza to, że możesz dalej ponownie uwzględniać swój kod. Logika biznesowa nie jest przeznaczona dla widoków, sugerowałbym raczej wykonanie instrukcji switch w kontrolerze, a następnie przekazanie wyniku instrukcji switch do widoku.

Kreshnik Hasanaj
źródło
9
Aby być uczciwym, w widoku z pewnością mogą znajdować się instrukcje dotyczące przełączników. Na przykład, jeśli ustawiasz klasy CSS na podstawie zakresów danych w tabeli, nie chcesz osadzać logiki wyświetlania w kontrolerze.
CashIsClay
„Logika biznesowa nie jest przeznaczona dla widoków”. Logika biznesowa dotyczy warstwy wizualnej, warstwy logicznej i warstwy trwałości. Jest to żmudne i nadmiarowe, ale robi to wysokiej jakości kod.
magallanes,