Chuyển đổi trong Laravel 5 - Blade


80

Làm cách nào để sử dụng công tắc trong các mẫu lưỡi dao? Khi tôi sử dụng:

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

kết quả là tôi thấy văn bản này là văn bản rõ ràng. Tôi thích sử dụng switch trong một vài đoạn mã vì nó rõ ràng hơn đối với tôi so với khi tôi sử dụng if.

Nhưng nếu nó không thể chỉ cần viết nó.



@ventaquil Câu trả lời đã chọn không chính xác. Có thể thay đổi câu trả lời thành câu tôi đã đăng không?
Captainblack,

@captainblack xin lỗi nhưng giải pháp này dành cho Laravel 5.2+ - chúng tôi đang sử dụng 5.1 LTS.
ventaquil

4
laravel 5.5 giới thiệu các câu lệnh switch. mã của bạn sẽ hiển thị đúng.
szaman,

Câu trả lời:


129

Cập nhật câu trả lời năm 2020

Kể từ Laravel 5.5, @switch được tích hợp vào Blade. Sử dụng nó như hình dưới đây.

@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

Câu trả lời cũ hơn

Thật không may, Laravel Blade không có tuyên bố chuyển đổi. Bạn có thể sử dụng Laravel nếu cách tiếp cận khác hoặc sử dụng chuyển đổi PHP thuần túy. Bạn có thể sử dụng PHP thuần túy trong các mẫu phiến giống như trong bất kỳ ứng dụng PHP nào khác. Bắt đầu từ Laravel 5.2 trở lên, hãy sử dụng câu lệnh @php.

Lựa chọn 1:

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

29

Bạn chỉ có thể thêm các mã này trong phương thức khởi động lớp 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;
    });

thì bạn có thể sử dụng như:

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

Hãy tận hưởng nó ~


Điều này không hoạt động. parse error, expecting & quot; công tắc kết thúc (T_ENDSWITCH) & quot; & # 039; hoặc &quot;case (T_CASE)&quot;&#039; or & quot; mặc định (T_DEFAULT) '
mkmnstr

@mkmnstr, Cố gắng thay thế ` '` với `" `trong phương pháp preg_replace?
Germey

5
Có ai ủng hộ kể từ những bình luận này không? Điều này có hiệu quả không?
Jonathan

1
Tôi không sử dụng Laravel 5.4. FatalThrowableError Class 'App \ Providers \ Blade' không tìm thấy
Kyle Challis

1
Nó hoạt động trên 5.5. Tôi chỉ tò mò về cách làm cho nó hoạt động với tính năng tự động hoàn thành phpstorm (hoặc bất kỳ IDE nào) @Germey?
Michael Villeneuve

22

TRONG LARAVEL 5.2 TRỞ LÊN:

Viết mã thông thường của bạn giữa các câu lệnh PHP mở và đóng.

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

2
Đây @phpcú pháp là rất hữu ích trong L5.2>
Alexander Kim


5

Trong Laravel 5.1, điều này hoạt động trong 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

Bạn có thể mở rộng lưỡi dao như vậy:

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

Sau đó, bạn có thể sử dụng như sau:

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

Tuy nhiên, hãy lưu ý các cảnh báo trong: http://php.net/manual/en/control-structures.alternative-syntax.php

Nếu có bất kỳ khoảng trắng nào giữa switch (): và trường hợp đầu tiên thì toàn bộ khối mã sẽ bị lỗi. Đó là một hạn chế của PHP chứ không phải là một hạn chế của phiến. Bạn có thể bỏ qua nó bằng cách sử dụng cú pháp bình thường, ví dụ:

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

Nhưng điều này cảm thấy một chút sai lầm.


-2

Để vượt qua khoảng trống trong 'switch ()', bạn có thể sử dụng mã:

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

Khi bạn bắt đầu sử dụng các câu lệnh chuyển đổi trong chế độ xem của mình, điều đó thường cho thấy rằng bạn có thể tái tính lại mã của mình. Logic nghiệp vụ không dành cho các khung nhìn, tôi khuyên bạn nên thực hiện câu lệnh switch trong bộ điều khiển của mình và sau đó chuyển kết quả câu lệnh switch sang khung nhìn.


9
Công bằng mà nói, câu lệnh switch chắc chắn có thể thuộc về chế độ xem. Ví dụ: nếu bạn đang đặt các lớp CSS dựa trên phạm vi dữ liệu trong bảng, bạn sẽ không muốn nhúng logic hiển thị vào bộ điều khiển.
CashIsClay

"Logic kinh doanh không dành cho các lượt xem". Logic nghiệp vụ dành cho lớp trực quan, lớp logic và lớp bền vững. Nó tẻ nhạt và dư thừa nhưng một mã chất lượng làm được điều đó.
magallanes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.