Trong phần này, chúng ta sẽ cùng khám phá chi tiết hơn về lý do tại sao Laravel lại trở thành sự lựa chọn hàng đầu của cộng đồng lập trình PHP, các tính năng nổi bật của nó, và cách màLa
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI
KHOA CÔNG NGHỆ THÔNG TIN
ĐỀ TÀI: TÌM HIỂU VỀ FRAMEWORK LARAVEL VÀ
SO SÁNH CÔNG NGHỆ ĐI KÈM SPRINGBOOT
Lớp: Công nghệ thông tin 4
Mã sinh viên Họ và tên thành viên
211213343 Lê Minh Phước
211213703 Nguyễn Tiến Anh
211202521 Nguyễn Duy Dương
Giảng viên hướng dẫn: Nguyễn Trọng Phúc
Hà Nội, ngày 8 tháng 9 năm 2024
1
Trang 2Lời mở đầu
Trong bối cảnh công nghệ phát triển không ngừng, các framework đã trở thành công cụ quantrọng giúp lập trình viên xây dựng ứng dụng web một cách nhanh chóng, hiệu quả và bảo mật.Trong đó, Laravel nổi lên như một trong những framework PHP phổ biến nhất hiện nay Điềunày xuất phát từ nhu cầu thực tế của các doanh nghiệp và dự án phát triển ứng dụng web hiệnđại, đòi hỏi tính mở rộng, bảo trì dễ dàng và khả năng tích hợp với nhiều công nghệ khác
Việc nghiên cứu và tìm hiểu về Laravel không chỉ đơn thuần là học cách sử dụng một công cụlập trình Nó còn giúp chúng ta hiểu rõ hơn về cách xây dựng một ứng dụng web chuyên nghiệp,
từ việc quản lý cơ sở dữ liệu, xử lý yêu cầu người dùng, cho đến việc tối ưu hóa hiệu suất và bảomật Laravel cung cấp một hệ sinh thái phong phú, hỗ trợ tối đa cho lập trình viên trong quá trìnhphát triển, giúp giải quyết các vấn đề thường gặp khi xây dựng ứng dụng
Trong phần này, chúng ta sẽ cùng khám phá chi tiết hơn về lý do tại sao Laravel lại trở thành
sự lựa chọn hàng đầu của cộng đồng lập trình PHP, các tính năng nổi bật của nó, và cách màLaravel giúp đơn giản hóa việc xây dựng ứng dụng web so với các framework khác
2
Trang 3I Giới thiệu 4
1.1 Lịch sử hình thành Laravel? 4
1.1.1 PHP và các framework đầu tiên 4
1.1.2 Sự ra đời của Laravel 4
1.2 License 4
II Kiến trúc Laravel 5
2.1 Tầng ứng dụng của Laravel 6
2.2 Design Pattern 7
2.2.1 MVC 7
2.2.2 Singleton Pattern 9
2.2.3 Repository Pattern 11
2.2.4 Dependency Injection Pattern 11
2.2.5 Observer Pattern 15
III Các tính năng nổi bật của Laravel 17
3.1 Routing 17
3.2 Eloquent ORM 18
3.3 Blade Templating Engine 20
3.4 Authentication và Authorization 21
3.5 Queues & Jobs 22
3.6 Artisan CLI 22
Báo cáo kĩ thuật
3
Trang 4Tìm hiểu về framework Laravel
I Giới thiệu
1.1 Lịch sử hình thành Laravel?
1.1.1 PHP và các framework đầu tiên
PHP (PHP: Hypertext Preprocessor) ra đời vào năm 1994 do Rasmus Lerdorf phát triển, ban
đầu là một tập hợp các tập lệnh để theo dõi truy cập cá nhân trên web PHP nhanh chóng trởthành ngôn ngữ phổ biến để xây dựng web nhờ tính dễ sử dụng, khả năng nhúng vào HTML, vàtốc độ xử lý nhanh
Tuy nhiên, khi các dự án web ngày càng lớn, việc quản lý mã trở nên phức tạp, từ đó cácframework PHP ra đời để giúp tổ chức mã nguồn tốt hơn, giảm thiểu lỗi và tăng tốc độ pháttriển Một số framework nổi bật giai đoạn đầu gồm:
CodeIgniter: Nổi tiếng vì dễ học và không yêu cầu cấu hình nhiều, nhưng thiếu các tính nănghiện đại như hệ thống ORM mạnh mẽ và bảo mật tốt
Symfony: Một framework mạnh mẽ và linh hoạt, nhưng cú pháp phức tạp và yêu cầu cấuhình nhiều hơn, gây khó khăn cho các lập trình viên mới
1.1.2 Sự ra đời của Laravel
Nhận thấy những hạn chế của các framework trước, Taylor Otwell phát triển Laravel vào năm
2011 với mục tiêu mang lại sự dễ dàng sử dụng và các tính năng hiện đại cho lập trình viên PHP.Laravel nhanh chóng trở nên phổ biến nhờ cú pháp đơn giản, tích hợp nhiều tính năng mạnh mẽ
mà các framework trước không có hoặc làm chưa tốt
1.2 License
Laravel sử dụng giấy phép MIT (MIT License) Đây là một giấy phép phần mềm mã nguồn mở, cho phép bạn tự do sử dụng, sao chép, chỉnh sửa và phân phối phần mềm, miễn là bạn giữ lại thông báo bản quyền ban đầu và miễn trừ trách nhiệm trong mã nguồn
Cụ thể, giấy phép MIT rất đơn giản và linh hoạt, với các điều khoản chính sau:
4
Trang 51 Bạn có quyền sử dụng mã nguồn cho bất kỳ mục đích nào, bao gồm mục đích thương mại.
2 Bạn có thể chỉnh sửa và phân phối mã nguồn hoặc các phiên bản đã chỉnh sửa của nó
3 Bạn cần giữ lại bản quyền và miễn trừ trách nhiệm của giấy phép MIT trong mã nguồn
Laravel, được phát hành dưới giấy phép này, cho phép các nhà phát triển sử dụng framework trong các dự án cá nhân và thương mại mà không có giới hạn lớn
II Kiến trúc Laravel
Trước khi đi vào tìm hiểu chi tiết Laravel thì ta cần tìm hiểu về quy trình biên dịch và thực thi
mã lệnh trong Laravel như thế nào để ta có được một cái nhìn tổng quan về khả năng làm việc vàhiệu suất của riêng các framework PHP là một ngôn ngữ thông dịch (interpreted language), điều này có nghĩa là mã nguồn PHP không được biên dịch trước thành mã máy (machine code) Thay vào đó, nó được thực thi trực tiếp bởi máy chủ khi có yêu cầu (request) Điều này khác với các ngôn ngữ biên dịch như Java (sử dụng trong Spring Boot), nơi mã nguồn phải được biên dịch trước khi chạy
Cơ chế này hoạt động như sau:
- Client ( Brower ): Người dùng gửi yêu cầu HTTP tới server qua trình duyệt, yêu cầu
một trang web hoặc tài nguyên cụ thể
- Web Server( Nginx /Apache ): Máy chủ web nhận yêu cầu và phân tích dường dẫn
URL Nếu yêu cầu liên quan đến mã PHP, nó sẽ chuyển yêu cầu đến trình thông dịch PHP
- PHP Interpreter ( PHP-FPM/ mod_php) :
+ Đây là phần mềm thực hiện mã PHP Khi nhận yêu cầu, nó đọc mã PHP từ file nguồn
+ Tại sao lại dùng trình thông dịch ? PHP là một ngôn ngữ thông dịch, có nghĩa là
mã không cần phải biên dịch trước Thay vào đó, nó được thực thi ngay lập tức,
Trang 6giúp giảm thời gian phát triển Tức là trình thông dịch của PHP sẽ đọc file php từng dòng một và chuyển đổi nó thành mã máy và thực thi ngay lập tức và không cần phải biên dịch thành file nhị phân trước như trong các ngôn ngữ biên dịch Cũng bởi điều này nên tốc độ thực thi có thể chậm hơn so với các ngôn ngữ biên dịch ( do phải phân tích và dịch mã runtime ) nhưng bù lại việc phát triển và thử nghiệm nhanh chóng hơn rất nhiều
- Mã PHP Source Code: Đây là mã nguồn mà bạn viết ( ví dụ, mã trong file
route/web.php ) Trình thông dịch PHP sẽ đọc và thực thi mã này, thực hiện các phép toán và logic được định nghĩa trong mã
- Bytecode (Opcache):
+ Khi mã PHP được thực thi, nó được biên dịch thành bytecode ( mã giữa ) để tối
ưu hiệu suất ( nếu mã được biên dịch thành bytecode một lần, lần sau chỉ cần thựcthi bytecode đó mà không cần biên dịch lại từ mã nguồn, tiết kiệm thời gian )+ Opcache là một phần mở rộng của PHP giúp lưu trữ bytecode để không phải biên dịch lại mã nguồn cho mỗi yêu cầu, Opcache có chức năng lưu trữ bytecode (trong RAM ), tái sử dụng bytecode, có thể tự động tạo lại bytecode mỗi khi có yêu cầu cho một file PHP mà bytecode không có trong bộ nhớ ( chẳng hạn sau khikhởi động lại server ), phát hiện thay đổi trong file ( nếu có sự thay đổi trong file Opcache cũng sẽ phát hiện thay đổi đó và biên dịch lại mã nguồn để tạo bytecode mới thay thế bytecode cũ trong bộ nhớ )
- Machine Code: Bytecode được chuyển đổi thành mã máy, có thể được CPU thực thi
- Rendered View (HTML): Mã PHP có thể trả về nội dung HTML, sau đó nó sẽ được
gửi trở lại cho trình duyệt dưới dạng một trang web
- Cuối cùng, máy chủ gửi phản hồi HTTP chứa HTML đã render trở lại cho trình duyệt.
- Cũng giống như xử lý dữ liệu bình thường, nhưng mà biên dịch khi gặp các route API thì không có việc chuyển đổi thành bytecode và mã máy mà sau khi biên dịch mà xử lý logic dữ liệu, logic nghiệp vụ lấy dữ liệu chuyển thành dạng json để trả về cho clien
2.1 Tầng ứng dụng của Laravel
6
Client ( Brower ) Web Server ( Nginx / Apache ) PHP Interpreter (PHP-FPM/ mod_php)
Response to Client ( API )
JSON Response (API Data) PHP Code (Controller/ API Logic )
View: Tầng mà người dùng tương tác, hiển thị dữ liệu và nhận đầu vào từ người dùng.
Trang 8 Model: Được quản lý bởi Eloquent ORM, cung cấp cách tương tác với cơ sở dữ liệu theo
cách rất tự nhiên và cú pháp dễ hiểu
Tương tác với cơ sở dữ liệu thông qua Eloquent ORM: Cho phép lập trình viên dễ dàngtương tác với cơ sở dữ liệu mà không cần viết truy vấn SQL Hỗ trợ nhiều quan hệ dữliệu phức tạp như one-to-one, one-to-many, many-to-many chỉ bằng vài dòng mã.Eloquent tự động ánh xạ tên bảng nếu nó khác với tên model (bằng cách chỉ định $table)
Hỗ trợ truy vấn trực quan bằng cách sử dụng các phương thức như where(), get(), find()
Trang 9tự động tạo tất cả các phương thức CRUD chỉ với một dòng khai báo route, ví dụ:Route::resource('users', UserController::class).
View: Laravel sử dụng Blade template engine, một trong những hệ thống render view
nhanh và dễ dàng Blade cung cấp một hệ thống template mạnh mẽ và dễ sử dụng Hỗ trợviệc thừa kế template (layout) giúp giảm thiểu việc lặp lại mã HTML Blade hỗ trợ cấutrúc điều kiện (@if, @elseif, @else), vòng lặp (@foreach, @for, @while), và các lệnhkhác một cách đơn giản mà không cần sử dụng các cú pháp PHP phức tạp Hỗ trợ dễdàng tạo component tái sử dụng và include các phần của view
Quy trình:
Người dùng gửi một yêu cầu (request) từ trình duyệt
Controller nhận yêu cầu và gọi Model để lấy dữ liệu.
Sau khi dữ liệu được xử lý trong Model, Controller chọn View thích hợp để hiển thị kết
quả
View gửi phản hồi (response) về cho người dùng.
Ưu điểm:
Separation of concerns (Tách biệt trách nhiệm): Dữ liệu, logic và giao diện được tách
biệt rõ ràng, giúp code dễ bảo trì và phát triển
Dễ mở rộng: Có thể thay đổi một phần (ví dụ: View) mà không ảnh hưởng đến các phần
khác
Nhược điểm:
Khi ứng dụng lớn, việc quản lý nhiều file Controller, Model và View có thể phức tạp
Cần phải hiểu rõ cấu trúc MVC để phát triển hiệu quả
9
Trang 102.2.2 Singleton Pattern
Singleton Pattern đảm bảo rằng một lớp cụ thể chỉ có một đối tượng (instance) duy
nhất trong suốt vòng đời của ứng dụng Đây là một mẫu thiết kế mà bạn sử dụng khi muốn tránh việc tạo nhiều bản sao của cùng một đối tượng để tiết kiệm tài nguyên hoặc đảm bảo tính nhất quán Nhưng không phải mỗi đối tượng trong Laravel đều cần phải là Singleton Bạn chỉ nên sử dụng Singleton Pattern cho các đối tượng mà bạn muốn giới hạn việc khởi tạo chỉ một lần (ví dụ: kết nối cơ sở dữ liệu, cấu hình hệ thống, hoặc bất kỳ thứ gì chỉ cần khởi tạo một lần để tránh lãng phí tài nguyên) Các lớp khác vẫn có thể được khởi tạo nhiều lần theo nhu cầu Laravel sử dụng Service Container để quản lý các đối tượng và service của bạn, nhưng không phải tất cả đều cần Singleton
Quy trình:
Khi lớp Singleton được gọi, nó kiểm tra xem phiên bản của lớp đó đã tồn tại chưa
Nếu chưa, nó tạo ra một phiên bản mới
Nếu đã tồn tại, nó trả về phiên bản hiện tại
Trang 11Nhược điểm:
Khó kiểm tra (unit testing): Singleton làm cho việc kiểm thử trở nên khó khăn hơn vì
mọi yêu cầu đều chia sẻ cùng một phiên bản
Tăng độ phức tạp: Việc theo dõi và quản lý trạng thái trong Singleton có thể gây khó
khăn trong các ứng dụng lớn
2.2.3 Repository Pattern
Repository Pattern là một mẫu thiết kế trong lập trình phần mềm nhằm mục đích tách biệt và trừu tượng hóa logic truy cập dữ liệu khỏi ứng dụng Mẫu này thường được sử dụng trong các ứng dụng lớn để làm cho việc quản lý dữ liệu trở nên dễ dàng hơn và cải thiện khả năng bảo trì
mã nguồn
Quy trình:
Controller yêu cầu dữ liệu từ Repository thay vì trực tiếp từ Model.
Repository giao tiếp với Model hoặc các nguồn dữ liệu khác và trả dữ liệu về cho
Controller
Ưu điểm:
Dễ mở rộng và bảo trì: Có thể thay đổi cách dữ liệu được lưu trữ mà không cần thay đổi
code logic nghiệp vụ
Tăng tính tái sử dụng: Repository có thể được sử dụng trong nhiều Controller khác
Trang 122.2.4 Dependency Injection Pattern
Dependency là hành vi class A sử dụng các thuộc tính và phương thức của class B ( class A dependency class B ) Ví dụ như bạn có 1 class Student và mỗi Student tham gia và một group nếu làm như bình thường thì sẽ như này
Bài toán đặt ra là nếu có thêm thuộc tính mới trong group và các đối tượng khác tham gia Group thì ta sẽ phải thêm thuộc tính mới vào cho từng hàm tạo của từng đối tượng Dependency Injection là 1 design pattern giúp giải quyết vấn đề này Khi thay đổi trong Class, ta chỉ cần thay đổi 1 chỗ Ý tưởng của nó là tiêm các class dependency từ bên ngoài vào Nó truyền vào mà không phải khởi tạo bên trong các method, constructor Sẽ tránh bị phụ thuộc cứng vào 1 class dependency :
12
Trang 13Ý tưởng của nó là tiêm các class dependency từ bên ngoài vào Nó truyền vào mà không phải khởi tạo bên trong các method, constructor Sẽ tránh bị phụ thuộc cứng vào 1 class dependency :
13
Trang 14Dependency class sẽ gây khó khăn cho người mới lập trình nhưng không cần lo lắng khi Inversion of Control ( Service Container ) sẽ quản lý các phụ thuộc cho bạn Hiểu đơn giản là tất cả các dependency của chương trình sẽ được tống vào 1 cái kho gọi là IoC container Bất kỳ khi nào cần dependency class thì chỉ cần lấy từ trong kho đó, kho đó sẽ tự động khởi tạo class dependency Nếu dependency class của bạn cần những dependency khác, nó sẽ có khả năng tự động inject hết cho bạn Với điều kiện các tham số constructor đều phải có type-hint, vì có type-hint nên container mới hiểu được là phải lấy dependency đó
từ đâu Đây là lí do IoC ưu việt hơn Dependency Injection Các framework Spring , Laravel, sử dụng IoC Container Trong Laravel, service Container chính là IoC Container, và nó cũng chính là instance application Ta cũng có thể nói, bản chất instance application laravel của chúng ta là 1 service container khổng lồ.
Đầu tiên các class dependency sẽ được đăng kí trong các Service Provider qua method register Các class dependency sẽ được đưa vào Service Container nhưng các class này chưa được khởi tạo mà chỉ được đăng kí Sau khi đăng kí, bất kỳ khi nào cần dependency class, Service Container sẽ tự động khởi tạo cho chúng ta Kể cả khi các dependency class cũng dependency các class khác thì Service Container cũng sẽ inject hết dựa vào type-hint Các Facades aliases đều chứa method getFacadeAccessor() Method này trả về 1 chuỗi là tên các class dependecy sẽ được đăng kí vào container Đó là lí do vì sao gọi
Facades, Laravel tự động khởi tạo đối tượng
Tách biệt và quản lý phụ thuộc: Giúp dễ dàng quản lý các class và phụ thuộc của
chúng, đồng thời giữ cho code sạch và có cấu trúc
Dễ kiểm thử: Khi bạn sử dụng DI, bạn có thể dễ dàng tạo các đối tượng giả (mock) cho
việc kiểm thử, mà không cần phụ thuộc vào các đối tượng thật
14
Trang 15 Giảm sự phụ thuộc cứng: Thay vì hardcode các phụ thuộc trong class, bạn có thể thay
đổi chúng mà không cần chỉnh sửa code chính
Tăng tính tái sử dụng: Các class có thể được tái sử dụng ở nhiều nơi mà không cần lo
lắng về cách chúng được tạo ra
Nhược điểm:
Phức tạp hơn cho người mới: DI có thể gây khó khăn cho những lập trình viên chưa
quen, vì nó yêu cầu hiểu rõ cách hoạt động của Service Container
Quá nhiều phụ thuộc: Nếu có quá nhiều phụ thuộc được inject vào một class, nó có thể
trở nên phức tạp và khó quản lý
2.2.5 Observer Pattern
Observer Pattern là một mẫu thiết kế hành vi (behavioral design pattern) cho phép một đối
tượng (được gọi là subject) thông báo cho nhiều đối tượng khác (gọi là observers) về sự thay
đổi trạng thái của nó Mẫu này rất hữu ích trong các ứng dụng mà nhiều phần cần được đồng bộ hóa với nhau khi một phần thay đổi Một trong những ứng dụng phổ biến của Observer Pattern làtrong các hệ thống xử lý sự kiện, như trong Laravel
15