Blade template trong Laravel 8 chap 4 - kế thừa

Trong phần tiếp theo của loạt bài Blade template trong Laravel 8 này chúng ta sẽ tìm hiểu về cách xây dựng layout sử dụng kế thừa trong Blade đồng thời chúng ta cũng nghiên cứu luôn cả Form trong Blade nhé các bạn. Không lan man nữa chúng ta vào bài học thôi nào.

I. Xây dựng layout sử dụng kế thừa trong Blade.

Ở bài trước mình đã giới thiệu với mọi người về dựng layout với component trong Blade template rồi. Ngoài cách đó ra thì trong Blade template Laravel còn cho phép chúng ta dựng layout qua việc kế thừa các template nữa.

1. Định nghĩa layout

Để định nghĩa một layout trong blade chúng ta có thể khai báo như bình thường.

Để cho dễ hiểu mời các bạn theo dõi ví dụ sau đây của mình

Ví dụ

Trước hết chúng ta cần tạo thư mục layouts trong resources/views đã nhé các bạn

Tiếp theo là khai báo một layout trong resources/views/layouts/app.blade.php

<html>
<head>
    <title>App Name - @yield('title')</title>
</head>
<body>
@section('sidebar')
    This is the master sidebar.
@show

<div class="container">
    @yield('content')
</div>
</body>
</html>

Trong đó:

  • @yield directive dùng để chỉ định section có name trong yield sẽ được hiển thị.
  • @section directive dùng để định nghĩa nội dung của một section.

2. Kế thừa layout

Sau khi đã tạo được layout rồi, để kế thừa một layout trong blade template chúng ta sử dụng cú pháp sau:

@extends('viewname')

Trong đó: viewname là view mà bạn muốn kế thừa ( ví dụ muốn kế thừa view app ở trên thì khai báo @extends('layouts.app')

Như mình đã nói ở trên thì @section sẽ chỉ định nội dung được hiển thị @yield tương ứng trong layout.

Trong trường hợp nội dung truyền vào section là dữ liệu ngắn đơn giản thì bạn có thể sử dụng cú pháp:

@section('name')

'Data Body'

@endsection

Trong đó:

  • name là tên của section bạn muốn truyền vào layout cha.
  • Data Body là dữ liệu bạn muốn truyền vào trong section.

Ví Dụ

Mình sẽ khai báo một view kế thừa layout ở ví dụ trên.

resources/views/home.blade.php

@extends('layouts.app')

@section('title', 'Page Title')

@section('sidebar')
    @parent

    <p>This is appended to the master sidebar.</p>
@endsection

@section('content')
    <p>This is my body content.</p>
@endsection

Kết quả: (dưới dạng view-source)

Như các bạn cũng đã thấy thì đối với @section('sidebar') mình có sử dụng directive @parent. Directive này sẽ lấy ra nội dung của @section('sidebar') trong layout cha. Nên dùng text "This is the master sidebar." sẽ vẫn được hiển thị ra. Nếu bạn không muốn hiển thị nội dung section trong layout cha thì có thể bỏ @parent directive đi.

Trong một vài trường hợp nếu muốn xác định giá trị mặc định sẽ hiển thị khi không có data truyền vào trong @yield thì bạn có thể sử dụng cú pháp sau:

@yield('name', 'Default content')

Ví Dụ:

resources/views/layouts/app.blade.php

<html>
<head>
    <title>App Name - @yield('title', 'Hoc.tv')</title>
</head>
<body>
@section('sidebar')
    This is the master sidebar.
@show

<div class="container">
    @yield('content')
</div>
</body>
</html>

resources/views/home.blade.php

@extends('layouts.app')

@section('sidebar')
    @parent

    <p>This is appended to the master sidebar.</p>
@endsection

@section('content')
    <p>This is my body content.</p>
@endsection

Kết quả: Xem dưới dạng view-source

Như các bạn đã thấy thì @yield('title') đã hiển thị giá trị là "Hoc.tv" khi mình không khai báo section ở trong view home.blade.php

II. Form trong Blade template.

Trong Blade template, Laravel cũng đã cung cấp sẵn cho chúng ta một số directive hộ trợ cho việc tạo ra các method, csrf token.

Để thêm một input field hidden chứa csrf_token trong trong form các bạn có thể sử dụng directive @csrf.

Ví Dụ:

resources/views/home.blade.php

<form method="POST" action="/profile">
    @csrf
</form>

Kết quả: (dưới dạng view-source)

Ngoài ra bạn có thể sử dụng directive @method để thêm một input hidden chứa method của form. Vì HTML form không thể tạo được method PUT, PATCH, DELETE.

Ví Dụ:

resources/views/home.blade.php

<form action="/foo/bar" method="POST">
    @method('PUT')
</form>

Kết quả: (dưới dạng view-source)

III. Hiển thị validate error message trong Blade template.

Bạn có thể sử dụng @error directive để thực hiện việc hiển thị message lỗi của validation trả về

Ví Dụ:

<label for="title">Post Title</label>

<input id="title" type="text" class="@error('title') is-invalid @enderror">

@error('title')
    <div class="alert alert-danger">{{ $message }}</div>
@enderror

Trong đó $message là biến sẽ được assign data khi có error name là title.

IV. Raw PHP.

Trong một số trường hợp bạn muốn sử dụng code PHP chứa logic code trong blade template bạn có thể sử dụng directive @php với cú pháp như sau:

@php(// code PHP here)
// hoặc
@php
// code PHP here.
@endphp

Ví Dụ:

resources/views/home.blade.php

@php
    $message = "Hoc.tv";
@endphp

{{ $message }}

Kết quả:

Lời kết:

Bài này chỉ nhằm mục đích hướng dẫn cú pháp chèn view, chèn form, kế thừa view trong blade template trong Laravel 8 mà thôi. Để tìm hiểu kỹ hơn các bạn nên tự thực hành nhiều trong project của mình. Chúc các bạn học tốt!

Bình luận