Laravel 默认的目录结构旨在为不同大小的应用提供一个好的起点。当然,您也可以按个人喜好自由组织应用。Laravel 并不限制类所在的位置——只要能被 Composer 自动加载即可。
当开始使用 Laravel 时,很多开发者都对缺少 models 目录感到困惑。然而,缺少此目录是有意为之。因为我们发现「模型」一词含糊不清,不同的人有不同的理解。一些开发者将「模型」作为应用业务逻辑的整体,而其他开发者将「模型」作为与关系数据库交互的类。
因此,默认我们选择把 Eloquernt 模型放在 app 目录下,并允许开发者自行选择将其放在何处。
顾名思义,app 目录包含了应用的核心代码。应用中几乎所有的类都会在此目录下,稍后我们会更深入地了解该目录的细节。
bootstrap 目录包含了 app.php 文件,用于引导框架启动。该目录下还有一个 cache 目录,包含框架生成的用来优化性能的文件,例如路由和服务缓存文件。
顾名思义,config 目录包含了应用所有配置文件。通读所有这些文件并熟悉所有可用选项是个不错的主意。
database 目录包含了数据迁移、模型工厂和数据填充文件。如果愿意,还可以将其作为 SQLite 数据库存放的目录。
public 目录包含了 index.php 文件,它是所有进入应用请求的入口点,并配置了自动加载。此目录还包含资源文件(如图片、JavaScript 和 CSS)。
resource 目录包含了视图文件和未编译的资源文件(如 LESS、SASS 或 JavaScript)。该目录还包含所有的语言文件。
routes 目录包含了应用所有路由定义。默认情况下, Laravel 包含以下几个路由文件:web.php、api.php、console.php 和 channels.php。
web.php 文件包含了 RouteServiceProvider 放在 web 中间件组的路由,它提供了会话状态、CSRF 防护和 Cookie 加密。如果应用不提供无状态的、RESTful 风格的 API,那么很有可能所有路由都会定义在 web.php 文件中。
api.php 文件包含了 RouteServiceProvider 放在 api 中间件组中的路由,它提供了速率限制。这些路由都是无状态的,所以由此进入应用的请求都会通过令牌进行身份认证,而不会获取 Session 状态。
console.php 文件是定义所有基于闭包的终端命令的地方。每个闭包都被绑定到一个命令实例,允许闭包与每个命令行输入输出方法进行简单的交互。尽管这些文件没有定义 HTTP 路由,但它也在应用中定义了基于终端的入口点(路由)。
channels.php 是注册应用支持的所有事件广播频道的地方。
storage 目录包含了编译的 Blade 模板、基于文件的 Session、文件缓存和框架生成的其它文件。该目录被分为 app,framework 和 logs 目录。app 目录可用于存储应用生成的任何文件。framework 目录用来存储框架生成的文件和缓存。最后,logs 目录包含应用的日志文件。
storage/app/public 目录可用于存储用户生成的文件(如用户头像),并且应该是可以公开访问的。您应该创建一个 public/storage 软链接指向该目录。可以通过 php artisan storage:link 命令来创建此链接。
tests 目录包含了自动化测试文件。Laravel 提供了一个开箱即用的 PHPUnit 测试范例。每个测试类都应该以 Test 为后缀。您可以使用 phpunit 或者 php vendor/bin/phpunit 命令运行测试。
vendor 目录包含了 Composer 依赖。
应用的多数代码都位于 app 目录。默认情况下,该目录使用 App 命名空间,并由 Composer 按照 PSR-4 自动加载规范自动加载。
app 目录下包含多个子目录,例如 Console,Http 和 Providers。Console 和 Http 目录提供进入应用核心的 API。HTTP 协议和命令行界面是和应用交互的两种方式,但实际上并不包含应用逻辑。换句话说,它们只是两种向应用发出命令的方式。Console 目录包含所有的 Artisan 命令,而 Http 目录包含应用的控制器、中间件和请求。
当使用 Artisan 提供的 make 命令生成类时,会在 app 中生成多个目录。例如,执行 Artisan 命令 make:job 生成任务类后,才存在 app/Jobs 目录。
app目录里的很多类都可以通过 Artisan 命令来生成。要查看可用的命令,只要在终端里运行php artisan list make命令即可。
Broadcasting 目录包含了应用所有的广播频道类。这些类可以使用 make:channel 命令生成。此目录默认是不存在的,但会在您创建第一个频道时生成。要了解有关频道的更多内容,请查看文档事件广播。
Console 目录包含了应用所有自定义的 Artisan 命令。这些命令可以使用 make:command 命令生成。此目录还包含终端内核,用于注册自定义 Artisan 命令和定义任务调度 。
Events 目录默认不存在,它会在您运行 Artisan 命令 event:generate 或 make:event 时生成。顾名思义,Events 目录存放了事件类。可以用事件提醒应用的其它地方发生了给定的操作,这为应用提供了大量的灵活性和解耦。
Exceptions 目录包含了应用异常处理器,同时也是存放应用抛出的任何异常类的好地方。如果想自定义记录或者渲染异常的方式,则应修改该目录下的 Handler 类。
Http 目录包含了控制器、中间件和表单请求。几乎所有进入应用的请求的处理逻辑都被放在这里。
Jobs 目录默认不存在,但会在运行 Artisan 命令 make:job 时生成。该目录存放了应用的队列任务。这些任务可以被应用推送给队列或者在当前请求生命周期内同步运行。在当前请求期间同步运行的任务有时可以看做是一个「命令」,因为它们是用命令模式的实现。
Listeners 目录默认不存在,但会在运行 Artisan 命令 event:generate 或 make:listener 时生成。Listeners 目录包含了用于处理事件的类。事件监听器接收一个事件实例并执行响应该事件时触发的逻辑。例如,UserRegistered 事件可能由 SendWelcomeEmail 监听器处理。
Mail 目录默认不存在,但会在运行 Artisan 命令 make:mail 时生成。Mail 目录包含了应用所有的邮件发送类。邮件对象允许您将构建邮件的逻辑封装在一个简单的单个类中并可以通过 Mail::send 方法发送。
Notifications 目录默认不存在,但会在运行 Artisan 命令 make:notification 时生成。Notifications 目录包含了应用发送的所有「事务性」通知,比如在应用中发生的事件的简单通知。Laravel 的通知功能抽象了通知发送方式,可以通过各种驱动发送,例如邮件、Slack、短信或者保存到数据库中。
Policies 目录默认不存在,但会在运行 Artisan 命令 make:policy 时生成。Policies 目录包含了应用的授权策略类。策略用来决定一个用户是否有权限操作指定资源。更多详情可以查看授权文档。
Providers 目录包含应用的所有服务提供者。服务提供者通过在服务容器中绑定服务、注册事件,或者执行其它为传入的请求准备应用的任务启动应用。
在一个新的 Laravel 应用里,该目录已经包含了一些服务提供者。您可以根据需要在此目录中添加自己的服务提供者。
Rules 目录默认不存在,但会在运行 Artisan 命令 make:rule 时生成。Rules 目录包含了自定义验证规则对象。这些规则将复杂的验证逻辑封装在一个简单的对象中。更多详情可以查看验证文档。