# 简介
Laravel 默认的目录结构试图为不管是大型应用还是小型应用提供一个良好的起点。当然,你也可以按照自己的喜好重新组织应用的目录结构,因为 Laravel 对于指定类在何处被加载没有任何限制 —— 只要 Composer 可以自动载入它们即可。
**Models 目录在哪里?
**
许多初学者都会困惑 Laravel 为什么没有提供 `models` 目录,我可以负责任的告诉大家,这是故意的。因为 models 这个词对不同人而言有不同的含义,容易造成歧义,有些开发者认为应用的模型指的是业务逻辑,另外一些人则认为模型指的是与关联数据库的交互。
正是因为这个原因,我们默认将 Eloquent 的模型直接放置到 `app` 目录下,开发者可以自行选择放置的位置。
这是 Laravel 框架作者的想法,不过对于国内开发者,尤其是 PHP 开发者来说,`models` 目录用于存放与数据库交互的模型类应该没有什么异议,而业务逻辑应该放到 `services` 这种目录之下。所以推荐大家在生成模型类的时候指定生成到 `app/Models` 目录下:
~~~
php artisan make:model Models/Test
~~~
:-: ![](http://static.laravelacademy.org/wp-content/uploads/2018/03/15046129926017.jpg)
# 根目录
**App目录**
`app` 目录包含了应用的核心代码,注意不是框架的核心代码,框架的核心代码在 `/vendor/laravel/framework` 里面,此外你为应用编写的代码绝大多数也会放到这里,当然,如果你基于 Composer 做了 PHP 组件化开发的话,这里面存放的恐怕也只有一些入口性的代码了;
**Bootstrap目录**
`bootstrap` 目录包含了少许文件,用于框架的启动和自动载入配置,还有一个 cache 文件夹,里面包含了框架为提升性能所生成的文件,如路由和服务缓存文件;
**Config目录**
`config` 目录包含了应用所有的配置文件,建议通读一遍这些配置文件以便熟悉 Laravel 所有默认配置项;
**Database目录**
`database` 目录包含了数据库迁移文件及填充文件,如果有使用 SQLite 的话,你还可以将其作为 SQLite 数据库存放目录;
**Public目录**
`public` 目录包含了应用入口文件 `index.php` 和前端资源文件(图片、JavaScript、CSS等),该目录也是 Apache 或 Nginx 等 Web 服务器所指向的应用根目录,这样做的好处是隔离了应用核心文件直接暴露于 Web 根目录之下,如果权限系统没做好或服务器配置有漏洞的话,很可能导致应用敏感文件被黑客窃取,进而对网站安全造成威胁;
**Resources目录**
`resources` 目录包含了应用视图文件和未编译的原生前端资源文件(LESS、SASS、JavaScript),以及本地化语言文件;
**Routes目录**
`routes` 目录包含了应用定义的所有路由。Laravel 默认提供了四个路由文件用于给不同的入口使用:`web.php`、`api.php`、 `console.php` 和 `channels.php`。
`web.php` 文件包含的路由都位于 `RouteServiceProvider` 所定义的 `web` 中间件组约束之内,因而支持 Session、CSRF 保护以及 Cookie 加密功能,如果应用无需提供无状态的、RESTful 风格的 API,那么路由基本上都要定义在 `web.php` 文件中。
`api.php` 文件包含的路由位于 `api` 中间件组约束之内,支持频率限制功能,这些路由是无状态的,所以请求通过这些路由进入应用需要通过 token 进行认证并且不能访问 Session 状态。
`console.php` 文件用于定义所有基于闭包的控制台命令,每个闭包都被绑定到一个控制台命令并且允许与命令行 IO 方法进行交互,尽管这个文件并不定义 HTTP 路由,但是它定义了基于控制台的应用入口(路由)。
`channels.php` 文件用于注册应用支持的所有事件广播频道。
**Storage目录**
`storage` 目录包含了编译后的 Blade 模板、基于文件的 Session、文件缓存,以及其它由框架生成的文件,该目录被细分为成 `app`、`framework` 和 `logs` 子目录,`app` 目录用于存放应用生成的文件,`framework` 目录用于存放框架生成的文件和缓存,最后,`logs` 目录存放的是应用的日志文件。
`storage/app/public` 目录用于存储用户生成的文件,比如可以被公开访问的用户头像,要达到被 Web 用户访问的目的,你还需要在 `public` (应用根目录下的 `public` 目录)目录下生成一个软连接 `storage` 指向这个目录。你可以通过 `php artisan storage:link` 命令生成这个软链接。
**Tests目录**
`tests` 目录包含自动化测试文件,其中默认已经提供了一个开箱即用的`PHPUnit` 示例;每一个测试类都要以 `Test` 开头,你可以通过 `phpunit` 或 `php vendor/bin/phpunit` 命令来运行测试。
**Vendor目录**
`vendor` 目录包含了应用所有通过 `Composer` 加载的依赖。
# App目录
应用的核心代码位于 `app` 目录下,默认情况下,该目录位于命名空间 `App` 下, 并且被 Composer 通过 `PSR-4 自动载入标准` 自动加载。
`app` 目录下包含多个子目录,如 `Console`、`Http`、`Providers等`。`Console` 和 `Http` 目录提供了进入应用核心的 API,HTTP 协议和 CLI 是和应用进行交互的两种机制,但实际上并不包含应用逻辑。换句话说,它们只是两个向应用发送命令的方式。`Console` 目录包含了所有开发者编写的 Artisan 命令,`Http` 目录包含了控制器、中间件和请求等。
其他目录会在你通过 Artisan 命令 `make` 生成相应类的时候自动生成到 `app` 目录下。例如,`app/Jobs` 目录直到你执行 `make:job` 命令生成任务类时才会出现在 `app` 目录下。
> 注:`app` 目录中的很多类都可以通过 Artisan 命令生成,要查看所有有效的命令,可以在终端中运行 `php artisan list make` 命令。
**Broadcasting目录**
`Broadcasting` 目录包含了应用所需的所有广播频道类,这些类通过 `make:channel` 命令生成。该目录默认不存在,但是当你通过命令第一次创建频道类时会自动生成。想要了解更多关于频道的信息,可以查看事件广播文档。
**Console目录**
`Console` 目录包含应用所有自定义的 Artisan 命令,这些命令类可以使用 `make:command` 命令生成。该目录下还有 `Console/Kernel` 类,在这里可以注册自定义的 Artisan 命令以及定义调度任务。
**Events目录**
这个目录默认不存在,但是可以通过 `event:generate` 和 `make:event` 命令创建。该目录用于存放事件类。事件类用于告知应用其他部分某个事件发生情况并提供灵活的、解耦的处理机制。
**Exceptions目录**
`Exceptions` 目录包含应用的异常处理器,同时还是处理应用抛出的任何异常的好地方。如果你想要自定义异常如何记录或渲染,需要编辑该目录下的 `Handler` 类。
**Http目录**
`Http` 目录包含了控制器、中间件以及表单请求等,几乎所有通过 Web 进入应用的请求处理都在这里进行。
**Jobs目录**
该目录默认不存在,可以通过执行 `make:job` 命令生成,`Jobs` 目录用于存放队列任务,应用中的任务可以被推送到队列,也可以在当前请求生命周期内同步执行。同步执行的任务有时也被看作命令,因为它们实现了命令模式。
**Listeners目录**
这个目录默认不存在,可以通过执行 `event:generate` 和 `make:listener` 命令创建。`Listeners` 目录包含处理事件的类(事件监听器),事件监听器接收一个事件并提供对该事件发生后的响应逻辑,例如,`UserRegistered` 事件可以被 `SendWelcomeEmail` 监听器处理。
**Mail目录**
这个目录默认不存在,但是可以通过执行 `make:mail` 命令生成,`Mail` 目录包含应用所有邮件相关类,邮件对象允许你在一个地方封装构建邮件所需的所有业务逻辑,然后使用 `Mail::send` 方法发送邮件。
**Notifications目录**
这个目录默认不存在,你可以通过执行 `make:notification` 命令连带创建, `Notifications` 目录包含应用发送的所有通知,比如事件发生通知。Laravel 的通知功能将通知发送和通知驱动解耦,你可以通过邮件,也可以通过Slack、短信或者数据库发送通知。
**Policies目录**
这个目录默认不存在,你可以通过执行 `make:policy` 命令生成策略类来创建, `Policies` 目录包含了应用所有的授权策略类,策略用于判断某个用户是否有权限去访问指定资源。更多详情,请查看授权文档。
**Providers目录**
`Providers` 目录包含应用的所有服务提供者。服务提供者在应用启动过程中绑定服务到容器、注册事件以及执行其他任务为即将到来的请求处理做好准备工作。
在新安装的 Laravel 应用中,该目录已经包含了一些服务提供者,你可以按需添加自己的服务提供者到该目录。
**Rules目录**
该目录默认不存在,但是会伴随你执行 Artisan 命令 `make:rule` 自动生成。`Rules` 目录包含应用的自定义验证规则对象,这些规则用于在单个对象中封装复杂的验证逻辑,想要了解更多的话,请参考验证文档。
- 序言
- 新版特性
- 快速入门
- 升级指南
- 贡献指南
- API文档
- 安装配置
- 目录结构
- Homestead
- Valet
- 部署
- 核心概念
- 请求生命周期
- 服务容器
- 服务提供者
- 门面(Facades)
- 契约(Contracts)
- 框架基础
- 路由
- 中间件
- CSRF 保护
- 控制器
- 请求
- 响应
- 视图
- 生成 URL
- Session
- 验证
- 错误处理
- 日志
- 前端开发
- Blade 模板
- 本地化
- 前端脚手架
- 编译前端资源(Laravel Mix)
- 安全系列
- 登录认证
- API 认证
- 授权
- 加密
- 哈希
- 重置密码
- 进阶系列
- Artisan 控制台
- 集合
- 广播
- 缓存
- 事件
- 文件存储
- 辅助函数
- 邮件
- 通知
- 扩展包开发
- 队列
- 任务调度
- 数据库操作
- 快速入门
- 查询构建器
- 分页
- 迁移
- 数据填充
- Redis
- Eloquent ORM
- 快速入门
- 关联关系
- 集合
- 访问器 & 修改器
- API 资源类
- 序列化
- 应用测试
- 快速入门
- HTTP 测试
- 浏览器测试
- 数据库测试
- 模拟
- 官方扩展包
- Cashier(订阅支付解决方案)
- Envoy(远程操作解决方案)
- Horizon(队列系统解决方案)
- Passport(API 认证解决方案)
- Scout(全文搜索解决方案)
- Socialite(第三方登录解决方案)
- 相关下载
- Laravel 5.6 中文文档离线版
- Laravel 5.6 一键安装包