Laravel 5-블레이드 전환


80

블레이드 템플릿에서 스위치를 어떻게 사용할 수 있습니까? 내가 사용했을 때 :

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

결과적으로이 텍스트를 일반 텍스트로 봅니다. if를 사용할 때보 다 나에게 더 깨끗하기 때문에 몇 가지 코드에서 스위치를 사용하는 것을 선호합니다.

하지만 가능하지 않다면 그냥 쓰세요.



@ventaquil 선택한 답변이 잘못되었습니다. 내가 게시 한 답변으로 변경할 수 있습니까?
captainblack

@captainblack 죄송하지만이 솔루션은 Laravel 5.2+ 용입니다. 5.1 LTS를 사용하고 있습니다.
ventaquil

4
laravel 5.5 에는 switch 문이 도입되었습니다. 코드가 제대로 렌더링되어야합니다.
szaman

답변:


129

업데이트 된 2020 답변

Laravel 5.5 이후 @switch는 Blade에 내장되어 있습니다. 아래와 같이 사용하십시오.

@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

이전 답변

불행히도 Laravel Blade에는 switch 문이 없습니다. 그렇지 않으면 Laravel을 사용하거나 일반 PHP 스위치를 사용할 수 있습니다. 다른 PHP 애플리케이션과 마찬가지로 블레이드 템플릿에서 일반 PHP를 사용할 수 있습니다. Laravel 5.2 이상부터 @php 문을 사용하십시오.

옵션 1:

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

29

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

그런 다음 다음과 같이 사용할 수 있습니다.

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

즐기세요 ~


이것은 작동하지 않습니다. parse error, expecting & quot; 엔드 스위치 (T_ENDSWITCH) & quot; & # 039; 또는 &quot;case (T_CASE)&quot;&#039; or & quot; default (T_DEFAULT)`
mkmnstr

@mkmnstr, preg_replace 메소드에서` '`를` "`로 바꾸시겠습니까?
Germey

5
이 댓글 이후로 투표 한 사람이 있습니까? 작동합니까?
Jonathan

1
Laravel 5.4를 사용하면 작동하지 않습니다. FatalThrowableError 클래스 'App \ Providers \ Blade'를 찾을 수 없음
Kyle Challis

1
5.5에서 작동합니다. phpstorm 자동 완성 (또는 IDE) @Germey와 함께 작동하도록하는 방법이 궁금합니다.
Michael Villeneuve

22

LARAVEL 5.2 이상 :

PHP 문을 열고 닫는 사이에 일반적인 코드를 작성합니다.

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

2
@php구문은> L5.2에 매우 유용합니다
알렉산더 김


5

Laravel 5.1에서 이것은 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

다음과 같이 블레이드를 확장 할 수 있습니다.

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

그런 다음 다음을 사용할 수 있습니다.

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

그러나 http://php.net/manual/en/control-structures.alternative-syntax.php 의 경고에 유의 하십시오.

switch () :와 첫 번째 경우 사이에 공백이 있으면 전체 코드 블록이 실패합니다. 이는 블레이드 제한이 아닌 PHP 제한입니다. 다음과 같은 일반 구문을 사용하여 우회 할 수 있습니다.

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

그러나 이것은 약간 잘못된 것 같습니다.


-2

'switch ()'의 공백을 극복하려면 다음 코드를 사용할 수 있습니다.

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

뷰 내에서 switch 문을 사용하기 시작하면 일반적으로 코드를 추가로 리팩터링 할 수 있음을 나타냅니다. 비즈니스 로직은 뷰를위한 것이 아니라 컨트롤러 내에서 switch 문을 수행 한 다음 switch 문 결과를 뷰에 전달하는 것이 좋습니다.


9
공정하게 말하자면, switch 문은 확실히보기에 속할 수 있습니다. 예를 들어 테이블의 데이터 범위를 기반으로 CSS 클래스를 설정하는 경우 컨트롤러에 디스플레이 로직을 포함하고 싶지 않을 것입니다.
CashIsClay 2015

"비즈니스 로직은 뷰를위한 것이 아닙니다." 비즈니스 로직은 시각적 계층, 논리 계층 및 지속성 계층을위한 것입니다. 지루하고 중복되지만 품질 코드가 그렇게합니다.
magallanes 2016-06-07
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.