Laravel 目录结构
目录结构
根目录 root Directory
app
目录bootstrap
目录config
目录database
目录public
目录resources
目录routes
目录storage
目录tests
目录vendor
目录app
目录
[!App 目录](#App 目录)
Broadcasting
目录Console
目录Events
目录Exceptions
目录Http
目录Jobs
目录Listeners
目录Mail
目录Notifications
目录Policies
目录Providers
目录Rules
目录
简介
默认的Laravel应用程序结构旨在为大型和小型应用程序提供一个很好的起点。 但是我们可以随意组织自己的应用程序。 Laravel对任何给定类的位置几乎没有限制-只要Composer
可以自动加载该类就可以。
Models 目录在哪里?
当开始使用Laravel时,许多开发人员都对缺少models
目录感到困惑。 但是,缺少这样的目录是有意的。 “model”一词含糊不清,因为它对不同的人意味着不同的事物。 一些开发人员将应用程序的“model”称为其所有业务逻辑的总和,而其他开发人员将“model”称为与关系数据库进行交互的类。
因此,我们选择默认情况下将Eloquent model 放置在app目录中,并允许开发人员根据需要将它们放置在其他位置。
根目录
app
app目录包含您的应用程序的核心代码。 我们将在稍后详细探讨该目录。 但是,应用程序中几乎所有的类都将在此目录中。
bootstrap
bootstrap目录包含用于引导框架的app.php文件。 该目录还包含一个cache
目录,cache 目录包含框架生成的文件,这些文件用于性能优化,例如路由和服务缓存文件。
config
顾名思义,config目录包含应用程序的所有配置文件。 仔细阅读这些配置文件并熟悉所有可用配置选项,对我们以后的开发是很有帮助的。
database
database
目录包含我们的数据库迁移,model工厂和 seeds。 如果愿意,我们也可以使用此目录来保存SQLite数据库。
public
public
目录包含index.php文件,该文件是进入应用程序的所有请求的入口点。 该目录还包含静态资源,例如图片,JavaScript和CSS。
resources
resources
目录包含视图以及未编译的原始资源文件,例如LESS,SASS或JavaScript。 此目录还包含所有language
文件。
routes
routes
目录包含应用程序的所有路由定义。 默认情况下,Laravel包含以下几个路由文件:
- web.php
- api.php
- console.php
- channels.php
web.php文件包含RouteServiceProvider放置在Web中间件组中的路由,该路由提供会话状态,CSRF保护和cookie加密。如果应用程序不提供无状态的RESTful API,则很可能在web.php文件中定义了所有路由。
api.php文件包含RouteServiceProvider放置在api中间件组中的路由,该路由提供了访问频率限制。这些路由多数为无状态的,因此通过这些路由进入应用程序的请求旨在通过token进行身份验证,并且无法访问会话状态。
console.php文件中定义所有基于Closure的控制台命令。每个闭包都绑定到一个命令实例,从而允许一种简单的方法与每个命令的IO方法进行交互。即使此文件未定义HTTP路由,它仍定义了到应用程序的基于控制台的入口点(路由)。
我们可以在channels.php文件中注册所有的Laravel支持的广播事件。
storage
存储目录包含编译后的Blade模板,基于文件的会话,文件缓存以及框架生成的其他文件。 该目录分为app目录,framework目录和logs目录。 app目录可用于存储我们的应用程序生成的任何文件。 framework目录用于存储框架生成的文件和缓存。 最后,logs目录包含应用程序的日志文件。
storage/app/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 autoloading standard自动加载。
app目录包含各种其他目录,例如Console,Http和Providers。 可以将Console和Http目录视为提供应用程序核心的API。 HTTP协议和CLI都是与应用程序进行交互的机制,但实际上并不包含应用程序逻辑。 换句话说,它们是向应用程序发出命令的两种方式。 Console目录包含所有的Artisan命令,而Http目录包含控制器,中间件和 Requests。
当使用Artisan命令make
生成类时,在app目录中会生成相应目录。 因此,例如,我们使用 php artisan make:job
命令生成Job类,如果app/Jobs
目录不存在,则会自动创建该目录。
app目录中的许多类可以通过 Artisan 的
make
命令生成。 要查看可用的命令,在终端中运行下面命令。$ php artisan list make
Broadcasting
Broadcasting
目录包含应用程序的所有广播channel
类。 这些类是使用make:channel
命令生成的。 该目录默认情况下不存在,但在用命令生成第一个channel时创建。 要了解有关channel的更多信息,请查看event broadcasting的文档。
Console
Console目录包含适用于应用程序的所有自定义Artisan命令。 这些命令可以使用make:command
命令生成。 该目录还包含Console Kernel
,我们可以在其中注册自定义Artisan命令并定义计划任务。
Events
该目录默认情况下不存在,将由artisan命令event:generate
和make:event
创建。 Events
目录包含事件类。 事件可用于提醒应用程序其他部分已发生指定操作,从而提供了很大的灵活性和解耦性。
Exceptions
Exceptions目录包含应用程序的异常类,也是放置应用程序引发的所有异常的最佳地方。 如果要自定义异常的记录或展现方式,则应修改此目录中的Handler类。
Http
Http目录包含控制器,中间件和表单请求。 几乎所有用于处理进入应用程序的请求的逻辑都将放置在此目录中。
Jobs
该目录默认情况下不存在,但是如果执行Artisan命令make:job
,将创建该目录。 Jobs目录包含适用于应用程序的可排队作业。 作业可能排队或在当前请求生命周期内同步运行。 在当前请求期间同步运行的作业有时称为“命令”,因为它们是命令模式的实现。
Listeners
该目录默认情况下不存在,但是如果执行Artisan命令event:generate
或make:listener
,则会创建该目录。 Listeners目录包含处理事件的类。 事件侦听器接收事件实例并执行逻辑以响应被触发的事件。 例如,一个UserRegistered
事件可能由SendWelcomeEmail
监听器处理。
该目录默认情况下不存在,但是执行Artisan命令make:mail
,将创建该目录。 Mail目录包含应用程序发送的电子邮件的所有类。 邮件对象使我们可以将构建电子邮件的所有逻辑封装在一个简单的类中,该类可以使用Mail::send
方法发送。
Notifications
该目录默认情况下不存在,但是执行Artisan 命令 make:notification
将创建该目录。 Notifications
目录包含应用程序发送的所有“事务性”通知,例如有关应用程序中发生的事件的简单通知。 Laravel的通知功能可以抽象化通过各种驱动程序(例如电子邮件,Slack,SMS或存储在数据库中)发送通知。
Policies
该目录默认情况下不存在,但如果执行Artisan命令make:policy
,将创建该目录。 Policies
目录包含应用程序的授权策略类。 这些策略类用于确定用户是否可以对资源执行给定的操作。 有关更多信息,请查看authorization文档
Providers
Providers目录包含应用程序的所有Service Provider
。 Service Provider通过在服务容器中绑定服务,注册事件或执行任何其他任务来为进入的请求准备应用程序,从而引导应用程序正确运行。
在一个新安装的Laravel应用程序中,已经默认提供多个Providers
。 我们可以根据需要随意将自己的Provider
添加到此目录中。
Rules
该目录默认情况下不存在,但是执行Artisan 命令make:rule
,将创建该目录。 Rules
目录包含适用于应用程序的定制验证规则对象。 规则用于将复杂的验证逻辑封装在一个简单的对象中。 有关更多信息,请查看validation文档。