Laravel: Cấu trúc thư mục – directory structure

Xin chào các bạn, tiếp tục với loạt bài viết về Laravel 8x thì trong bài viết này mình sẽ cùng các bạn tìm hiểu về cấu trúc thư mục (directory structure) trong Laravel. Nếu bạn chưa cài đặt laravel 8x thì xem bài viết trước nhé.

Giới thiệu

Cấu trúc mặc định của ứng dụng Laravel được thiết kế để có thể cung cấp điểm khởi đầu tốt cho cả các ứng dụng lớn và nhỏ. Tất nhiên là bạn có thể tự do sắp xếp ứng dụng của bạn theo cách mà bạn muốn. Laravel hầu như không có hạn chế việc class nào đó phải nằm ở đâu – miễn là Composer có thể autoload class đó.

Thư mục Root

laravel-directory-structure
Cấu trúc thư mục của một project laravel

Thư mục app

Là thư mục chứa code core ứng dụng của bạn. Hầu hết tất cả các class của ứng dụng nằm trong folder này. Chúng ta sẽ tìm hiểu thư mục này sau.

Thư mục bootstrap

Chứa file app.php dùng để tự khởi động framework và nó cũng chứa thư mục cache là nơi chứa những files framework tạo ra để tối ưu hoá hiệu suất của ứng dụng.

Thư mục config

Giống như tên của nó, folder này chứa tất cả các files cấu hình của ứng dụng.

Thư mục database

Chứa các file migration, model factories và seeds của cơ sở dữ liệu. Nếu bạn muốn, bạn có thể sử dụng thư mục này để chứa cơ sở dữ liệu SQLite.

Thư mục public

Chứa file index.php là điểm nhận tất cả các request của ứng dụng và cấu hình auto load. Bên cạnh đó thư mục public còn chứa các tài nguyên khác như hình ảnh, javascript, css.

Thư mục resources

Chứa các view, css, javascript dưới dạng chưa được biên dịch và các file ngôn ngữ đã được địa phương hoá.

Thư mục routes

Là thư mục chứa tất cả các route được định nghĩa trong ứng dụng. Một số files route mặc định của Laravel là web.php, api.php, console.phpchannels.php. Bạn có thể sử dụng câu lệnh php artisan route:list để xem danh sách các route đã được định nghĩa trong ứng dụng.

laravel-directory-structure-route
Xem danh sách các route đã được định nghĩa

Thư mục storage

Là thư mục chứa logs, chứa mã biên dịch từ các blade template, chứa caches, sessions… chứa các file được tạo từ framework.

Thư mục tests

Chứa các file kiểm thử. Xem PHPUnit như một ví dụ mở rộng để tìm hiểu.

Thư mục vendor

Chứa các file phụ thuộc cho Composer

Thư mục App

Phần lớn code bạn viết nằm trong thư mục app. Theo mặc định thì thư mục trong folder app có namespaceApp và được load một cách tự động bởi Composer, sử dụng PSR-4 autoloading standard.

Thư mục app chức nhiều thư mục như ConsoleHttp, và Providers bên trong. Hãy nghĩ về Console và Http như là các thư mục cung cấp API cho phần core của ứng dụng. Giao thức HTTPCLI là 2 cơ chế để tương tác với ứng dụng của bạn, nhưng không thực sự chứa logic của ứng dụng. Hay nói một cách khác, đơn giản là có 2 cách để thực thi lệnh đến ứng dụng của bạn. Thư mục Console chứa các câu lệnh Artisan, trong khi Http là thư mục chứa các controllers, bộ lọc request (middleware) và các yêu cầu (request) gửi lên ứng dụng.
Ngoài ra còn một số thư mục khác được tạo bên trong folder app thông qua câu lệnh artisan. Bạn có thể xem xét các câu lệnh có sẵn thông qua command sau php artisan list make dưới đây là hình ảnh liệt kê các command  có sẵn.

laravel-directory-structure-command-avaiable
Hình ảnh kết quả của câu lệnh khi được thực thi

Thư mục Broadcasting

Mặc định sẽ không tồn tại, nó sẽ được tạo ra khi chạy câu lệnh Artisan. Thư mục này chứa tất cả các classes broadcast channel của ứng dụng.

Thư mục Console

Chứa tất cả các câu lệnh Artisan tùy chỉnh trong ứng dụng. Những câu lệnh này được tạo ra khi chạy câu lệnh php artisan make:command, thường được đăng ký và lên lịch để thực thi.

Thư mục Events

Mặc định sẽ không tồn tại, nó sẽ được tạo ra khi chạy câu lệnh Artisan. Là nơi chứa các lớp sự kiện. Sự kiện có thể dùng để thông báo các phần khác của ứng dụng rằng một hành động nào đó đã xảy ra, cung cấp khả năng xử lý một cách linh hoạt và riêng biệt.

Thư mục Exceptions

Chứa các bộ xử lý ngoại lệ và cũng là nơi tốt để gán các ngoại lệ được bắn ra bởi ứng dụng của bạn.

Thư mục Http

Là nơi chứa controllers, middleware và form request. Hầu như tất cả các logic xử lý của ứng dụng sẽ được đặt ở đây.

Thư mục Jobs

Mặc định sẽ không tồn tại, nó sẽ được tạo ra khi chạy câu lệnh Artisan. Là nơi lưu trữ các công việc có thể cho vào hàng (queue) của ứng dụng. Các công việc này có thể xếp hàng, đợi ứng dụng xử lý, hoặc chạy đồng bộ trong vòng đời của yêu cầu (request) hiện tại.

Thư mục Listeners

Mặc định sẽ không tồn tại, nó sẽ được tạo ra khi chạy câu lệnh Artisan. Chứa các lớp xử lý cho các sự kiện của bạn. Các bộ xử lý sẽ nhận sự kiện và thực thi logic khi hồi đáp cho sự kiện đã được bắn ra. Ví dụ, một sự kiện UserRegistered có thể được xử lý bởi một bộ lắng nghe SendWelcomeEmail chẳng hạn.

Thư mục Mail

Mặc định sẽ không tồn tại, nó sẽ được tạo ra khi chạy câu lệnh Artisan. Như tên của nó thì folder này sẽ chứa các class dùng cho việc gửi mail trong ứng dụng

Thư mục Models

Chứa tất cả các class Eloquent dùng để tương tác với cơ sở dữ liệu chẳng hạn như thêm một dòng mới vào bảng, lấy tất cả các bảng ghi trong bảng…

Thư mục Notifications

Mặc định sẽ không tồn tại, nó sẽ được tạo ra khi chạy câu lệnh Artisan. Như tên của nó thì folder này sẽ chứa các class dùng cho việc thông báo, chẳng hạn như thông báo cho ban quản lí khi có một khách hàng vừa đặt hàng, gửi thông báo qua sms để xác thực khi đăng nhập…

Thư mục Policies

Mặc định sẽ không tồn tại, nó sẽ được tạo ra khi chạy câu lệnh Artisan. Chứa các lớp quy ước cấp quyền cho ứng dụng của bạn. Các quy ước được dùng để quyết định user có thể thực hiện hành động đối với mội tài nguyên nào đó. Xem thêm tại tài liệu cấp quyền.

Thư mục Providers

Chứa tất cả các service của ứng dụng, khởi động ứng dụng bằng cách binding services với service container, đăng ký event, thực hiện các tác vụ để chuẩn bị cho request sắp tới.

Thư mục Rules

Mặc định sẽ không tồn tại, nó sẽ được tạo ra khi chạy câu lệnh Artisan. Chứa các tùy chỉnh validation của ứng dụng.

Tổng kết

Qua bài viết này thì bạn đã biết cấu trúc thư mục trong Laravel như thế nào, biết được ý nghĩa và chức năng của mỗi folder ra sao. Điều đó giúp bạn có cái nhìn tổng quan hơn về cách cấu trúc code của Laravel. Trong bài học tiếp theo chúng ta sẽ tìm hiểu về vòng đời cùa một request trong Laravel như thế nào, mời các bạn đón đọc.

Nguồn tài liệu tham khảo:
https://laravel.com/docs/8.x/structure

Hi vọng sẽ giúp được bạn. Thanks