Tập 4: Thư mục "app" trong Laravel (App directory Laravel)
https://viblo.asia/p/tap-4-thu-muc-app-trong-laravel-app-directory-laravel-V3m5WXN7KO7
Last updated
https://viblo.asia/p/tap-4-thu-muc-app-trong-laravel-app-directory-laravel-V3m5WXN7KO7
Last updated
Ở tập trước chúng ta đã cùng nhau tìm hiểu cấu trúc thư mục của Laravel framework, hôm nay mình sẽ nói sâu một thư mục mà chúng ta cần phải hiểu rõ vì nó đóng vai trò quan trọng của ứng dụng, đó là thư mục app
.
Khi quan sát bên trong thư mục app
, ta thấy nó gồm có các thành phần như Console
, Exceptions
, Http
, Providers
... Liệu đó có phải là tất cả của nó?
Thư mục console
là nơi chứa các lệnh Artisan do chính bạn tạo ra trong ứng dụng với lệnh make:command
trong commander. Nơi đây còn chứa file Kernel.php
, nó sẽ thực hiện việc đăng ký các lệnh Artisan của riêng bạn, ngoài ra có thể đặt lịch trình tác vụ cho các lệnh Artisan ấy.
Mình sẽ thử khởi tạo một câu lệnh Artisan, các bạn chạy lệnh sau:
php artisan make:command test
Kiểm tra source project, ngay tại thư mục app/Console
ta có thể thấy một thư mục Commands
kèm theo file tên test.php
đã được tạo ra. Có thể thấy sau này khi tạo thêm một command nào khác thì nó sẽ được quản lý ở đây.
Như tên gọi của nó, thư mục Exceptions
này sẽ chứa các xử lý ngoại lệ (exception handler) của ứng dụng. Nếu bạn muốn tùy chỉnh cách mà những exception này ghi lại hoặc hiển thị, thì hãy sửa đổi file Handler.php
trong thư mục này. Nhưng mình nghĩ việc này cũng không cần thiết cho lắm vì Laravel đã làm quá tốt rồi.
Thư mục này sẽ chứa các controller, middleware và form request (sẽ tìm hiểu ở các tập sau). File Kernel.php
dùng để định nghĩa cho các middleware. Nói chung thư mục này sẽ chứa các thành phần sẽ xử lý các yêu cầu đến ứng dụng, chẳng hạn các request từ phía client.
Thư mục này chứa tất cả các nhà cung cấp dịch vụ (service provider) cho ứng dụng của bạn. Các service provider này sẽ khởi động ứng dụng bằng cách ràng buộc các service trong vùng chứa của nó, đăng ký các sự kiện hoặc thực thi các mã lệnh để chuẩn bị đáp ứng cho các request đến ứng dụng. Nghe có vẻ hơi khó hiểu vì đây là một trong số các khái niệm kiến trúc (Architecture Concepts) của Laravel nên khá trừu tượng. Mình sẽ nói rõ vấn đề này ở những tập sau.
Thư mục Broadcasting
này là nơi chứa tất cả các lớp broadcasting channel. Đây cũng là một thuật ngữ khá mới mẻ khi mới học Laravel nên sẽ có một tập chi tiết về vấn đề này. Bây giờ bạn chỉ hiểu cho mình là nó liên quan đến file routes/channels.php
mà mình đã nói ở tập trước, sử dụng đến nó khi app của bạn có real-time... Mặc định thì thư mục Broadcasting
này không được khởi tạo trước, nó sẽ xuất hiện khi bạn tạo một class broadcasting channel đầu tiên với lệnh:
php artisan make:channel TestChannel
Quan sát source code ta có thể thấy, thư mục Broadcasting
đã được tạo ra cùng với class mình vừa khởi tạo bằng lệnh ban nãy.
Kể từ phần này trở đi, các thư mục mặc định không xuất hiện trong thư mục app
mà chỉ được khởi tạo bằng lệnh như Broadcasting
.
Để khởi tạo thư mục cũng như một lớp sự kiện (event class), bạn phải thực hiện chuỗi lệnh sau:
php artisan event:generate
Tiếp đó:
php artisan make:event TestEvent
Hiểu đơn giản, ví dụ bạn click vào nút đăng nhâp của một trang web, đó là sự kiện đăng nhập, hoặc thêm sản phẩm vào giỏ hàng, đó là sự kiện thêm sản phẩm vào giỏ hàng... Laravel cung cấp cho ta event để nâng cao tính linh hoạt, tách rời và không phụ thuộc, giúp dễ quản lý và mở rộng hơn.
Thư mục Listeners
này dùng để chứa các lớp xử lý các event ở trên, gọi là event listener. Các event listener này sẽ hoạt động khi nhận được một event khởi tạo và thực thi nhiệm vụ được khai báo trước. Chẳng hạn như sự kiện UserRegisterd
có thể xử lý bởi listener SendWelcomeEMail
. Tức là khi listener SendWelcomeEmail
lắng nghe được event UserRegistered
khởi tạo thì nó sẽ thực thi gửi một email welcome rồi sau đó trả về cho người dùng biết là tài khoản đã được đăng ký.
Để khởi tạo thư mục Listener
cũng như file listener, các bạn thực hiện chuỗi lệnh sau:
php artisan event:generate
(Nếu đã thực hiện ở event thì có thể bỏ qua lệnh này)
Tiếp đó:
php artisan make:listener TestListener
Hiểu đơn giản thư mục này chứa các class để sắp xếp các công việc vào hàng đợi, hoặc có thể chạy đồng bộ.
Để tạo một Job
bạn chỉ cần thực thi lệnh:
php artisan make:job TestJob
Nghe tên cũng đủ hiểu chức năng của thư mục Mail
này. Thư mục Mail
chứa tất cả các lớp đại diện cho từng email. Các mail object này gói gọn các xử lý của việc xây dựng email trong một class đơn giản, có thể gửi bằng Mail::send
.
Để tạo một Mail
, thực thi câu lệnh sau:
php artisan make:mail TestMail
Dễ hiểu là thư mục này chứa các class cho việc thông báo các hoạt động của ứng dụng, chẳng hạn như thông báo đơn giản về các event đã xảy ra trong ứng dụng. Tính năng này thông qua nhiều driver khác nhau như SMS, email, Slack hoặc lưu trữ trong database.
Khởi tạo Notifications
với một câu lệnh:
php artisan make:notification TestNotification
Policies
cũng là một thuật ngữ khá mới mẻ đối với các bạn mới tìm hiểu về framework này, nói theo Laravel Docs thì đây chứa các class dùng để xác định xem client có thể thực hiện một hành động nào đó đối với tài nguyên hay không.
Chẳng hạn như bạn muốn chỉnh sửa bài viết nào đó thì Policies
này sẽ kiểm tra xem bạn có phải là tác giả của bài viết đó hoặc là admin hay không? Nếu phải thì mới cho phép chỉnh sửa, còn không thì báo lỗi không đủ quyền.
Để tạo một Policies
, bạn cũng thực thi lệnh Artisan sau:
php artisan make:policy TestPolicy
Nói dễ hiểu, Rules
này có chức năng validate data từ request như các bạn vẫn hay làm khi code PHP thuần vậy. Nhưng ở Laravel, nó được tách rời riêng biệt để dễ dàng quản lý.
Dùng lệnh Artisan này để tạo một Rules
:
php artisan make:rule TestRule
Thế là chúng ta đã tìm hiểu bao quát hết cấu trúc trong app
rồi đấy, tới đây các bạn liệu có cảm giác thiếu thiếu hay đang thắc mắc không? Vâng, đó chính là "Model". Đây là một framework chuẩn mô hình MVC thì vậy Model
nằm ở đâu, không nằm trong thư mục app
à? Không, không phải vậy. Các bạn có để ý trong app
vẫn còn một file User.php
riêng lẻ không. Đó chính là một Model
đấy.
Theo Laravel Docs, vì khái niệm Model
còn quá mơ hồ, nó có nghĩa khác nhau với những cách suy nghĩ khác nhau. Có người cho rằng Model
trong ứng dụng là tất cả các bussiness logic, còn có người cho rằng Model
chính là các lớp tương tác quan hệ trong database.
Chính vì đều đó, Laravel không tạo thư mục Model
trong app
, thay vào để các coder có thể đặt theo cách mà họ muốn.
Cảm ơn các bạn đã quan tâm theo dõi. Cùng đồng hành với mình qua những tập tiếp theo tại series "Hành trình chinh phục Laravel Framework" nhé! Chúc may mắn và hẹn gặp lại.