<article><h1>Laravel 的文件夹结构</h1><ul><li><a href="#introduction">简介</a></li><li><a href="#the-root-directory">根目录</a><ul><li><a href="#the-root-app-directory"><code class=" language-php">app</code> 目录</a></li><li><a href="#the-bootstrap-directory"><code class=" language-php">bootstrap</code> 目录</a></li><li><a href="#the-config-directory"><code class=" language-php">config</code> 目录</a></li><li><a href="#the-database-directory"><code class=" language-php">database</code> 目录</a></li><li><a href="#the-public-directory"><code class=" language-php"><span class="token keyword">public</span></code> 目录</a></li><li><a href="#the-resources-directory"><code class=" language-php">resources</code> 目录</a></li><li><a href="#the-routes-directory"><code class=" language-php">routes</code> 目录</a></li><li><a href="#the-storage-directory"><code class=" language-php">storage</code> 目录</a></li><li><a href="#the-tests-directory"><code class=" language-php">tests</code> 目录</a></li><li><a href="#the-vendor-directory"><code class=" language-php">vendor</code> 目录</a></li></ul></li><li><a href="#the-app-directory">App 目录</a><ul><li><a href="#the-console-directory"><code class=" language-php">Console</code> 目录</a></li><li><a href="#the-events-directory"><code class=" language-php">Events</code> 目录</a></li><li><a href="#the-exceptions-directory"><code class=" language-php">Exceptions</code> 目录</a></li><li><a href="#the-http-directory"><code class=" language-php">Http</code> 目录</a></li><li><a href="#the-jobs-directory"><code class=" language-php">Jobs</code> 目录</a></li><li><a href="#the-listeners-directory"><code class=" language-php">Listeners</code> 目录</a></li><li><a href="#the-mail-directory"><code class=" language-php">Mail</code> 目录</a></li><li><a href="#the-notifications-directory"><code class=" language-php">Notifications</code> 目录</a></li><li><a href="#the-policies-directory"><code class=" language-php">Policies</code> 目录</a></li><li><a href="#the-providers-directory"><code class=" language-php">Providers</code> 目录</a></li></ul></li></ul><p><a name="introduction"></a></p><h2><a href="#introduction">简介</a></h2><p><code class=" language-php">Laravel</code> 默认的目录结构意在为构建不同大小的应用提供一个好的起点,当然,你可以自己按照喜好组织应用目录结构,<code class=" language-php">Laravel</code> 对类在何处被加载没有任何限制 -- 只要 <code class=" language-php">Composer</code> 可以自动载入它们即可。</p><h4>为什么没有 <code class=" language-php">Models</code> 目录?</h4><p>许多初学者都会困惑 Laravel 为什么没有 <code class=" language-php">models</code> 目录,当然,这是 laravel 故意为之,因为 <code class=" language-php">models</code> 这个词对不同开发者而言有不同的含义,容易造成歧义,有些开发者认为应用的模型指的是业务逻辑,还有些开发者则认为模型指的是与关联数据库的交互。</p><p>正是因为如此,我们默认将 Eloquent 的模型放置到 <code class=" language-php">app</code> 目录下,从而允许开发者自行选择放置的位置。</p><p><a name="the-root-directory"></a></p><h2><a href="#the-root-directory">根目录</a></h2><p><a name="the-root-app-directory"></a></p><h4><code class=" language-php">app</code> 目录</h4><p><code class=" language-php">app</code> 目录,如你所料,这里面包含应用程序的核心代码。另外,你为应用编写的代码绝大多数也会放到这里, 我们之后将很快对这个目录的细节进行深入探讨。</p><p><a name="the-bootstrap-directory"></a></p><h4><code class=" language-php">bootstrap</code> 目录</h4><p><code class=" language-php">bootstrap</code>目录包含了几个框架启动和自动加载设置的文件。<code class=" language-php">cache</code> 文件夹用于包含框架为提升性能所生成的文件,如路由和服务缓存文件。</p><p><a name="the-config-directory"></a></p><h4><code class=" language-php">config</code> 目录</h4><p><code class=" language-php">config</code> 目录,顾名思义,包含所有应用程序的配置文件。通读这些配置文件可以应对自己对配置修改的需求。</p><p><a name="the-database-directory"></a></p><h4><code class=" language-php">database</code> 目录</h4><p><code class=" language-php">database</code> 目录包含了数据迁移及填充文件,你还可以将其作为 SQLite 数据库的存放目录。</p><p><a name="the-public-directory"></a></p><h4><code class=" language-php"><span class="token keyword">public</span></code> 目录</h4><p><code class=" language-php"><span class="token keyword">public</span></code> 目录包含了 Laravel 的 HTTP 入口文件 <code class=" language-php">index<span class="token punctuation">.</span>php</code> 和前端资源文件(图片、JavaScript、CSS等)。</p><p><a name="the-resources-directory"></a></p><h4><code class=" language-php">resources</code> 目录</h4><p><code class=" language-php">resources</code> 目录包含了视图、原始的资源文件 (LESS、SASS、CoffeeScript) ,以及语言包。</p><p><a name="the-routes-directory"></a></p><h4><code class=" language-php">routes</code> 目录</h4><p><code class=" language-php">routes</code> 目录包含了应用的所有路由定义。Laravel 默认提供了三个路由文件:<code class=" language-php">web<span class="token punctuation">.</span>php</code>, <code class=" language-php">api<span class="token punctuation">.</span>php</code>, 和 <code class=" language-php">console<span class="token punctuation">.</span>php</code>。</p><p><code class=" language-php">web<span class="token punctuation">.</span>php</code> 文件里定义的路由都会在 <code class=" language-php">RouteServiceProvider</code> 中被指定应用到 <code class=" language-php">web</code> 中间件组,具备 Session 、CSRF 防护以及 Cookie 加密功能,如果应用无需提供无状态的、RESTful 风格的API,所有路由都会定义在 <code class=" language-php">web<span class="token punctuation">.</span>php</code> 文件。</p><p><code class=" language-php">api<span class="token punctuation">.</span>php</code> 文件里定义的路由都会在 <code class=" language-php">RouteServiceProvider</code> 中被指定应用到 <code class=" language-php">api</code> 中间件组,具备频率限制功能,这些路由是无状态的,所以请求通过这些路由进入应用需要通过 API 令牌进行认证并且不能访问 Session 状态。</p><p><code class=" language-php">console<span class="token punctuation">.</span>php</code> 文件用于定义所有基于闭包的控制台命令,每个闭包都被绑定到一个控制台命令并且允许与命令行 IO 方法进行交互,尽管这个文件并不定义 HTTP 路由,但是它定义了基于命令行的应用入口(路由)。</p><p><a name="the-storage-directory"></a></p><h4><code class=" language-php">storage</code> 目录</h4><p><code class=" language-php">storage</code> 目录包含编译后的 Blade 模板、基于文件的 session、文件缓存和其它框架生成的文件。此文件夹分格成 <code class=" language-php">app</code> 、<code class=" language-php">framework</code> ,及 <code class=" language-php">logs</code> 目录。<code class=" language-php">app</code> 目录可用于存储应用程序使用的任何文件。<code class=" language-php">framework</code> 目录被用于保存框架生成的文件及缓存。最后,<code class=" language-php">logs</code> 目录包含了应用程序的日志文件。</p><p><code class=" language-php">storage<span class="token operator">/</span>app<span class="token operator">/</span><span class="token keyword">public</span></code> 可以用来存储用户生成的文件,例如头像文件,这是一个公开的目录。你还需要在 <code class=" language-php"><span class="token keyword">public</span><span class="token operator">/</span>storage</code> 目录下生成一个软连接指向这个目录,你可以使用 <code class=" language-php">php artisan storage<span class="token punctuation">:</span>link</code> 来创建软链接。</p><p><a name="the-tests-directory"></a></p><h4><code class=" language-php">tests</code> 目录</h4><p><code class=" language-php">tests</code> 目录包含自动化测试。Laravel 推荐了一个 <a href="https://phpunit.de/">PHPUnit</a> 例子。每一个测试类都需要添加 <code class=" language-php">Test</code> 前缀,你可以使用 <code class=" language-php">phpunit</code> 或者 <code class=" language-php">php vendor<span class="token operator">/</span>bin<span class="token operator">/</span>phpunit</code> 命令来运行测试。</p><p><a name="the-vendor-directory"></a></p><h4><code class=" language-php">vendor</code> 目录</h4><p><code class=" language-php">vendor</code> 目录包含所有 <a href="https://getcomposer.org">Composer</a> 依赖。</p><p><a name="the-app-directory"></a></p><h2><a href="#the-app-directory"><code class=" language-php">app</code> 目录</a></h2><p>应用的核心代码位于 <code class=" language-php">app</code> 目录下,默认情况下,该目录位于命名空间 <code class=" language-php">App</code> 下, 并且被 Composer 通过 <a href="http://www.php-fig.org/psr/psr-4/">PSR-4</a> 自动载入标准 自动加载。</p><p><code class=" language-php">app</code> 目录下包含多个子目录,如 <code class=" language-php">Console</code> 、<code class=" language-php">Http</code> 、<code class=" language-php">Providers</code> 等。 其中 <code class=" language-php">Console</code> 和 <code class=" language-php">Http</code> 目录为进入应用程序核心提供了一个 API 。HTTP 协议和 CLI 是和应用进行交互的两种机制,但实际上并不包含应用逻辑。换句话说,它们是两种简单地发布命令给应用程序的方法。<code class=" language-php">Console</code> 目录包含你全部的 Artisan 命令,而 <code class=" language-php">Http</code> 目录包含你的控制器、中间件和请求。</p><p>其他目录将会在你通过 Artisan 命令 make 生成相应类的时候生成到 <code class=" language-php">app</code> 目录下。例如,<code class=" language-php">app<span class="token operator">/</span>Jobs</code> 目录在你执行 <code class=" language-php">make<span class="token punctuation">:</span>job</code> 命令生成任务类时,才会出现在 <code class=" language-php">app</code> 目录下。</p><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> <code class=" language-php">app</code> 目录中的很多类都可以通过 Artisan 命令生成,要查看所有有效的命令,可以在终端中运行 <code class=" language-php">php artisan list make</code> 命令。</p></blockquote><p><a name="the-console-directory"></a></p><h4><code class=" language-php">Console</code> 目录</h4><p><code class=" language-php">Console</code> 目录包含应用所有自定义的 Artisan 命令,这些命令类可以使用 <code class=" language-php">make<span class="token punctuation">:</span>command</code> 命令生成。该目录下还有 Console Kernel 类,在这里可以注册自定义的 Artisan 命令以及定义<a href="/docs/5.4/scheduling">调度任务</a>。</p><p><a name="the-events-directory"></a></p><h4><code class=" language-php">Events</code> 目录</h4><p><code class=" language-php">Events</code> 目录默认不存在,它会在你使用 <code class=" language-php">event<span class="token punctuation">:</span>generate</code> 或者 <code class=" language-php">event<span class="token punctuation">:</span>make</code> 命令以后才会生成。如你所料,此目录是用来放置 <a href="/docs/5.4/events">事件类</a> 的。事件类用于当指定事件发生时,通知应用程序的其它部分,并提供了很棒的灵活性及解耦。</p><p><a name="the-exceptions-directory"></a></p><h4><code class=" language-php">Exceptions</code> 目录</h4><p><code class=" language-php">Exceptions</code> 目录包含应用的异常处理,同时还是处理应用抛出的任何异常的好位置。如果你想自定义异常的记录和渲染,你应该修改此目录下的 Handler 类。</p><p><a name="the-http-directory"></a></p><h4><code class=" language-php">Http</code> 目录</h4><p><code class=" language-php">Http</code> 目录包含了控制器、中间件以及表单请求等,几乎所有进入应用的请求处理都在这里进行。</p><p><a name="the-jobs-directory"></a></p><h4><code class=" language-php">Jobs</code> 目录</h4><p><code class=" language-php">Jobs</code> 目录默认不存在,可以通过执行 <code class=" language-php">make<span class="token punctuation">:</span>job</code> 命令生成,<code class=" language-php">Jobs</code> 目录用于存放 <a href="/docs/5.4/queues">队列任务</a>,应用中的任务可以推送到队列,也可以在当前请求生命周期内同步执行。同步执行的任务有时也被看作命令,因为它们实现了 <a href="https://en.wikipedia.org/wiki/Command_pattern">命令总线设计模式</a>。</p><p><a name="the-listeners-directory"></a></p><h4><code class=" language-php">Listeners</code> 目录</h4><p><code class=" language-php">Listeners</code> 目录默认不存在,可以通过执行 <code class=" language-php">event<span class="token punctuation">:</span>generate</code> 和 <code class=" language-php">make<span class="token punctuation">:</span>listener</code> 命令创建。<code class=" language-php">Listeners</code> 目录包含处理 <a href="/docs/5.4/events">事件</a> 的类(事件监听器),事件监听器接收一个事件并提供对该 事件发生后的响应逻辑,例如,<code class=" language-php">UserRegistered</code> 事件可以被 <code class=" language-php">SendWelcomeEmail</code> 监听器处理。</p><p><a name="the-mail-directory"></a></p><h4><code class=" language-php">Mail</code> 目录</h4><p><code class=" language-php">Mail</code> 目录默认不存在,但是可以通过执行 <code class=" language-php">make<span class="token punctuation">:</span>mail</code> 命令生成,<code class=" language-php">Mail</code> 目录包含邮件发送类,邮件对象允许你在一个地方封装构建邮件所需的所有业务逻辑,然后使用 <code class=" language-php"><span class="token scope">Mail<span class="token punctuation">::</span></span>send</code> 方法发送邮件。</p><p><a name="the-notifications-directory"></a></p><h4><code class=" language-php">Notifications</code> 目录</h4><p><code class=" language-php">Notifications</code> 目录默认不存在,你可以通过执行 <code class=" language-php">make<span class="token punctuation">:</span>notification</code> 命令创建, <code class=" language-php">Notifications</code> 目录包含应用发送的所有通知,比如事件发生通知。Laravel 的通知功能将通知发送和通知驱动解耦,你可以通过邮件,也可以通过 Slack、短信或者数据库发送通知。</p><p><a name="the-policies-directory"></a></p><h4><code class=" language-php">Policies</code> 目录</h4><p><code class=" language-php">Policies</code> 你可以通过执行 ·make:policy· 命令来创建, ·Policies· 目录包含了所有的授权策略类,策略用于判断某个用户是否有权限去访问指定资源。更多详情,请查看 <a href="/docs/5.4/authorization">授权文档</a>。</p><p><a name="the-providers-directory"></a></p><h4><code class=" language-php">Providers</code> 目录</h4><p><code class=" language-php">Providers</code> 目录包含应用的 <a href="/docs/5.4/providers">服务提供者</a> 。服务提供者在启动应用过程中绑定服务到容器、注册事件,以及执行其他任务,为即将到来的请求处理做准备。</p><p>在新安装的 Laravel 应用中,该目录已经包含了一些服务提供者,你可以按需添加自己的服务提供者到该目录。</p></article>
- 入门指南
- 安装
- 配置信息
- 文件夹结构
- 请求周期
- 开发环境部署
- Valet
- Homestead
- 核心概念
- 服务提供者
- Facades
- Contracts
- 服务容器
- HTTP 层
- 路由
- 中间件
- CSRF 保护
- 控制器
- 请求
- 响应
- 视图
- Session
- 表单验证
- 前端
- Blade 模板
- 本地化
- 前端指南
- 编辑资源 Mix
- 安全
- API 认证
- 用户认证
- 用户授权
- 加密解密
- 哈希
- 重置密码
- 数据库
- 快速入门
- 查询构造器
- 分页
- 数据库迁移
- Redis
- 数据填充
- Eloquent ORM
- Eloquent ORM快速入门
- 模型关联
- Eloquent 集合
- 修改器
- 序列化
- 综合话题
- Artisan 命令行
- 广播系统
- 缓存系统
- 集合
- 错误与日志
- 事件系统
- 文件存储
- 辅助函数
- 邮件发送
- 消息通知
- 扩展包开发
- 队列
- 任务调度