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 项目目录结构
就如你看到这样,laravel下面只包含了4个文件夹,这4个文件夹下面有一些子文件夹,这种丰富的子文件夹在第一次看到是不是有压力?我会逐个介绍。我们大部分的开发工作都会在app/文件夹下面进行。
下面是各个文件夹和文件的基本介绍:
顶级文件夹 | 作用 |
app | 包含了站点的controllers(控制器),models(模型),views(视图)和assets(资源)。这些是网站运行的主要代码,你会将你大部分的时间花在这些上面。 |
bootstrap | 用来存放系统启动时需要的文件,这些文件会被如index.php这样的文件调用。 |
public | 这个文件夹是唯一外界可以看到的,是必须指向你web服务器的目录。它含有laravel框架核心的引导文件index.php,这个目录也可用来存放任何可以公开的静态资源,如css,Javascript,images等。 |
vendor | 用来存放所有的第三方代码,在一个典型的Laravel应用程序,这包括Laravel源代码及其相关,并含有额外的预包装功能的插件。 |
正如上面提到的,/app是所有的乐趣产生的地方,让我们更深入的看看这个目录的结构。
图 1.2 显示/app文件夹的详细信息:
图1.2 app 文件夹详细信息
下面是详细介绍:
文件的文件夹 | 作用 |
/app/config/ | 配置应用程序的运行时规则、 数据库、 session等等。包含大量的用来更改框架的各个方面的配置文件。大部分的配置文件中返回的选项关联PHP数组。 |
/app/config/app.php | 各种应用程序级设置,即时区、 区域设置(语言环境)、 调试模式和独特的加密密钥。 |
/app/config/auth.php | 控制在应用程序中如何进行身份验证,即身份验证驱动程序。 |
/app/config/cache.php | 如果应用程序利用缓存来加快响应时间,要在此配置该功能。 |
/app/config/compile.php | 在此处可以指定一些额外类,去包含由‘artisan optimize’命令声称的编译文件。这些应该是被包括在基本上每个请求到应用程序中的类。 |
/app/config/database.php | 包含数据库的相关配置信息,即默认数据库引擎和连接信息。 |
/app/config/mail.php | 为电子邮件发件引擎的配置文件,即 SMTP 服务器,From:标头 |
/app/config/session.php | 控制Laravel怎样管理用户sessions,即session driver, session lifetime。 |
/app/config/view.php | 模板系统的杂项配置。 |
/app/controllers | 包含用于提供基本的逻辑、 数据模型交互以及加载应用程序的视图文件的控制器类。 |
/app/database/migrations/ | 包含一些 PHP 类,允许 Laravel更新当前数据库的架构并同时保持所有版本的数据库的同步。迁移文件是使用Artisan工具生成的。 |
/app/database/seeds/ | 包含允许Artisan工具用关系数据来填充数据库表的 PHP 文件。 |
/app/lang/ | PHP 文件,其中包含使应用程序易于本地化的字符串的数组。默认情况下目录包含英语语言的分页和表单验证的语言行。 |
/app/models/ | 模型是代表应用程序的信息(数据)和操作数据的规则的一些类。在大多数情况下,数据库中的每个表将对应应用中的一个模型。应用程序业务逻辑的大部分将集中在模型中。 |
/app/start/ | 包含与Artisan工具以及全球和本地上下文相关的自定义设置。 |
/app/storage/ | 该目录存储Laravel各种服务的临时文件,如session, cache, compiled view templates。这个目录在web服务器上必须是可以写入的。该目录由Laravel维护,我们可以不关心。 |
/app/tests/ | 该文件夹给你提供了一个方便的位置,用来做单元测试。如果你使用PHPUnit,你可以使用Artisan工具一次执行所有的测试。 |
/app/views/ | 该文件夹包含了控制器或者路由使用的HTML模版。请注意,这个文件夹下你只能放置模版文件。其他的静态资源文件如css, javascript和images文件应该放在/public文件夹下。 |
/app/routes.php | 这是您的应用程序的路由文件,其中包含路由规则,告诉 Laravel 如何将传入的请求连接到路由处理的闭包函数、 控制器和操作。该文件还包含几个事件声明,包括错误页的,可以用于定义视图的composers。 |
/app/filters.php | 此文件包含各种应用程序和路由筛选方法,用来改变您的应用程序的结果。Laravel 具有访问控制和 XSS 保护的一些预定义筛选器。 |
花了很多心思在建立和命名文件夹上,得到的就是一个具有良好的文件系统的应用程序。
在这里你得到了什么: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描述如下:
1 class Person extends Eloquent 2 { 3 public function mother() 4 { 5 return $this->belongsTo('Mother'); 6 } 7 8 public function father() 9 { 10 return $this->belongsTo('Father'); 11 } 12 13 public function spouse() 14 { 15 return $this->hasOne('Spouse'); 16 } 17 18 public function sisters() 19 { 20 return $this->hasMany('Sister'); 21 } 22 23 public function brothers() 24 { 25 return $this->hasMany('Brother'); 26 } 27 }