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 và @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 và @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 và @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 và @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à:
55. @continue và @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 và @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ính | Mô tả |
---|---|
$loop->index | Lấy index hiện tại (bắt đầu từ 0) |
$loop->iteration | Lấy số lần đã lặp hiện tại (bắt đầu từ 1) |
$loop->remaining | Lấy số lần lặp còn lại |
$loop->count | Lấy tổng số vòng lặp sẽ lặp |
$loop->first | Nếu tại vòng lặp đầu tiên thì trả về true |
$loop->first | Nếu tại vòng lặp cuối cùng thì trả về true |
$loop->even | Nếu index vòng lặp hiện tại chẵn thì trả về true |
$loop->odd | Nếu index vòng lặp hiện tại lẻ thì trả về true |
$loop->depth | Lấy độ sâu của vòng lặp hiện tại |
$loop->parent | Lấ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é!