You are on page 1of 17

13.12.

2022

1 Mô hình MVC
2 Khung phát triển ứng dụng web
CÔNG NGHỆ WEB AN TOÀN
3 Giới thiệu Laravel
Bài 5.2 Khung phát triển ứng dụng web
4 Ứng dụng CRUD với Laravel

Mục tiêu bài học

1 Mô hình MVC
1. Hiểu được bản chất, đặc điểm của mẫu phát triển ứng dụng 2 Khung phát triển ứng dụng web
web MVC
2. Có khả năng đánh giá, lựa chọn, sử dụng khung phát triển 3 Giới thiệu Laravel
ứng dụng web

4 Ứng dụng CRUD với Laravel


Slide 3 of 102

Model-View-Controller Model
• MVC là một mẫu thiết kế trong phát triển ứng dụng web • Model trực tiếp thực hiện các tác vụ trên dữ liệu, thường là
• MVC giúp tách biệt phần thể hiện thông tin với cơ chế xử lý thao tác với database.
thông tin. • Nói cách khác, Model chịu trách nhiệm bảo trì dữ liệu.
Controller • Nhìn chung, Model có tính tự trị cao,
nó không cần biết về sự tồn tại Controller
của Controller và View
Model View

Model View

Slide 5 of 102 Slide 6 of 102

1
13.12.2022

View Controller
• View chịu trách nhiệm hiển thị thông tin cho người dùng; tức • Controller là thành phần chịu trách nhiệm tương tác với
là sinh ra mã (HTML) của trang web. người dùng.
• View cần sử dụng dữ liệu do Model quản lý. • Controller có vai trò chính trong logic làm việc của ứng dụng
web, điều phối hoạt động của Model và View.

Controller Controller

Model View Model View

Slide 7 of 102 Slide 8 of 102

MVC workflow (Ví dụ 1)


1: Client gửi truy vấn (tới Controller)
Browser
2,3: Controller yêu cầu Model thực hiện
thao tác trên dữ liệu và nhận kết quả 1 6
Có thể có nhiều phương án 4,5: Controller yêu cầu View sinh
khác nhau về luồng tương trang HTML (sử dụng thông
tin mới có từ Model) và nhận Controller
Controller tác giữa 3 thành phần kết quả 2 5
3 4
6: Controller gửi trang
HTML cho Client Model View
Model View

Slide 10 of 102

MVC workflow (Ví dụ 2) MVC workflow (Post/Redirect/Get pattern)


1. Client gửi truy vấn Browser
1. POST Browser
2. Controller yêu cầu sinh trang web 2. Create/Update/Delete
3. View yêu cầu dữ liệu 1 6 3. Redirect 1 3 4 9

4. Model gửi dữ liệu 4. GET


5. Yêu cầu trang HTML
5. View sinh và gửi trang HTML Controller Controller
6. Yêu cầu dữ liệu
6. Controller gửi trang HTML 5 2 8
2 7. Cung cấp dữ liệu 5

3 8. Gửi trang HTML 6


Model View Model View
4 9. Chuyển trang HTML 7

Slide 11 of 102 Slide 12 of 102

2
13.12.2022

Ưu/nhược điểm của MVC Một số mẫu khác

Ưu điểm
• Mô-đun hóa nên mã trong sáng: một ứng dụng có nhiều
C, nhiều M, nhiều V; mỗi mô-đun thường khá ngắn. • Hierarchical MVC
• Chuyên môn hóa công việc • Model-View-ViewModel
• Cộng tác, phát triển song song Controller • Model-View-Presenter
Nhược điểm • (còn nữa)
• Khó debug
Model View
• Khó unit test
Slide 13 of 102 Slide 14 of 102

Web Framework
Khung phát triển ứng dụng web (web framework, web
1 Mô hình MVC application framework) là khung phát triển phần mềm dành
cho việc phát triển web, bao gồm web application, web
2 Khung phát triển ứng dụng web services, web resources, and web APIs

3 Giới thiệu Laravel


4 Ứng dụng CRUD với Laravel
Slide 16 of 102

Web Framework Phân loại Web Framework


Web Framework giúp tự động hóa, đơn giản hóa một số • Nơi áp dụng: Server-side, Client-side
công đoạn trong phát triển web: • Ngôn ngữ: PHP, Java, C#, Python, JavaScript...
̶ Truy cập CSDL
• Mẫu thiết kế: MVC, khác
̶ Quản lý phiên
̶ Quản lý template • Mức độ hỗ trợ
̶ Mẫu thiết kế và các lớp cơ sở ̶ Tối thiểu: CodeIgnitor, FastAPI...
(MVC chẳng hạn) ̶ Rất nhiều: Laravel, Spring MVC, ASP.NET...
̶ Lọc dữ liệu
̶ Kiểm soát truy cập
̶ ...
Slide 17 of 102 Slide 18 of 102

3
13.12.2022

Server-Side Web Frameworks Client-Side Web Frameworks

Slide 19 of 102 Slide 20 of 102

Web frameworks technologies market share Open source Backend Frameworks by "GitHub star"

Slide 21 of 102 Slide 22 of 102

Lợi ích của Web Framework


• Tái sử dụng mã
̶ Tốc độ
̶ Hiệu quả
Comparison of web frameworks ̶ An toàn
• Server-side
https://en.wikipedia.org/wiki/Comparison_of_server-side_web_frameworks • Chia sẻ phong cách (style) phát triển
• Client-side
https://en.wikipedia.org/wiki/Comparison_of_JavaScript-based_web_frameworks • Sự hỗ trợ từ cộng đồng

Slide 24 of 102

4
13.12.2022

Giới thiệu Laravel


• PHP MVC web framework
1 Mô hình MVC • Hỗ trợ
̶ ORM (Object-rational mapping)
2 Khung phát triển ứng dụng web ̶ Database migration
̶ Template
3 Giới thiệu Laravel • Module mở rộng
̶ Xác thực, Phân quyền
4 Ứng dụng CRUD với Laravel ̶ ....

Slide 26 of 102

Thiết lập môi trường Kiểm tra môi trường


• Web server, PHP, DBMS (XAMPP)
• Visual Studio Code (vscode)
• Composer
• Node.js và npm

Slide 27 of 102 Slide 28 of 102

Khởi tạo một Laravel project

How to setup VS Code for Laravel


https://www.youtube.com/watch?v=Z2atp-ZUukQ

Slide 30 of 102

5
13.12.2022

Bổ sung 'bootstrap' vào project Mở project trong vscode

C:\xampp\htdocs\hellolaravel> composer require ui


C:\xampp\htdocs\hellolaravel> php artisan ui bootstrap
C:\xampp\htdocs\hellolaravel> npm install
C:\xampp\htdocs\hellolaravel> npm run build

Slide 31 of 102 Slide 32 of 102

Giao diện trang Laravel mặc định

Trang mặc định được sinh ra


thế nào?

Slide 33 of 102

\routes\web.php \resources\views\welcome.blade.php

Slide 35 of 102 Slide 36 of 102

6
13.12.2022

Laravel Request Lifecycle

Cơ chế hoạt động của Laravel


• Request Lifecycle
• Routing

Slide 37 of 102

Debug Laravel
• Debugger là công cụ hữu ích, cần có khi lập trình
• Debug ứng dụng web phức tạp hơn so với debug ứng dụng
thông thường
• Công cụ How to Use Laravel Debugbar
̶ PHP: var_dump(), print_r() https://www.youtube.com/watch?v=DCoYynZ45Ws

̶ Laravel: dd()
̶ Chuyên dụng: xdebug, debugbar

Slide 39 of 102

1 Mô hình MVC
Cài đặt Xdebug cho VSCode 2 Khung phát triển ứng dụng web
trên Windows
https://tanakma.blogspot.com/2022/09/php-xdebug-vscode.html 3 Giới thiệu Laravel
4 Ứng dụng CRUD với Laravel

7
13.12.2022

Mô tả ứng dụng CRUD

• Một ứng dụng quản lý danh bạ (Contacts). Thông tin mỗi


người bao gồm:
̶ họ Laravel naming conventions
̶ tên • Naming conventions
̶ email • Best practices

• Thao tác: Create, Read, Update, Delete


• Không thực hiện xác thực

Slide 43 of 102

Các bước thực hiện Cấu hình CSDL


1 Cấu hình CSDL
2 Tạo model 'Contact'
3 Khởi tạo controller 'ContactController' và thiết lập định tuyến
4 Lập trình tác vụ 'Create'
5 Lập trình tác vụ 'Read'
6 Lập trình tác vụ 'Update'
7 Lập trình tác vụ 'Delete'
Slide 45 of 102 Slide 46 of 102

Các bước thực hiện Tạo model "Contact"


1 Cấu hình CSDL
2 Tạo model 'Contact'
3 Khởi tạo controller 'ContactController' và thiết lập định tuyến
4 Lập trình tác vụ 'Create'
5 Lập trình tác vụ 'Read'
6 Lập trình tác vụ 'Update'
7 Lập trình tác vụ 'Delete'
Slide 47 of 102 Slide 48 of 102

8
13.12.2022

Sườn của migration 'contacts' Chỉnh lại cấu trúc bảng 'contacts'
(trong tập tin migration)
public function up()
{
Schema::create('contacts', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->string('first_name');
$table->string('last_name');
$table->string('email');
});
}

Slide 49 of 102 Slide 50 of 102

Thực hiện migrate Thực hiện migrate

Slide 51 of 102 Slide 52 of 102

Thực hiện migrate Sườn của model 'Contact'

Slide 53 of 102 Slide 54 of 102

9
13.12.2022

Hoàn thiện model 'Contact' Các bước thực hiện


1 Cấu hình CSDL
2 Tạo model 'Contact'
3 Khởi tạo controller 'ContactController' và thiết lập định tuyến
4 Lập trình tác vụ 'Create'
5 Lập trình tác vụ 'Read'
6 Lập trình tác vụ 'Update'
7 Lập trình tác vụ 'Delete'
Slide 55 of 102 Slide 56 of 102

Khởi tạo controller 'ContactController' Sườn của 'ContactController'


và định nghĩa các route

• Controller file: app/Http/Controllers/PhotoController.php


• --resource: tạo sẵn các phương thức CRUD trong controller
để về sau định tuyến nhanh bằng Route::resource()

Slide 57 of 102 Slide 58 of 102

Routing các tác vụ CRUD Routing các tác vụ CRUD

Method Route Controller method Method Route Controller method


GET /contacts index() GET /contacts index()
GET /contacts/{contact} show() GET /contacts/{contact} show()
GET /contacts/create create() GET /contacts/create create()
POST /contacts store() POST /contacts store()
GET /contacts/{contact}/edit edit() GET /contacts/{contact}/edit edit()
PUT/PATCH /contacts/{contact} update() Read: /contacts/{contact}
PUT/PATCH update()
1. Đọc danh sách các contact trong CSDL
DELETE /contacts/{contact} destroy() DELETE /contacts/{contact} destroy()
2. Đọc thông tin chi tiết một contact
Slide 59 of 102 Slide 60 of 102

10
13.12.2022

Routing các tác vụ CRUD Routing các tác vụ CRUD

Update:
Method Route Controller method Method Route
1. Lấy form để chỉnh sửa một contact
Controller method
GET /contacts index() GET 2. Nhận thông
/contacts
tin mới về một contact và index()
GET /contacts/{contact} show() GET cập nhật vào CSDL
/contacts/{contact} show()
GET /contacts/create create() GET /contacts/create create()
POST /contacts store() POST /contacts store()
GET /contacts/{contact}/edit edit() GET /contacts/{contact}/edit edit()
PUT/PATCH /contacts/{contact} update() PUT/PATCH /contacts/{contact} update()
Create:
DELETE /contacts/{contact}
1. Lấy form để nhập thông tin một contact destroy() DELETE /contacts/{contact} destroy()
2. Nhận một contact (mới) và ghi vào CSDL
Slide 61 of 102 Slide 62 of 102

Routing các tác vụ CRUD Các bước thực hiện


1 Cấu hình CSDL
Method Route Controller method
GET /contacts index() 2 Tạo model 'Contact'
GET /contacts/{contact} show() 3 Khởi tạo controller 'ContactController' và thiết lập định tuyến
Delete: Xóa một contact
GET /contacts/create create()
4 Lập trình tác vụ 'Create'
POST /contacts store()
GET /contacts/{contact}/edit edit() 5 Lập trình tác vụ 'Read'
PUT/PATCH /contacts/{contact} update() 6 Lập trình tác vụ 'Update'
DELETE /contacts/{contact} destroy()
7 Lập trình tác vụ 'Delete'
Slide 63 of 102 Slide 64 of 102

Lập trình tác vụ 'Create' Lập trình tác vụ 'Create'


use App\Http\Model\Contact;
class ContactController extends Controller{
Method Route Controller method public function create(){
return view('contacts.create');
GET /contacts index() }
GET /contacts/{contact} show() public function store(Request $request) {
/*Thực tế cần sanitize dữ liệu trước khi lưu*/
GET /contacts/create create() $contact = new Contact([
'first_name'=>$request->get('first_name'),
POST /contacts store() 'last_name'=>$request->get('last_name'),
GET /contacts/{contact}/edit edit() 'email'=>$request->get('email')]);
$contact->save();
PUT/PATCH /contacts/{contact} update() return redirect('/contacts')->with('success', 'Contact saved');
Create:
}
DELETE /contacts/{contact}
1. Lấy form để nhập thông tin một contact destroy() ...
2. Nhận một contact (mới) và ghi vào CSDL
Slide 65 of 102 Slide 66 of 102

11
13.12.2022

Sơ lược về template trong Laravel Sơ lược về template trong Laravel


• Thông thường trong ứng dụng Laravel: Đối với ứng dụng đang xây dựng
̶ các trang HTML được sinh ra bởi Blade Template; [resources/views]
̶ một ứng dụng thường có nhiều Template; +contacts
|- create.blade.php
̶ có một Template đóng vai trò là khung (base) cho mọi View; các
Template khác sẽ mở rộng Template khung này; |- edit.blade.php
̶ template khung cung cấp phần chung cho mọi view (cấu trúc trang, |- index.blade.php
menu, sidebar, footer,...); các template khác sẽ bổ sung các phần +layouts
chi tiết vào template khung (main content,...) |-base.blade.php

Slide 67 of 102 Slide 68 of 102

base.blade.php base.blade.php
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Demo Laravel CRUD app</title> <title>Demo Laravel CRUD app</title>
@vite(['resources/sass/app.scss']) @vite(['resources/sass/app.scss'])
</head> </head>
<body> <body>
• Vite là công cụ phát triển front-end
<div class="container"> @yield('main') </div> • <div
Chỉ class="container">
thị @vite sinh ra các@yield('main')
thẻ HTML để sử dụng
</div>
@vite(['resources/js/app.js']) các tài sản (asset) như CSS, JavaScript, images...
@vite(['resources/js/app.js'])
</body> • Kết quả ở đây là:
</body>
</html> <link rel="stylesheet"
</html>
href="http://localhost/testvite/public/build/assets/xxxx.css" />
Slide 69 of 102 Slide 70 of 102

base.blade.php base.blade.php
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
Kết quả ở đây là:
<head>
<script type="module" <head> Nội dung này sẽ được thay thế bởi
<meta name="viewport" content="width=device-width,initial-scale=1.0">
src="http://localhost/testvite/public/build/assets/yyyy.js"> <meta name="viewport" content="width=device-width,initial-scale=1.0">
@section('main') trong các template con
<title>Demo
</script> Laravel CRUD app</title> <title>Demo Laravel CRUD app</title>
@vite(['resources/sass/app.scss']) @vite(['resources/sass/app.scss'])
</head> </head>
<body> <body>
<div class="container"> @yield('main') </div> <div class="container"> @yield('main') </div>
@vite(['resources/js/app.js']) @vite(['resources/js/app.js'])
</body> </body>
</html> </html>

Slide 71 of 102 Slide 72 of 102

12
13.12.2022

create.blade create.blade
@extends('layouts.base') @extends('layouts.base')
@section('main') @section('main')
<div class="row"> <div class="col-sm-8 offset-sm-2"> <div class="row"> <div class="col-sm-8 offset-sm-2">
<form method="post" action="{{ route('contacts.store') }}"> <form method="post" action="{{ route('contacts.store') }}">
@csrf @csrf 'create' kế thừa 'base'
<div class="form-group"> <div class="form-group">
<label for="first_name">Họ, đệm:</label> <label for="first_name">Họ, đệm:</label>
<input type="text" class="form-control" name="first_name"/> </div> <input type="text" class="form-control" name="first_name"/> </div>
<div class="form-group"> <div class="form-group">
<label for="last_name">Tên:</label> <label for="last_name">Tên:</label>
<input type="text" class="form-control" name="last_name"/> </div> <input type="text" class="form-control" name="last_name"/> </div>
<div class="form-group"> <div class="form-group">
<label for="email">Email:</label> <label for="email">Email:</label>
<input type="text" class="form-control" name="email"/> </div> <input type="text" class="form-control" name="email"/> </div>
<button type="submit" class="btn btn-primary">Add contact</button> <button type="submit" class="btn btn-primary">Add contact</button>
</form> </form>
</div> </div> </div> </div>
@endsection @endsection

Slide 73 of 102 Slide 74 of 102

create.blade create.blade
@extends('layouts.base') @extends('layouts.base')
@section('main') @section('main')
<div class="row"> <div class="col-sm-8 offset-sm-2"> <div class="row"> <div class="col-sm-8 offset-sm-2">
<form method="post" action="{{ route('contacts.store') }}"> <form method="post" action="{{ route('contacts.store') }}">
@csrf @csrf
<div class="form-group"> <div class="form-group">
• create định nghĩa lại vùng main trong base
<label for="first_name">Họ, đệm:</label> <label for="first_name">Họ, đệm:</label>
<input type="text" class="form-control" name="first_name"/> </div> Trả về URL có dạng
<input type="text" class="form-control" name="first_name"/> </div>
<div class="form-group"> • tức là @yield('main') trong base sẽ được thay <div class="form-group">
<label for="last_name">Tên:</label> http(s)://domain/public/contacts
<label for="last_name">Tên:</label>
thế bởi nội dung của @section('main') trong
<input type="text" class="form-control" name="last_name"/> </div> <input type="text" class="form-control" name="last_name"/> </div>
<div class="form-group"> template con (ở đây là create) <div class="form-group">
<label for="email">Email:</label> <label for="email">Email:</label>
<input type="text" class="form-control" name="email"/> </div> <input type="text" class="form-control" name="email"/> </div>
<button type="submit" class="btn btn-primary">Add contact</button> <button type="submit" class="btn btn-primary">Add contact</button>
</form> </form>
</div> </div> </div> </div>
@endsection @endsection

Slide 75 of 102 Slide 76 of 102

create.blade Kết quả Create: lấy form


@extends('layouts.base')
@section('main')
<div class="row"> <div class="col-sm-8 offset-sm-2">
<form method="post" action="{{ route('contacts.store') }}">
@csrf
<div class="form-group">
<label for="first_name">Họ, đệm:</label>
<input type="text" class="form-control" name="first_name"/> </div>
Sinh hidden input chứa
<div class="form-group">
<label for="last_name">Tên:</label>
mã chống CSRF
<input type="text" class="form-control" name="last_name"/> </div>
<div class="form-group">
<label for="email">Email:</label>
<input type="text" class="form-control" name="email"/> </div>
<button type="submit" class="btn btn-primary">Add contact</button>
</form>
</div> </div>
@endsection

Slide 77 of 102 Slide 78 of 102

13
13.12.2022

Kết quả Create: redirect Kết quả Create: cập nhật CSDL

Slide 79 of 102 Slide 80 of 102

Các bước thực hiện Lập trình tác vụ 'Read'


1 Cấu hình CSDL
Method Route Controller method
2 Tạo model 'Contact' GET /contacts index()
3 Khởi tạo controller 'ContactController' và thiết lập định tuyến GET /contacts/{contact} show()
GET /contacts/create create()
4 Lập trình tác vụ 'Create'
POST /contacts store()
5 Lập trình tác vụ 'Read' GET /contacts/{contact}/edit edit()
Read:
PUT/PATCH /contacts/{contact} update()
6 Lập trình tác vụ 'Update' 1. Lấy danh sách contact
DELETE /contacts/{contact}
2. Lấy thông tin chi tiết về một contact destroy()
7 Lập trình tác vụ 'Delete'
Ghi chú: chỉ triển khai index(), còn show() tương tự
Slide 81 of 102 Slide 82 of 102

Lập trình tác vụ 'Create': controller index.blade.php (1/4)


use App\Models\Contact; @extends('layouts.base')
class ContactController extends Controller @section('main')
{ <div class="row"><div class="col-sm-12">
public function index() <h1 class="display-3">Contacts</h1>
<table class="table table-striped">
{
<thead>
$all_contacts = Contact::all();
<tr>
return view('contacts.index', compact('all_contacts')); <td>ID</td>
} <td>Họ và tên</td>
//..... <td>Email</td>
<td colspan = 2></td>
</tr>
Truyền dữ liệu vào View </thead>

Slide 83 of 102 Slide 84 of 102

14
13.12.2022

index.blade.php (2/4) index.blade.php (3/4)


<tbody> <td> <a href="{{ route('contacts.edit',$contact->id)}}" class="btn
@foreach($all_contacts as $contact) btn-primary">Edit</a>
<tr> </td>
<td>{{$contact->id}}</td> <td> <form action="{{ route('contacts.destroy', $contact->id)}}"
method="post">
<td>{{$contact->first_name}} {{$contact->last_name}}</td>
<td>{{$contact->email}}</td> @csrf
@method('DELETE')
<button class="btn btn-danger" type="submit">Delete</button>
</form></td>
• HTML form chỉ hỗ trợ GET và POST
• Chỉ thị này tạo hidden input để lưu tên
của phương thức (DELETE) mà
Laravel sẽ xử lý
Slide 85 of 102 Slide 86 of 102

index.blade.php (4/4) Lập trình tác vụ 'Create': lấy danh sách


@endforeach
</tbody>
</table>
</div>
</div>
@endsection

Slide 87 of 102 Slide 88 of 102

Các bước thực hiện Lập trình tác vụ 'Update'


1 Cấu hình CSDL
MethodUpdate: Route Controller method
2 Tạo model 'Contact' GET 1. Lấy form để edit một contact
/contacts index()
3 Khởi tạo controller 'ContactController' và thiết lập định tuyến GET 2. Gửi thông tin để cập nhật một contact show()
/contacts/{contact}
GET /contacts/create create()
4 Lập trình tác vụ 'Create'
POST /contacts store()
5 Lập trình tác vụ 'Read' GET /contacts/{contact}/edit edit()
6 Lập trình tác vụ 'Update' PUT/PATCH /contacts/{contact} update()
DELETE /contacts/{contact} destroy()
7 Lập trình tác vụ 'Delete'
Slide 89 of 102 Slide 90 of 102

15
13.12.2022

Lập trình tác vụ 'Update': controller edit.blade.php


class ContactController extends Controller{ @extends('layouts.base')
@section('main')
public function edit($id){
<div class="row"> <div class="col-sm-8 offset-sm-2">
$contact = Contact::find($id); <form method="post" action="{{ route('contacts.update',
return view('contacts.edit', compact('contact')); $contact->id) }}">
} @method('PATCH')
@csrf
public function update(Request $request, $id) { <div class="form-group">
$contact = Contact::find($id); <label for="first_name">First Name:</label>
$contact->first_name = $request->get('first_name'); <input type="text" class="form-control" name="first_name"
$contact->last_name = $request->get('last_name'); value={{ $contact->first_name }} />
</div>
$contact->email = $request->get('email'); <!--thêm 2 form-group nữa cho 'last_name' và 'email' --!>
$contact->save(); <button type="submit" class="btn btn-primary">Update</button>
return redirect('/contacts')->with('success', 'Updated!'); </form>
</div></div>
}
@endsection
Slide 91 of 102 Slide 92 of 102

Lập trình tác vụ 'Update': edit Lập trình tác vụ 'Update': redirect

Slide 93 of 102 Slide 94 of 102

Các bước thực hiện Lập trình tác vụ 'Delete'


1 Cấu hình CSDL
Method Route Controller method
2 Tạo model 'Contact' GET /contacts index()
3 Khởi tạo controller 'ContactController' và thiết lập định tuyến GET /contacts/{contact} show()
Delete: Xóa một contact
GET /contacts/create create()
4 Lập trình tác vụ 'Create'
POST /contacts store()
5 Lập trình tác vụ 'Read' GET /contacts/{contact}/edit edit()
6 Lập trình tác vụ 'Update' PUT/PATCH /contacts/{contact} update()
DELETE /contacts/{contact} destroy()
7 Lập trình tác vụ 'Delete'
Slide 95 of 102 Slide 96 of 102

16
13.12.2022

Lập trình tác vụ 'Delete': controller Thực thi tác vụ 'Delete'


class ContactController extends Controller{
public function destroy($id)
{
$contact = Contact::find($id);
$contact->delete();
return redirect('/contacts')->with('success', 'Deleted!');
}
//...

Slide 97 of 102 Slide 98 of 102

Lập trình tác vụ 'Delete': redirect

1 Mô hình MVC
2 Khung phát triển ứng dụng web
3 Giới thiệu Laravel
4 Ứng dụng CRUD với Laravel
Slide 99 of 102

Bài tập về nhà

1. Ở view 'index', hãy thêm nút "Thêm contact" vào cuối danh
sách (để gọi tác vụ 'create')
2. Ở view 'index', hãy bổ sung mã để hiển thị hộp thoại xác
nhận (confirmation) mỗi khi người dùng chọn tác vụ Delete
3. Tìm hiểu việc bổ sung Authentication Scaffolding vào một
ứng dụng Laravel
4. Tim hiểu việc triển khai ứng dụng Laravel lên môi trường
vận hành
Slide 102 of 102

17

You might also like