本文搜集于互联网,本人在些基础上针对Laravel 5.5的实际情况进行修订。在一切环境就绪了,当然就要开始了解框架了。
站在巨人的肩膀上,学东西会事半功倍。让我轻松了解Laravel应用程序的体系结构。
Laravel被称为“全栈”式框架,因为它处理从网络服务到数据库管理,直到HTML生成的一切事情,一个垂直集成的web开发环境能给开发者提供更好的体验。
一个典型的程序员通过命令行工具与Laravel交互,生成和管理Laravel项目环境。Laravel带有一个名为Artisan的优秀的命令行工具,可以用它来生成框架代码和数据库架构,Artisan能够处理从数据库架构迁移到资源和配置管理的一切事情。
约定优于配置
Laravel 的有趣的特征之一,在如何构建 web 应用程序上它规定了一些相当严重的限制。出人意料的是,这些限制使创建应用更加的容易——轻松了很多。让我们来看看为什么。
Laravel区别于其他垂直集成开发环境在于它强烈的偏好约定优于配置。而一些 Java,Python 或 PHP 框架往往需要大量的 XML 配置,Laravel在开始的时候几乎不需要配置(也许只有几行在PHP中)。这种对配置文件的规避行为使其非常独特,在所有 Laravel 应用程序中可识别的代码结构是相同的。
一个项目结构来统治他们所有 !
这并不奇怪,所有Laravel项目基本上具有相同的目录结构 ——在其中的每个文件都有其指定的地方。通过这种约定的目录结果,可以确保开发者按照“Laravel way”工作。
图 1.1 显示了 Laravel 项目目录结构是什么样子:
图1.1 Laravel 5.5项目目录结构
就如你看到这样,laravel下面包含了10个文件夹,即app目录、bootstrap目录、config目录、database目录、public目录、resources目录、routes目录、storage目录、tests目录、vendor目录这种丰富的子文件夹在第一次看到是不是有压力?我会逐个介绍。我们大部分的开发工作都会在app/文件夹下面进行。
下面是各个文件夹和文件的基本介绍:
顶级文件夹 |
作用 |
app | app 目录包含了应用的核心代码,注意不是框架的核心代码,框架的核心代码在 /vendor/laravel/framework 里面,此外你为应用编写的代码绝大多数也会放到这里,当然,如果你基于 Composer 做了 PHP 组件化开发的话,这里面存放的恐怕也只有一些入口性的代码了。 |
bootstrap | bootstrap引导目录包含了少许文件,用于框架的启动和自动载入配置,还有一个 cache 文件夹,里面包含了框架为提升性能所生成的文件,如路由和服务缓存文件;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 文件用于注册应用支持的所有事件广播频道。 |
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 目录下,默认情况下,该目录位于命名空间 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 命令。
图 1.2 显示/app文件夹的详细信息:
图1.2 app 文件夹详细信息
文件的文件夹 |
作用 |
Console | Console 目录包含应用所有自定义的 Artisan 命令,这些命令类可以使用 make:command 命令生成。该目录下还有 Console/Kernel 类,在这里可以注册自定义的 Artisan 命令以及定义调度任务。 |
Events | 这个目录默认不存在,但是可以通过 event:generate 和 make:event 命令创建。该目录用于存放事件类。事件类用于告知应用其他部分某个事件发生情况并提供灵活的、解耦的处理机制。 |
Exceptions | Exceptions 目录包含应用的异常处理器,同时还是处理应用抛出的任何异常的好地方。 |
Http | Http 目录包含了控制器(Controllers)、中间件(Middleware)以及表单请求(Requests)等,几乎所有通过 Web 进入应用的请求处理都在这里进行。 |
Jobs | 该目录默认不存在,可以通过执行 make:job 命令生成,Jobs 目录用于存放队列任务,应用中的任务可以被推送到队列,也可以在当前请求生命周期内同步执行。同步执行的任务有时也被看作命令,因为它们实现了命令模式。 |
Listeners | 这个目录默认不存在,可以通过执行 event:generate 和 make:listener 命令创建。Listeners 目录包含处理事件的类(事件监听器),事件监听器接收一个事件并提供对该事件发生后的响应逻辑,例如,UserRegistered 事件可以被 SendWelcomeEmail 监听器处理。 |
这个目录默认不存在,但是可以通过执行 make:mail 命令生成,Mail 目录包含应用所有邮件相关类,邮件对象允许你在一个地方封装构建邮件所需的所有业务逻辑,然后使用 Mail::send 方法发送邮件。 | |
Notifications | 这个目录默认不存在,你可以通过执行 make:notification 命令连带创建, Notifications 目录包含应用发送的所有通知,比如事件发生通知。Laravel 的通知功能将通知发送和通知驱动解耦,你可以通过邮件,也可以通过Slack、短信或者数据库发送通知。 |
Policies | 这个目录默认不存在,你可以通过执行 make:policy 命令生成策略类来创建, Policies 目录包含了应用所有的授权策略类,策略用于判断某个用户是否有权限去访问指定资源。更多详情,请查看授权文档。 |
Providers | Providers 目录包含应用的所有服务提供者。服务提供者在应用启动过程中绑定服务到容器、注册事件以及执行其他任务为即将到来的请求处理做好准备工作。
在新安装的 Laravel 应用中,该目录已经包含了一些服务提供者,你可以按需添加自己的服务提供者到该目录。 |
Rules | 该目录默认不存在,但是会伴随你执行 Artisan 命令 make:rule 自动生成。Rules 目录包含应用的自定义验证规则对象,这些规则用于在单个对象中封装复杂的验证逻辑,想要了解更多的话,请参考验证文档。。 |
Config目录
下面是详细介绍:
文件的文件夹 |
作用 |
config/ | 配置应用程序的运行时规则、 数据库、 session等等。包含大量的用来更改框架的各个方面的配置文件。大部分的配置文件中返回的选项关联PHP数组。 |
config/app.php | 各种应用程序级设置,即时区、 区域设置(语言环境)、 调试模式和独特的加密密钥。 |
config/auth.php | 控制在应用程序中如何进行身份验证,即身份验证驱动程序。 |
config/broadcasting.php | 此选项控制当事件需要广播时框架将使用的默认广播器。您可以设置任何的关系定义在“连接”阵列下面。支持:”pusher”, “redis”, “log”, “null” |
config/cache.php | 如果应用程序利用缓存来加快响应时间,要在此配置该功能。 |
config/database.php | 包含数据库的相关配置信息,即默认数据库引擎和连接信息。 |
config/filesystems.php | 您可以指定框架应该使用的默认文件系统磁盘。“本地”磁盘以及各种基于云的磁盘可供应用程序使用。只是存储! |
config/mail.php | 为电子邮件发件引擎的配置文件,即 SMTP 服务器,From:标头 |
config/queue.php | Laravel的队列API支持各种后端通过一个单一的API,让您方便地访问每一个后端使用相同的语法。在这里,您可以设置默认队列驱动程序。支持:”sync”, database”, “beanstalkd”, “sqs”, “redis”, “null” |
config/services.php | 这个文件是存储在第三方服务如tripe, Mailgun, SparkPost 。此文件为这种类型的信息提供了一个合理的默认位置,允许包具有常规的位置来查找各种凭据。 |
config/session.php | 控制Laravel怎样管理用户sessions,此选项控制将在请求上使用的默认会话“驱动程序”。默认情况下,我们将使用轻量级的本地驱动程序,但您可以指定这里提供的任何其他优秀驱动程序。即session driver, session lifetime。支持:”file”, “cookie”, “database”, “apc”,”memcached”, “redis”, “array” |
config/view.php | 模板系统的杂项配置。 |
花了很多心思在建立和命名文件夹上,得到的就是一个具有良好的文件系统的应用程序。
在这里你得到了什么:MVC
模型-视图-控制器(MVC)
让我们进入Laravel应用工作的高级别概述。你可能已经注意到了标准的Laravel应用程序结构由一个应用程序目录app/,它含有三个 子目录:models/,views/和controllers/。这就透露了Laravel遵循model-view-controller(MVC) 架构模式,就是强制将输入到展示逻辑关系的“业务逻辑”与图形用户界面(GUI)分开。就Laravel web应用而言,业务逻辑通常由像用户,博客文章这样的数据模型组成。GUI只是浏览器中的网页而已。MVC设计模式在网页开发领域很流行。
MVC模式的3个组件:
- 模型(model)
- 视图(view)
- 控制器(controller)
[注] 原作者在这里详细介绍了MVC三个组成部分,我这里由于篇幅就不介绍了。
Laravel组件
一个典型的Laravel应用程序包含上面提到的MVC组件,如下图:
当与Laravel交互时,浏览器发送一个请求,web服务器接收到请求并且传给Laravel路由引擎。Laravel路由接收到请求,然后重定向给基于路由的URL模式的合适的控制器类方法。
然后控制器类接管。在某种情况下,控制器会立即呈现出一个视图,它是一个被转换成HTML并送回浏览器的模版。更常见的动态网站,控制器与模型 交互,这是一个PHP对象,它表示应用程序(如用户、博客文章)中的一个元素,并负责与数据库进行通信的。调用模型后,控制器则呈现最终视图( HTML,CSS和图像),并返回完整的网页到用户的浏览器。
Laravel促进了这样的概念——模型、视图和控制器,应通过存储这些元素在不同的目录中的单独的代码文件中来保持相当的独立性。这就是Laravel目录结构发挥了作用。
像MVC这样的设计模式的产生,就是为了让开发者的生活更加的轻松。这就是Laravel比那些不用任何模式的PHP厉害的地方。如果这种讨论 很抽象,现在,不用担心!当你开始Laravel工作,你都不会意识到你是在一种设计模式中工作。过一段时间后,就会变得自然了。
数据模型
数据模型是任何应用程序的基础,它描述了应用程序的业务逻辑。任何一块的数据都是用数据库表来表示的。Laravel提供了一些技术来简化对数据库的访问。
Laravel通过将数据库中的表行转成能被轻松操纵的PHP对象,来连接应用程序的数据模型和数据库表。它还使您能够执行业务规则,描述在应 用程序中不同的数据模型之间的关系等。例如,一个人的家庭关系可以用Laravel Eloquent OR / M描述如下:
class Person extends Eloquent { public function mother() { return $this->belongsTo('Mother'); } public function father() { return $this->belongsTo('Father'); } public function spouse() { return $this->hasOne('Spouse'); } public function sisters() { return $this->hasMany('Sister'); } public function brothers() { return $this->hasMany('Brother'); } }
译文通过百度翻译,如有错误,欢迎指出。