Blade template - Cấu trúc điều khiển (Control structure)

Tiếp tục chuỗi bài tìm hiểu Blade template hôm nay chúng ta sẽ tìm hiểu về các cấu trúc điều khiển (Control structure) Blade template. Những cú pháp điều khiển như if, for, foreach...  rất thuận tiện, nhanh gọn nhưng lại không làm mất đi bản chất vốn có của các cấu trúc điều khiển. Chúng ta bắt đầu bài học thôi nào.

I. Câu lệnh "if" ("if" statement)

Chúng ta có thể khởi tạo câu lệnh if bằng các thẻ @if, @elseif, @else@endif.

@if (count($records) === 1)
    Có 1 
@elseif (count($records) > 1)
   Có nhiều
@else
    Không có
@endif

Như bạn thấy đấy chỉ là cú pháp hơi khác còn cách khai báo các điều kiện và hoạt động vẫn không khác gì cấu trúc điều kiện thuần túy

Blade template cung cấp cho chúng ta thẻ @unless:

@unless (Auth::check())
    Chưa đăng nhập
@endunless

Trong đó 

Phương thức Auth::check là dùng để kiểm tra xem user có đăng nhập hay chưa. Hiện tại chúng ta chưa học tới nên chắn chắc method này sẽ trả về giá trị là false. Ở đây unless đồng nghĩa với if not.

@isset@empty hai thẻ này đại diện cho hai hàm quen thuộc trong PHP là isset và empty.

@isset($records)
    // 
@endisset


@empty($records)
    // 
@endempty

1. Authentication

Hai thẻ @auth@guest  dùng để kiểm tra xem user hiện tại có đăng nhập hay chưa.

@auth
    Đã đăng nhập
@endauth


@guest
    Chưa đăng nhập
@endguest

Ngoài ra chúng ta có thể truyền tham số cho hai thẻ này để kiểm tra trạng thái đăng nhập của user với tư cách là ai. Ví dụ  một tài khoản có vai trò là "user" thì sau khi đăng nhập đương nhiên không thể truy cập vào admin cpanel được. Tính năng này được gọi là "Authentication Guard" và chúng ta sẽ tìm hiểu về nó sau.

@auth('admin')
    Đã đăn nhập với tư cách là "admin"
@endauth

@guest('admin')
    Chưa đăng nhập với tư cách là "admin"
@endguest

2. Section

Chúng ta có thể kiểm tra sự tồn tại của một section bằng thẻ @hasSection với tham số truyền vào là tên của section cần kiểm tra.

@hasSection('navigation')
    // 
@endif

II. Câu lệnh "switch" ("switch" statement)

Lệnh switch trong Blade template được khởi tạo bằng các thẻ @switch, @case, @break, @default@endswitch.

@switch($i)
    @case(1)
        First case...
        @break


    @case(2)
        Second case...
        @break


    @default
        Default case...
@endswitch

III. Vòng lặp (Loop) trong Blade template

Cũng giống như các cấu trúc điều khiển khác, các câu lệnh loop trong Blade template vẫn được giữ nguyên cách thức hoạt động.

1. Vòng lặp FOR @for

// For statement
@for ($i = 0; $i < 10; $i++)
{{ $i }} </br>
@endfor

2. Vòng lặp Foreach@foreach

// Foreach statement
@foreach ($array as $row)
{{ $row['attr'] }} </br>
@endforeach

3. Vòng lặp white @while 

// While statement
@while (true)
<p>I'm looping forever.</p>
@endwhile

4. Vòng lặp @forelse, thẻ này hoạt động giống như là @foreach nhưng ta có thể kiểm tra nhanh xem object tham chiếu trong loop có rỗng hay không, nếu có thì sẽ thực thi lệnh gì đó thông qua thẻ @empty.

Bạn có thể test đoạn code này thì sẽ hiểu rõ thẻ @forelse ngay.

resources/views/home.blade.php

@forelse ([] as $user)
    <li>{{ $user['name'] }}</li>
@empty
    <p>No users</p>
@endforelse

Ở trên mình đã truyền một mảng rỗng vào vòng lặp, lặp tức thì nó sẽ được kiểm tra qua thẻ @empty. Kết qua ta thu được sẽ là:

Blade template - Cấu trúc điều khiển (Control structure) 1

55. @continue @break.

@for ($i = 1; $i <= 10; $i++)
    @if ($i == 1)
        @continue
    @endif


    {{ $i }}


    @if ($i == 5)
        @break
    @endif
@endforeach

Nếu bạn thấy mỗi lần muốn break hoặc continue phải lồng trong một câu lệnh if thì hơi dài và khá rối mắc. Chính vì thế Laravel cho phép bạn truyền điều kiện vào hai thẻ @break @continue để rút ngắn thời gian cho bạn.

@for ($i = 1; $i <= 10; $i++)
    @continue($i == 1)
    {{ $i }}
    @break($i == 5)
@endforeach

IV. Biến vòng lặp (The loop variable)

Khi sử dụng các lệnh vòng lặp foreach, forelse mặc định sẽ có sẵn biến $loop bên trong vòng lặp. Biến này cho phép ta lấy các thông tin hay sử dụng như index hiện tại, index đầu, index cuối vòng lặp...

@foreach ($users as $user)
    @if ($loop->first)
        This is the first iteration.
    @endif

    @if ($loop->last)
        This is the last iteration.
    @endif

    <p>This is user {{ $user->id }}</p>
@endforeach

Nếu bạn có các vòng lặp lồng nhau thì có thể tham chiếu $loop của vòng lặp cha bằng thuộc tính parent trong vòng lặp con.

@foreach ($users as $user)
    @foreach ($user->posts as $post)
        @if ($loop->parent->first)
            This is first iteration of the parent loop.
        @endif
    @endforeach
@endforeach

Dưới đây là toàn bộ các thông tin $loop có thể cung cấp:


Thuộc tínhMô tả
$loop->indexLấy index hiện tại (bắt đầu từ 0)
$loop->iterationLấy số lần đã lặp hiện tại (bắt đầu từ 1)
$loop->remainingLấy số lần lặp còn lại
$loop->countLấy tổng số vòng lặp sẽ lặp
$loop->firstNếu tại vòng lặp đầu tiên thì trả về true
$loop->firstNếu tại vòng lặp cuối cùng thì trả về true
$loop->evenNếu index vòng lặp hiện tại chẵn thì trả về true
$loop->oddNếu index vòng lặp hiện tại lẻ thì trả về true
$loop->depthLấy độ sâu của vòng lặp hiện tại
$loop->parentLấy $loop của vòng lặp cha trong vòng lặp con


V. Comment

Blade template cũng cho phép chúng ta comment để code dễ hiểu, dễ quản lý hơn với cú pháp:

{{-- This comment will not be present in the rendered HTML --}}

VI. PHP

Chúng ta cũng có thể chèn code PHP vào trong Blade template trong cặp thẻ @php ... @endphp.

@php
    //
@endphp

Lưu ý: Bạn không nên qua lạm dụng thể này để thực thi một số xử lý logic phức tạp, điều này sẽ làm mất bản chất của view. Với các xử lý logic phức tạp, bạn nên thực thi ở view composer hoặc controller action, sau đó mới truyền đến view đển render.

Lời kết:

Tùy vào nhu cầu sử dụng chúng ta có thể áp dụng linh hoạt cấu trúc điều khiển (Control structure) trong Balade Template nhé. Đến đây bài cũng hơi bị dài rồi hẹn gặp các bạn ở bài học tiếp theo, chúc các bạn học tốt nhé!

Bình luận