
# 目录结构

- [简介](#introduction)
- [根目录](#the-root-directory)
    - [`app` 目录](#the-root-app-directory)
    - [`bootstrap` 目录](#the-bootstrap-directory)
    - [`config` 目录](#the-config-directory)
    - [`database` 目录](#the-database-directory)
    - [`public` 目录](#the-public-directory)
    - [`resources` 目录](#the-resources-directory)
    - [`routes` 目录](#the-routes-directory)
    - [`storage` 目录](#the-storage-directory)
    - [`tests` 目录](#the-tests-directory)
    - [`vendor` 目录](#the-vendor-directory)
- [App 目录](#the-app-directory)
    - [`Broadcasting` 目录](#the-broadcasting-directory)
    - [`Console` 目录](#the-console-directory)
    - [`Events` 目录](#the-events-directory)
    - [`Exceptions` 目录](#the-exceptions-directory)
    - [`Http` 目录](#the-http-directory)
    - [`Jobs` 目录](#the-jobs-directory)
    - [`Listeners` 目录](#the-listeners-directory)
    - [`Mail` 目录](#the-mail-directory)
    - [`Models` 目录](#the-models-directory)
    - [`Notifications` 目录](#the-notifications-directory)
    - [`Policies` 目录](#the-policies-directory)
    - [`Providers` 目录](#the-providers-directory)
    - [`Rules` 目录](#the-rules-directory)

<a name="introduction"></a>
## 简介

Laravel 默认的应用程序结构旨在为各类规模的项目提供理想起点，同时保持高度灵活性。你可以自由地按照自己的喜好组织应用程序。Laravel 几乎不对任何给定类的位置施加限制 - 只要 Composer 能够自动加载该类。


<a name="the-root-directory"></a>
## 根目录

<a name="the-root-app-directory"></a>

### App 目录

`app` 目录包含应用程序的核心代码。我们很快将详细探讨这个目录；但是，项目中绝大部分类文件默认都存放于此目录。


<a name="the-bootstrap-directory"></a>

### Bootstrap 目录

`bootstrap` 目录包含 `app.php` 文件，该文件负责启动框架。此目录还包含一个 `cache` 目录，其中包含用于性能优化的框架生成的文件，例如路由和服务缓存文件。


<a name="the-config-directory"></a>
### Config 目录

顾名思义，`config` 目录包含了应用程序的所有配置文件。阅读所有这些文件并熟悉可用的选项是个好主意。

<a name="the-database-directory"></a>
### Database 目录
`database` 目录包含数据库迁移、模型工厂和数据填充文件。如果你愿意，你还可以使用此目录来存放 SQLite 数据库。

<a name="the-public-directory"></a>
### Public 目录

 `public` 目录包含 `index.php` 文件，这是所有进入应用程序请求的入口点，并配置自动加载。此目录还存放你的资源文件，如图片、JavaScript 和 CSS。

<a name="the-resources-directory"></a>
### Resources 目录

`resources` 目录包含您你的 [视图](/docs/laravel/13.x/views) 以及未编译的原始资源，如 CSS 或 JavaScript。

<a name="the-routes-directory"></a>
### Routes 目录

`routes` 目录包含应用程序的所有路由定义。默认情况下，Laravel 内置了两个路由文件：`web.php` 和 `console.php`。

`web.php` 文件包含 Laravel 放在 `web` 中间件组中的路由，该组提供会话状态、CSRF 保护以及 Cookie 加密功能。如果你的应用程序不提供无状态的 RESTful API，那么大多数路由都应在 `web.php` 文件中定义。

`console.php` 文件用于定义所有基于闭包的控制台命令。每个闭包都绑定到一个命令实例，从而提供一种简洁的方式来与各命令的 IO 方法进行交互。尽管该文件不定义 HTTP 路由，但它定义了基于控制台的应用程序入口（即路由）。你也可以在 `console.php` 文件中[调度](/docs/laravel/13.x/scheduling)任务。


你也可以选择通过 `install:api` 和 `install:broadcasting` Artisan 命令为 API 路由 (`api.php`) 和广播频道 (`channels.php`) 安装额外的路由文件。

`api.php` 文件包含旨在无状态的路由，因此通过这些路由进入应用程序的请求意图 [通过令牌](/docs/laravel/13.x/sanctum) 进行认证，并且无法访问会话状态。

`channels.php` 文件是你可以注册应用程序支持的所有 [事件广播](/docs/laravel/13.x/broadcasting) 频道的地方。

<a name="the-storage-directory"></a>
### Storage 目录
`storage` 目录包含你的日志、编译后的 Blade 模板、基于文件的会话、文件缓存以及框架生成的其他文件。此目录分为 `app`、`framework` 和 `logs` 目录。`app` 目录可用于存储应用程序生成的任何文件。`framework` 目录用于存储框架生成的文件和缓存。最后，`logs` 目录包含应用程序的日志文件。

`storage/app/public` 目录可用于存储应公开访问的用户生成文件，例如个人资料头像。你应该在 `public/storage` 创建一个指向此目录的符号链接。你可以使用 `php artisan storage:link` Artisan 命令创建该链接。

<a name="the-tests-directory"></a>
### Tests 目录
`tests` 目录包含你的自动化测试。开箱即用地提供了 [Pest](https://pestphp.com/) 或 [PHPUnit](https://phpunit.de/) 单元测试和功能测试示例。每个测试类应以 `Test` 作为后缀。你可以使用 `/vendor/bin/pest` 或 `/vendor/bin/phpunit` 命令运行测试。或者，如果你希望以更详细、更美观的方式呈现测试结果，可以使用 `php artisan test` Artisan 命令运行测试。

<a name="the-vendor-directory"></a>
### Vendor 目录

`vendor` 目录包含你的 [Composer](https://getcomposer.org/) 依赖项。

<a name="the-app-directory"></a>
## App 目录

你的应用程序的大部分内容都位于 `app` 目录中。默认情况下，此目录的命名空间为 `App`，并由 Composer 使用 [PSR-4 自动加载标准](https://www.php-fig.org/psr/psr-4/) 自动加载。

默认情况下，`app` 目录包含 `Http`、`Models` 和 `Providers` 目录。然而，随着时间的推移，当你使用 make Artisan 命令生成类时，`app` 目录内会生成各种其他目录。例如，`app/Console` 目录在你执行 `make:command` Artisan 命令生成命令类之前不会存在。

`Console` 和 `Http` 目录将在下面各自的部分中进一步解释，但可以将`Console` 和 `Http` 目录视为提供进入应用程序核心的 API。HTTP 协议和 CLI 都是与应用程序交互的机制，但实际上并不包含应用程序逻辑。换句话说，它们是向应用程序发出命令的两种方式。`Console` 目录包含你所有的 Artisan 命令，而 `Http` 目录包含你的控制器、中间件和请求。

> [!NOTE]
> `app` 目录中的许多类可以通过 Artisan 命令生成。要查看可用的命令，请在终端中运行 `php artisan list make` 命令。

<a name="the-broadcasting-directory"></a>
### Broadcasting 目录
`Broadcasting` 目录包含应用程序的所有广播频道类。这些类是使用 `make:channel` 命令生成的。默认情况下此目录不存在，但在你创建第一个频道时会为你创建。要了解有关频道的更多信息，请查看 [事件广播](/docs/laravel/13.x/broadcasting) 文档。

<a name="the-console-directory"></a>
### Console 目录

`Console` 目录包含应用程序的所有自定义 Artisan 命令。这些命令可以使用 `make:command` 命令生成。

<a name="the-events-directory"></a>
### Events 目录

此目录默认不存在，但会由 `event:generate` 和 `make:event` Artisan 命令为你创建。`Events` 目录存放 [事件类](/docs/laravel/13.x/events)。事件可用于提醒应用程序的其他部分发生了某个特定操作，从而提供了很大的灵活性和解耦性。

<a name="the-exceptions-directory"></a>
### Exceptions 目录

`Exceptions` 目录包含应用程序的所有自定义异常。这些异常可以使用 `make:exception` 命令生成。

<a name="the-http-directory"></a>
### Http 目录

`Http` 目录包含你的控制器、中间件和表单请求。几乎所有处理进入应用程序请求的逻辑都将放在此目录中。

<a name="the-jobs-directory"></a>
### Jobs 目录

此目录默认不存在，但如果你执行 `make:job` Artisan 命令，它将为你创建。`Jobs` 目录存放应用程序的 [队列任务](/docs/laravel/13.x/queues)。这些任务可以由应用程序排队或在当前请求的生命周期内同步运行。在当前请求期间同步运行的任务有时被称为「命令」，因为它们是 [命令模式](https://en.wikipedia.org/wiki/Command_pattern) 的一种实现。

<a name="the-listeners-directory"></a>
### Listeners 目录

此目录默认不存在，但如果你执行 `event:generate` 或 `make:listener` Artisan 命令，它将为你创建。`Listeners` 目录包含处理你的 [事件](/docs/laravel/13.x/events) 的类。事件监听器接收一个事件实例，并响应事件的触发执行逻辑。例如，`UserRegistered` 事件可能由 `SendWelcomeEmail` 监听器处理。


<a name="the-mail-directory"></a>
### Mail 目录

此目录默认不存在，但如果你执行 `make:mail` Artisan 命令，它将为你创建。`Mail` 目录包含应用程序发送的所有 [代表电子邮件的类](/docs/laravel/13.x/mail)。邮件对象允许你将构建电子邮件的所有逻辑封装在一个单一的、简单的类中，该类可以使用 `Mail::send` 方法发送。

<a name="the-models-directory"></a>
### Models 目录

`Models` 目录包含你所有的 [Eloquent 模型类](/docs/laravel/13.x/eloquent)。Laravel 附带的 Eloquent ORM 为处理数据库提供了一个优雅、简单的 ActiveRecord 实现，用于与数据库交互。每个数据库表都有一个对应的「Model」，用于与该表交互。模型允许你查询表中的数据，以及向表中插入新记录。

<a name="the-notifications-directory"></a>
### Notifications 目录

此目录默认不存在，但如果你执行 `make:notification` Artisan 命令，它将为你创建。`Notifications` 目录包含应用程序发送的所有「事务性」[通知](/docs/laravel/13.x/notifications)，例如关于应用程序内发生的事件的简单通知。Laravel 的通知功能支持通过多种驱动程序发送通知（如电子邮件、Slack、SMS 或存储在数据库中）。

<a name="the-policies-directory"></a>
### Policies 目录

此目录默认不存在，但如果你执行 `make:policy` Artisan 命令，它将为你创建。`Policies` 目录包含应用程序的 [授权策略类](/docs/laravel/13.x/authorization)。策略用于确定用户是否可以对资源执行给定操作。


<a name="the-providers-directory"></a>
### Providers 目录

`Providers` 目录包含应用程序的所有 [服务提供者](/docs/laravel/13.x/providers)。服务提供者通过在服务容器中绑定服务、注册事件或执行任何其他任务来引导你的应用程序，以准备处理传入的请求。

在一个全新的 Laravel 应用程序中，此目录已经包含 `AppServiceProvider`。你可以根据需要自由地向此目录添加自己的服务提供者。

<a name="the-rules-directory"></a>
### Rules 目录

此目录默认不存在，但如果你执行 `make:rule` Artisan 命令，它将为你创建。`Rules` 目录包含应用程序的自定义验证规则对象。这些验证规则用于将复杂的验证逻辑封装在一个简单的对象中。有关更多信息，请查看 [表单验证](/docs/laravel/13.x/validation)。

