Cấu trúc thư mục mặc định của Laravel nhằm cung cấp một khởi đầu tốt cho tất cả các application lớn và nhỏ. Nhưng bạn có thể tự tổ chức theo cách mà bạn muốn. Laravel sẽ gần như không áp đặt một hạn chế nào về mặt vị trí cho bất cứ class nào, miễn là Composer có thể load class đó.
Thư mục app là nơi chứa phần core code của application. Chúng tôi sẽ sớm chia thư mục này ra, cho rõ ràng hơn, nhưng hầu như tất cả các class sẽ nằm trong thư mục này.
Thư mục bootstrap sẽ chứa file app.php dành cho khởi động framework. Thư mục này cũng chứa thư mục cache dành cho framework, tạo ra các file để tối ưu tốc độ cho route và service.
Thư mục config mang ý nghĩa rất dễ hiểu, nó dùng để chứa tất cả các file config cho application của bạn. Nó là một ý tưởng tốt để đọc tất cả các file và làm quen với các biến có sẵn trong đó.
Thư mục database chứa các file migration cho database, các file factories để tạo fake data cho model, và các file seed. Nếu bạn muốn, bạn cũng có thể dùng thư mục này để chứa các file SQLite database.
Thư mục public chứa file index.php là điểm khởi đầu vào cho mọi request gửi tới application của bạn và các file config autoloading. Thư mục này cũng chứa các file images, JavaScript, và CSS.
Thư mục resources chứa file view cũng như file raw, và các file chưa được biên dịch như là CSS hoặc JavaScript.
Thư mục routes chứa tất cả các file định nghĩa route cho application của bạn. Mặc đinh, sẽ có hai file sau đây: web.php và console.php.
File web.php sẽ chứa các route mà Laravel sẽ đặt trong nhóm middleware web, nhóm này cung cấp trạng thái session, bảo vệ CSRF và mã hóa cookie. Nếu ứng dụng của bạn không cung cấp API RESTful dạng token, thì hầu hết các route của bạn có thể sẽ được định nghĩa trong file web.php.
File console.php sẽ là nơi bạn có thể định nghĩa tất cả các closure dựa trên các lệnh chạy ở console. Mỗi closure sẽ tương ứng với một câu lệnh, nên bạn sẽ dễ dàng tiếp cận được với các phương thức input và output của mỗi câu lệnh. File này sẽ không định nghĩa các Http route của application, mà nó chỉ định nghĩa các console route tới application của bạn. Bạn cũng có thể schedule các task trong file console.php.
Bạn có thể tùy chọn cài đặt thêm các file route cho API (api.php) và các channel broadcasting (channels.php), thông qua các lệnh Artisan install:api và install:broadcasting.
File api.php sẽ chứa các route được thiết kế để không dùng trạng thái session, vì vậy các request vào ứng dụng thông qua các route này được sẽ xác thực thông qua token và sẽ không có quyền truy cập vào trạng thái session.
File channels.php sẽ là nơi mà bạn có thể đăng ký các tất cả các event broadcasting channel mà application bạn hỗ trợ.
Thư mục storage sẽ chứa những file log, Blade đã được biên dịch, file session, file cache, và các file khác được tạo ra bởi framework. Thư mục này sẽ chứa các thư mục con là: app, framework, và logs. Thư mục app có thể dùng để lưu tất cả các file được tạo ra bởi application của bạn. Thư mục framework sẽ dùng để lưu các file được tạo ra bởi framework và cache, Cuối cùng là thư mục logs, được dùng để chứa các file log của application.
Thư mục storage/app/public có thể được dùng để lưu trữ các file mà user tạo như là: avatars, những loại mà được phép public. Bạn cũng nên tạo một link ảo public/storage để trỏ vào thư mục này. Bạn có thể tạo link ảo đó bằng câu lệnh Artisan sau: php artisan storage:link.
Thư mục tests sẽ chứa các file test tự động. Mặc định, một ví dụ Pest hoặc PHPUnit unit test và một bài test chức năng đã được cung cấp sẵn trong project. Mỗi class test nên lưu lại với hậu tố là Test. Bạn có thể chạy test của bạn bằng câu lệnh /vendor/bin/pest hoặc /vendor/bin/phpunit. Hoặc, nếu bạn muốn hiển thị chi tiết hơn và đẹp mắt hơn về kết quả test của bạn, bạn có thể chạy test của bạn bằng lệnh Artisan php artisan test.
Thư mục vendor chứa những library mà được quản lý bởi Composer.
Phần lớn application của bạn sẽ được lưu trong thư mục app. Mặc định, thư mục này sẽ được lưu dưới tên là App và được autoloaded bởi Composer dùng chuẩn PSR-4 autoloading standard.
Mặc định, thư mục app sẽ chứa các thư mục Http, Models, và Providers. Tuy nhiên, theo thời gian, nhiều thư mục khác sẽ được tạo ra bên trong thư mục app khi bạn sử dụng các lệnh Artisan make để tạo các class. Ví dụ, thư mục app/Console sẽ không tồn tại cho đến khi bạn chạy lệnh Artisan make:command để tạo ra một class command.
Cả hai thư mục Console và Http đều được giải thích chi tiết hơn trong các phần tương ứng bên dưới, nhưng hãy coi thư mục Console và Http như là nơi cung cấp một API để tương tác với phần core ứng dụng của bạn. Giao thức HTTP và CLI đều là các cơ chế để tương tác với ứng dụng của bạn, nhưng chúng không thực sự chứa logic của ứng dụng. Nói cách khác, chúng là hai cách để ra lệnh cho ứng dụng của bạn. Thư mục Console sẽ chứa tất cả các lệnh Artisan của bạn, trong khi thư mục Http sẽ chứa các controller, middleware và request của bạn.
[!NOTE] Nhiều class trong thư mục
appcó thể được tạo ra thông qua lệnh Artisan. Để có thể xem các lệnh đó, bạn có chạy lệnhphp artisan list maketrên terminal của bạn.
BroadcastingThư mục Broadcasting chứa tất cả các class broadcast channel cho ứng dụng của bạn. Các class này được tạo ra bằng lệnh make:channel. Mặc định, thư mục này không tồn tại, nhưng nó sẽ được tạo ra cho bạn khi bạn tạo channel đầu tiên. Để tìm hiểu thêm về các channel, hãy xem tài liệu về event broadcasting.
Thư mục Console sẽ chứa tất cả các câu lệnh Artisan của bạn. Các câu lệnh mới có thể được tạo ra bằng câu lệnh make:command.
Mặc định, thư mục này sẽ không tồn tại, nhưng nó sẽ được tạo khi bạn chạy lệnh Artisan event:generate và make:event. Thư mục Events sẽ chứa các event classes. Events có thể được dùng thông báo cho các phần khác trong application của bạn rằng một hành động nào đó đã xảy ra, vì vậy nó rất linh hoạt và tách biệt.
Thư mục Exceptions sẽ chứa tất cả các exception tùy biến cho ứng dụng của bạn. Các exception này có thể được tạo ra bằng lệnh make:exception.
Thư mục Http chứa các file controllers, middleware và form request. Hầu như tất cả các logic dùng để xử lý các request tới application của bạn đều được lưu tại đây trong thư mục này.
Mặc định, thư mục này không tồn tại, nhưng nó sẽ được tạo ra cho bạn, nếu bạn chạy lệnh Artisan make:job. Thư mục Jobs sẽ chứa các queueable jobs cho application của bạn. Jobs có thể được đưa vào hàng đợi hoặc chạy đồng bộ cùng với request hiện tại. Jobs mà được chạy đồng bộ cùng với request hiện tại đôi khi cũng có thể được gọi là "commands" vì chúng được triển khai theo command pattern.
Mặc định, thư mục này không tồn tại, nhưng nó sẽ được tạo ra cho bạn, nếu bạn chạy lệnh Artisan event:generate hoặc make:listener. Thư mục Listeners sẽ chứa các class xử lý events cho bạn. Event listeners nhận vào một event instance và thực hiện logic phản hồi tướng ứng với sự kiện đã được kích hoạt. Ví dụ, một event UserRegistered có thể được xủ lý bởi một listener SendWelcomeEmail.
Mặc định, thư mục này không tồn tại, nhưng nó sẽ được tạo ra cho bạn, nếu bạn chạy lệnh Artisan make:mail. Thư mục Mail chứa tất cả các class cho việc tạo email được gửi đi bởi application của bạn. Đối tượng Mail cho phép bạn gói gọn tất cả logic của việc xây dựng email vào trong một class đơn giản, có thể được gửi bằng phương thức Mail::send.
Thư mục Models sẽ chứa tất cả các class model Eloquent của bạn. Eloquent ORM đi kèm với Laravel đã cung cấp một implement ActiveRecord đơn giản, đẹp mắt để làm việc với cơ sở dữ liệu của bạn. Mỗi bảng cơ sở dữ liệu có một "Model" tương ứng để sử dụng để tương tác với bảng đó. Model cho phép bạn truy vấn vào dữ liệu trong bảng của bạn, cũng như chèn thêm các bản ghi mới vào bảng.
Mặc định, thư mục này không tồn tại, nhưng nó sẽ được tạo ra cho bạn, nếu bạn chạy lệnh Artisan make:notification. Thư mục Notifications chứa tất cả các thông báo "transactional" mà được gửi bởi application của bạn, như là một thông báo về một sự kiện xảy ra trong application của bạn. Tính năng thông báo của Laravel sẽ gửi thông báo đi qua nhiều driver khác nhau như email, Slack, SMS hoặc được lưu trữ trong cơ sở dữ liệu.
Mặc định, thư mục này không tồn tại, nhưng nó sẽ được tạo ra cho bạn, nếu bạn chạy lệnh Artisan make:policy. Thư mục Policies chứa các class về quyền trong application của bạn. Policies sẽ dùng để xác định xem một user có thể thực hiện một hành động nhất định đối với một resource hay không. Để có thêm thông tin, hãy đọc thêm ở authorization documentation.
Thư mục Providers chứa tất cả các service providers cho application của bạn. Service providers sẽ khởi động application của bạn bằng binding services trong service container và đăng ký các event hoặc thực hiện bất kỳ các task nào khác để chuẩn bị application xử lý những request đến.
Trong một application mới, thư mục này sẽ chứa sẵn một AppServiceProvider. Bạn có thể tự do thêm các provider mà bạn muốn vào thư mục này khi cần thiết.
Mặc định, thư mục này không tồn tại, nhưng nó sẽ được tạo ra cho bạn, nếu bạn chạy lệnh Artisan make:rule. Thư mục Rules chứa các tùy biến của các đối tượng validation rule. Rules được sử dụng để đóng gói các logic kiểm tra phức tạp trong một đối tượng đơn giản. Để có thêm thông tin, hãy đọc thêm ở validation documentation.
entry