larave-admin 从入门到进阶

153
Larave-Admin 从入门到进阶 Release 1.0 QingLian Dec 02, 2021

Upload: others

Post on 18-Dec-2021

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶Release 1.0

QingLian

Dec 02, 2021

Page 2: Larave-Admin 从入门到进阶
Page 3: Larave-Admin 从入门到进阶

目录

1 项目概述 1

2 开发环境搭建 32.1 环境要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 laradock环境搭建 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

3 php基础知识 233.1 php概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.2 静态网站与动态网站的区别 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243.3 Web程序的访问流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.4 PHP语言基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.5 PHP的八种数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.6 变量基本概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.7 命名规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.8 常量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.9 位运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.10 流程控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.11 文件包含四种形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.12 函数基本概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443.13 作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453.14 静态变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.15 可变函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483.16 匿名函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493.17 闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503.18 系统函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503.19 字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543.20 php数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

4 Laravel程序设计 594.1 HELLO WORLD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594.2 表单传值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

i

Page 4: Larave-Admin 从入门到进阶

4.3 HTML和 HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664.4 请求流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

5 Laravel框架初识 715.1 路由的定义与重定向 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.2 路由命名和分组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745.3 目录结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795.4 MVC架构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825.5 服务容器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 875.6 请求处理管道介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

6 Laravel框架之控制器 916.1 控制器路由 (控制器和路由之间如何关联,控制器和路由如何传递数据,控制器和视图如何传

递数据) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916.2 资源控制器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

7 Laravel框架之数据库与模型 997.1 laravel数据库配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997.2 laravel数据库与模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047.3 数据管理——基于模型的增删改查 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1107.4 数据管理——基于构造器的数据查询 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157.5 数据管理——基于构造器的数据增删改 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

8 Laravel框架之视图 1218.1 Blade模板入门(什么是 blade模板以及基础使用) . . . . . . . . . . . . . . . . . . . . . . . . . 1218.2 blade模板的流程控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

9 Laravel框架的数据库及操作 1239.1 ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

10 echart的使用 12510.1 echart使用(什么是 echart,echart的简单使用) . . . . . . . . . . . . . . . . . . . . . . . . . . . 12510.2 Echarts与 laravel的结合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12810.3 laravel向 echarts传递数据以及显示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

11 Laravel-admin安装以及认识 13511.1 Laravel-admin安装及初识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

12 权限设计 13712.1 实验原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13712.2 实验步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

13 菜单设计 13913.1 实验原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13913.2 实验步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

ii

Page 5: Larave-Admin 从入门到进阶

14 模块设计 14114.1 实验原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14114.2 实验步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

15 生命参数 14315.1 实验原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14315.2 实验步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

16 智能诊断 14516.1 实验原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14516.2 实验步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

17 用户分析 14717.1 实验原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14717.2 实验步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

iii

Page 6: Larave-Admin 从入门到进阶

iv

Page 7: Larave-Admin 从入门到进阶

CHAPTER

ONE

项目概述

1

Page 8: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

2 Chapter 1. 项目概述

Page 9: Larave-Admin 从入门到进阶

CHAPTER

TWO

开发环境搭建

2.1 环境要求

2.1.1 系统版本

2.1.2 软件版本

2.1.3 项目发布

2.1.4 推荐集成开发环境

2.2 laradock环境搭建

2.2.1 laradock

Laradock是为 Docker提供的完整 PHP本地开发环境/WEB环境配置工具,提供了一系列打包好(包括配置)的 Docker Image。Laradock早期专注为 Laravel打造 Docker开发环境,因而最早在 Laravel社区中出名,后来随着影响力的扩大,逐渐被 PHP社区接纳和采用,目前支持的 PHP项目除了 Laravel之外,还有 Symfony、CodeIgniter、WordPress、Drupal等等。

2.2.2 相关软件介绍

• git

• docker

3

Page 10: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

2.2.3 安装 git

双击运行本书配套资料包“02.相关软件”文件夹中的 Git-2.33.0.2-64-bit.exe,在弹出的窗口中单击 Next,如图所示。

Fig. 1: 图 12 1安装 git步骤 1

在弹出如所示的窗口中,可以单击 Browse⋯选择安装路径,这里默认安装在 C盘,选择好安装路径后单击Next进行下一步。

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

在弹出的如所示的窗口中,单击 Next进行下一步。

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

在弹出的如所示的窗口中,选择第二项,单击 Next进行下一步。

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

4 Chapter 2. 开发环境搭建

Page 11: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 2: 图 12 2安装 git步骤 2

Fig. 3: 图 12 3安装 git步骤 3

2.2. laradock环境搭建 5

Page 12: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 4: 图 12 4安装 git步骤 4

Fig. 5: 图 12 5安装 git步骤 5

6 Chapter 2. 开发环境搭建

Page 13: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 6: 图 12 6安装 git步骤 6

Fig. 7: 图 12 7安装 git步骤 7

2.2. laradock环境搭建 7

Page 14: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 8: 图 12 8安装 git步骤 8

Fig. 9: 图 12 9安装 git步骤 9

8 Chapter 2. 开发环境搭建

Page 15: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 10: 图 12 10安装 git步骤 10

Fig. 11: 图 12 11安装 git步骤 11

2.2. laradock环境搭建 9

Page 16: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 12: 图 12 12安装 git步骤 12

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

在弹出的如所示的窗口中,默认选择,单击 Next进行下一步。

在弹出的如所示的窗口中,不需要勾选选项,直接单击 Install开始安装。

安装完成后,在弹出的如所示的窗口中,取消所有选项的勾选,单击 Finish结束安装。

2.2.4 配置 git的环境变量

安装完 git之后,需要配置 git的环境变量才能正常使用 git的命令。右键单击桌面的“此电脑”图标,选择“属性”,在弹出的窗口中找到“高级系统设置”后单击打开,在弹出的对话框中单击“高级”标签页中“环境变量 (N)⋯”按钮,如图所示。

在弹出的对话框中,双击系统变量下的 Path变量,如所示。

在弹出的“编辑环境变量”对话框中,单击“新建”按钮新建 1个变量,变量值为“C:Program FilesGitbin”,如所示。完成配置后之前打开的所有对话框都单击“确定”按钮,直到退出环境变量设置。

配置完 git的环境变量后,需要验证一下 git的命令是否能正常使用。单击电脑左下角的“开始”图标,搜索到“运行”程序后打开,在“运行”窗口中输入 cmd命令,然后单击“确定”按钮,如所示。

在弹出的 dos命令提示符窗口中,输入 git命令后回车,会出现 git的用法信息,说明 git的环境变量配置成功,如所示。

10 Chapter 2. 开发环境搭建

Page 17: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 13: 图 12 13安装 git步骤 13

Fig. 14: 图 12 14安装 git步骤 14

2.2. laradock环境搭建 11

Page 18: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 15: 图 12 15安装 git步骤 15

Fig. 16: 图 12 16安装 git步骤 16

12 Chapter 2. 开发环境搭建

Page 19: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 17: 图 12 17配置 git步骤 1

2.2. laradock环境搭建 13

Page 20: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 18: 图 12 18配置 git步骤 2

2.2.5 安装 Docker

双击运行本书配套资料包“02.相关软件”文件夹中的 Docker Desktop Installer.exe,在弹出的窗口中勾选所有选项,然后单击 OK,等待安装,如所示。

1. 安装 git

2. 安装 Docker

可能报错

• 提示虚拟机未开启

打开任务管理器—性能查看虚拟化是否启用

若未启用解决方法:https://docs.docker.com/desktop/windows/troubleshoot/#virtualization一般,在 bios中打开Vir-tualization Technology (VTx)即可。开启虚拟化后重启再打开 docker

其他方式:https://jingyan.baidu.com/article/ed2a5d1f3a0dde48f7be173d.html

• 安装补丁

打开并安装补丁(链接中步骤 4)安装完成重启 Docker

14 Chapter 2. 开发环境搭建

Page 21: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 19: 图 12 19配置 git步骤 3

Fig. 20: 图 12 20配置 git步骤 4

2.2. laradock环境搭建 15

Page 22: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 21: 图 12 21配置 git步骤 5

16 Chapter 2. 开发环境搭建

Page 23: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

2.2.6 下载并配置 laradock

参考资料:https://github.com/laradock/laradock/blob/master/README-zh.md

1. 创建保存项目的目录 D:phpproject

2. 打开Windows PowerShell进入该目录,并运行:(需开启 VPN)

1 git clone https://github.com/laradock/laradock.git

3. 复制一份 laradoc中的.env.example文件名字改为.env

1 cd laradock

1 docker-compose up -d nginx mysql

可能报错

• ERROR: Service‘workspace’failed to build : Build failed并提示 nvm引起

则更改 workspace的 Dockerfile中的该行内容:

2.2. laradock环境搭建 17

Page 24: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

1 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash \

改为以下代码:

1 git clone https://github.com/nvm-sh/nvm.git .$NVM_DIR \

• 提示网络问题

修改.env文件,使用 docker国内镜像

1 CHANGE_SOURCE=true

1 WORKSPACE_COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer/

2 WORKSPACE_NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node

3 WORKSPACE_NPM_REGISTRY=https://registry.npm.taobao.org

• 报错提示需要从某网址下载文件超时

可以复制链接看是否能进入网页自动下载,若不能正常下载证明是网络问题,尝试开启/关闭 VPN再试几次。

18 Chapter 2. 开发环境搭建

Page 25: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

2.2. laradock环境搭建 19

Page 26: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

20 Chapter 2. 开发环境搭建

Page 27: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

2.2.7 创建 laravel项目

1. 在 phpproject文件中打开 powershell,输入如下指令进入容器

1 docker-compose exec --user=laradock workspace bash

2. 创建 laravel 8工程

1 composer create-project laravel/laravel my-laravel-app "8.*"

3. 修改 my-laravel-app/.env

1 DB_CONNECTION=mysql

2 DB_HOST=mysql

3 DB_PORT=3306

4 DB_DATABASE=default

5 DB_USERNAME=default

6 DB_PASSWORD=secret

4. 修改 laradock/.env,链接 laradoc和 laravel工程

1 APP_CODE_PATH_HOST=../my-laravel-app

5. docker使用的相关指令

1 退出 docker : exit

2 停止 docker : docker-compose stop

3 启动 docker : docker-compose up -d nginx mysql

6. 测试配置是否成功,浏览器访问:http://localhost/,若出现欢迎界面即为配置成功

2.2.8 安装 laravel-admin

1. 进入 docker

1 docker-compose exec workspace bash

2. 逐行运行以下命令

1 composer require encore/laravel-admin:1.8.14

2 php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"

3 php artisan admin:install

3. 测试配置是否成功,浏览器访问 http://localhost/admin/

账号 admin密码 admin

2.2. laradock环境搭建 21

Page 28: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

2.2.9 测试介绍

22 Chapter 2. 开发环境搭建

Page 29: Larave-Admin 从入门到进阶

CHAPTER

THREE

PHP基础知识

3.1 php概述

3.1.1 什么是 php

PHP(PHP:Hypertext Preprocessor)即“超文本预处理器”,是一种通用开源脚本语言。

PHP是在服务器端执行的脚本语言,与 C语言类似,是常用的网站编程语言。PHP吸纳 Java和 Perl多个语言的特色发展出自己的特色语法,并根据它们的长项持续改进提升自己。利于学习,使用广泛,主要适用于Web开发领域。

3.1.2 php的内容概述

(1)PHP的语法借鉴吸收了 C语言、Java和 PerI等计算机语言的特点。

(2)PHP的主要目标是让网络开发人员可以快速编写动态页面。

(3)PHP主要被用于开发各种类型的网站程序。

(4)PHP可以用于收集表单数据、生成动态网页、字符串处理,动态输出图像、处理服务器端文件、与数据库交互、会话跟踪、处理 XML文件支持大量的网络协议以及服务器端的其他相关操作。

(5)PHP是脚本语言,不需要事先编译,在服务器端运行。

(6)PHP可以在 windows,、Linux等各种操作系统上运行。

3.1.3 php的主要特点

(1)开源性和免费性

PHP的解释器的源代码是公开的,所以安全系数较高的网站可以自己更改 PHP的解释程序。PHP运行环境的使用也是免费的。

(2)快捷性

23

Page 30: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

PHP的语法特点类似于 C语言,但没有 C语言复杂的地址操作,而且加入了面向对象的概念,加上它具有简洁的语法规则,使得它操作编辑非常简单,实用性强。

(3)数据库连接的广泛性

PHP可以与很多主流的数据库建立起连接,如MySQL、ODBC、Oracle等,PHP是利用编译的不同函数与这些数据库建立起连接的。

(4)面向过程和面向对象并用

在 PHP语言的使用中,可以分别使用面向过程和面向对象,还可以将 PHP面向过程和面向对象两者一起混用,这是其它很多编程语言是做不到的。

3.1.4 php的应用

(1)PHP语言作为网站开发的通用语言,简单易行、可移植性好、应用空间广泛,逐渐受到网站开发人员的欢迎。因此,在行业网站建设过程中,具有良好的应用前景。

(2)利用 PHP语言进行行业网站设计,能够实现数据库的实时性更新,网站的日常维护和管理简单易行,进而提高用户的使用效率。

3.2 静态网站与动态网站的区别

3.2.1 静态网站

静态网站是指全部由 HTML代码格式页面组成的网站,所有的内容包含在网页文件中。网站主要是静态化的页面和代码组成,都有一个固定的 URL,一般文件名均以 htm、html、shtml等为后缀。

• 网页内容一经发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都是保存在网站服务器上的,也就是说,静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件

• 静态网页的内容相对稳定,因此容易被搜索引擎检索

• 静态网页没有数据库的支持,在网站制作和维护方面工作量较大

• 静态网页的交互性较差,在功能方面有较大的限制

3.2.2 动态网站

动态网站指网站内容可根据不同情况动态变更的网站,一般情况下动态网站通过数据库进行架构。动态网站除了要设计网页外,还要通过数据库 (SQL Server、MySQL、Oracle)和编程序 (.NET、PHP、Java)来使网站具有更多自动的和高级的功能。

• 动态网页以数据库技术为基础,可以大大降低网站维护的工作量

• 动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页

24 Chapter 3. php基础知识

Page 31: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

• 动态网页的内容和显示效果会根据用户的要求和选择而动态地改变和响应

动态网站与静态网站最根本的区别是在网页在服务器端运行状态不同。

Fig. 1: 图 2-2-1静态网站运行状态

Fig. 2: 图 2-2-2动态网站运行状态

3.3 Web程序的访问流程

Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。它是基于Web的,是典型的浏览器/服务器架构的产物。一个Web应用程序是由完成特定任务的各种Web组件(web components)构成的并通过Web将服务展示给外界。在实际应用中,Web应用程序是由多个 Servlet、JSP页面、HTML文件以及图像文件等组成。所有这些组件相互协调为用户提供一组完整的服务。

web程序的访问流程:

1. 浏览器输入地址进行访问

2. 将输入的网址(域名)进行解析

3.3. Web程序的访问流程 25

Page 32: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

浏览器会先从客户端系统(电脑)查询域名对应的 IP地址,如果找到了,浏览器就向这个 IP地址发出访问请求;

如果找不到对应的 IP地址,浏览器就会发起 DNS请求,向 DNS服务器(专门负责域名解析的服务器)查询IP地址,并保存到电脑,这时候浏览器就可以正常向匹配的服务器发出访问请求。

3. 浏览器发送 HTTP请求

请求信息通过浏览器进行包装,使其符合 HTTP协议(应用层),然后通过传输层、网络层、链路层将信息不断处理,最后将处理后的信息传到网络上,通过网络传送到指定的服务器上。

4. 服务器接收到网络上传输来的请求信息

服务器端通过 TCP/IP各层的信息,最终请求信息中获取了需求信息。

通过服务器判断,同意了客户端的请求,从资源库里(系统文件)里找到相应的资源,或者运行相应的程序,将资源/结果整理成符合 HTTP协议的响应信息(携带状态码),准备发回给客户端。

如果服务器没有同意客户端的请求,服务器无法运行,那么服务器也会整理一个符合 HTTP协议的响应信息(携带状态码),准备发回给客户端。

5. 客户端的浏览器通过端口获取到服务器传回的数据

获取到数据后,进行解析、渲染后,通过端口传输到服务软件,呈现出来。

3.4 PHP语言基础

PHP是一款功能强大的嵌入式 HTML脚本语言,经常被程序员用来作为网站开发的基础语言。PHP语法基础知识点包括 PHP脚本代码标记、PHP指令分隔符、PHP的注释和 PHP的输出。

3.4.1 基础 PHP语法

PHP脚本可以放在文档中的任何位置。以 <?php开始,以?>结束:

1 <?php

2 //

3 ?>

PHP文件的默认文件扩展名是“.php”,其中包含 HTML标签以及一些 PHP脚本代码。

下面的例子是一个简单的 PHP文件,其中包含了使用内建 PHP函数“echo”在网页上输出文本“Hello World!”的一段 PHP脚本:

26 Chapter 3. php基础知识

Page 33: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

实例

1 <!DOCTYPE html>

2 <html>

3 <body>

4

5 <h1>My first PHP page</h1>

6

7 <?php

8 echo "Hello World!";

9 //print "Hello World!" 同样可行

10 ?>

11

12 </body>

13 </html>

PHP中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。

3.4.2 PHP标记风格

1. XML风格:

1 <?php

2 echo “这是 XML 风格标记”;

3 ?>

2. 脚本风格:

1 <script language=”php”>

2 echo “这是脚本风格标记”;

3 </script>

3. 简短风格:

1 <? echo “//”; ?>

4. ASP风格:

1 <%

2 echo “这是 ASP 风格标记”;

3 %>

3.4. PHP语言基础 27

Page 34: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.4.3 PHP中的注释

PHP代码中的注释不会被作为程序来读取和执行。它唯一的作用是供代码编辑者阅读。

1 <!DOCTYPE html>

2 <html>

3 <body>

4

5 <?php

6

7 // 单行注释

8 # 单行注释

9

10 /*

11 多行

12 注释

13 */

14

15 echo "Hello World!";

16 ?>

17

18 </body>

19 </html>

3.5 PHP的八种数据类型

php数据类型包括 String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值),Resource(资源)。

3.5.1 PHP字符串

字符串是连续的字符序列,由数字、字母和符号组成,字符串中的每个字符只占用一个字节。

1 <?php

2 $x = "Hello world!";

3 $y = 'Hello world!'; //单引号双引号都是允许的

4 ?>

28 Chapter 3. php基础知识

Page 35: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.5.2 PHP整数型(integar)

整数是没有小数的数字。

• 整数必须有至少一个数字(0-9)

• 整数不能包含逗号或空格

• 整数不能有小数点

• 整数可以是正数或负数

• 可以用四种格式规定整数:十进制、十六进制(前缀是 0x)、八进制(前缀是 0)或二进制(前缀是 0b)

1 <?php

2 $x = 5985;

3 $x = -345; // 负数

4 $x = 0x8C; // 十六进制数

5 $x = 047; // 八进制数

6 $x = 0b11111111;//二进制数

7 ?>

3.5.3 PHP浮点型 (float)

浮点数是有小数点或指数形式的数字,其可以用来存储数字,也可以保存小数。

1 <?php

2 $x = 10.365;

3 $x = 2.4e3;

4 $x = 8E-5;

5 ?>

3.5.4 PHP布尔型 (boolean)

布尔变量是 PHP变量中最简单的,逻辑是 true或 false。

1 $x=true;

2 $y=false;

3.5. PHP的八种数据类型 29

Page 36: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.5.5 PHP数组 (array)

数组是一组数据的集合,它把一系列数据组织起来,形成一个可操作的整体。

1 <?php

2 $fruit=array("coconut","cherry","lichee");

3 ?>

3.5.6 PHP对象 (object)

在 PHP中,对象必须声明。对象数据类型也可以用于存储数据。

首先,必须使用 class关键字声明类对象。类是可以包含属性和方法的结构。然后在类中定义数据类型,然后在实例化的类中使用数据类型:

1 <?php

2

3 class MyClass{

4 public $age =100;

5 }

6 $obj =new MyClass

7 echo $obj ->age; //结果为 100

8

9 ?>

3.5.7 PHP NULL值

NULL值表示变量没有值。NULL是数据类型为 NULL的值。

NULL值指明一个变量是否为空值。同样可用于数据空值和 NULL值的区别。

1 <?php

2 $x="Hello world!";

3 $x=null; //可通过设置变量值为 NULL 来清空变量数据

4 ?>

30 Chapter 3. php基础知识

Page 37: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.5.8 PHP资源(resource)

PHP中的 Resources不是确切的数据类型。这些基本用于存储对某些函数调用或外部 PHP资源的引用。例如,考虑一个数据库调用,这是一个外部资源。

3.6 变量基本概念

3.6.1 变量的基本概念

1.变量是用来存储数据的;

2.变量是存在名字并通过名字来访问的数据;

3.变量是可以改变的数据;

3.6.2 变量命名规则

1.变量以 $符号开始,后面跟着变量的名称

2.变量名必须以字母或者下划线字符开始

3.变量名只能包含字母数字字符以及下划线(A-z、0-9和 _)

4.变量名不能包含空格

5.变量名是区分大小写的($y和 $Y是两个不同的变量)

3.6.3 变量的声明

PHP没有声明变量的命令,变量在第一次赋值给它的时候被创建

1 <?php

2 $txt="Hello world!";

3 echo $txt;

4 ?>

3.6.4 预定义变量

预定义变量:提前定义的变量,存储许多需要用到的数据(预定义变量都是数组)

1.$_GET:获取所有表单以 get方式提交的数据

2.$_POST:POST提交的数据都会保存在此

3.$_REQUEST:GET和 POST提交的都会保存在此

3.6. 变量基本概念 31

Page 38: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

4.$GLOBALS:PHP中所有的全局变量

5.$_SERVER:服务器信息

6.$_SESSION:session会话数据

7.$_COOKIE:cookie回话数据

8.$_ENV:环境信息

9.$_FILES:用户上传的文件信息

3.6.5 可变变量

如果一个变量保存的值刚好是另外一个变量的名字,那么可以直接通过访问一个变量得到另一个变量的值:在变量前多加一个 $符号

1 $a='x';

2 $b='xx';

3 echo $$a ; //结果为$b=xx

3.7 命名规则

1、类的命名

使用大写字母作为词的分割,其余的字母均为小写。

类名的首字母必须为大写英文字母。

类名命名不要使用下划线’_’。如:TestClass、User、UserType、ControllerAdmin。

2、类属性的命名

类的属性命名应该以字符’m’为前缀。

前缀’m’之后采用和类名一致的命名规则。

前缀’m’总是在名字的开头起到修饰的作用,就像’r’开头表示引用一样。如:mUserName、mUserKey等。

3、方法的命名

方法要依赖于类对象,而函数不需要依赖于类对象。因此一般命名时注意区分方法和函数的命名,函数一般作为扩展文件引入。方法的作用都是执行一个动作,达到一个目的。所以名称应该说明该方法是做什么的。一般名称的前缀都是有第一规律的,如 is(判断)、get(得到),set(设置)。方法的命名第一个单词的首字母小写,之后每个单词的首字母必须为大写。如:

1 class UserModel

2 {

3 $mUserName = ''; //设置类的属性(continues on next page)

32 Chapter 3. php基础知识

Page 39: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

4 $mUserKey ='';

5

6 function getUser($userId)

7 { //定义方法,得到用户信息

8 ...

9 }

10 }

4、方法中参数的命名

第一个字符或第一个词必须为小写字母。

在第一个字符或第一个词之后的词都按照类命名的规则首字母大写。

1 class User

2 {

3 function getUser($userId)

4 {

5 ...

6 }

7

8 function getMe(&$rUserKey)

9 {

10 ...

11 }

12 }

5、引用变量

引用变量要用‘r’前缀来修饰。如:$r_key = &$key;

6、变量的命名

一般所有字母都使用小写。

使用下划线’_’作为每个词的分割。

如:$msg_code、$msg_type、$msg_error等。

临时变量通常使用 i、j、k、m、n,它们一般用于表示整形;c、d、e、s它们一般用于字符型。

实例变量前需要用一个下滑线‘_’来修饰,首单词小写,其余的首字母大写

如:$_userType = new UserType()。

7、全局变量

全局变量应该用前缀‘g’来修饰。如:global $gTest。

超全局变量 $GLOBALS[‘gTest2’] =‘’。

3.7. 命名规则 33

Page 40: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

8、常量和全局常量

常量不能以‘$’开头。

PHP常量是通过 define()函数进行定义。

使用 constant()函数获取常量值。

使用 defined()函数判断常量是否定义。

使用 get_defined_constants()获取所有当前已经定义的常量。

PHP中常用预定义常量。如:

1、__FILE__程序文件名

2、__LINE__程序所在行数

3、PHP_VERSION PHP程序版本

4、PHP_OS PHP解析器的操作系统

5、TRUE真值 True

6、FALSE假值 False

7、NULL null值

8、E_ERROR指向最近的错误处

9、E_WARNING指向最近的警告处

10、E_PARSE解析语法有潜在问题处

11、NOTICE发生异常,但不一定是错误处

命名应该全部使用大写字母表示,用下滑线’_’来进行词的分割。如:

define(‘APP_VERSION’,‘1.1.0’);

difine(‘APP_NAME’,‘BRES’);

9、静态变量

静态变量应该使用前缀‘s’来修饰。如:static $sName=‘’。

10、函数的命名

所有字母小写,多个单词之间用下滑线‘—’分割。如:

1 public function get_ip(){

2

3 return $ip;

4 }

11、各种命名规则可以组合一起来使用

34 Chapter 3. php基础知识

Page 41: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

1 class Example{

2 static $msValue = ""; //该参数既是类属性,又是静态变量

3 global $gmTst; //声明静态全局变量

4

5 }

3.8 常量

3.8.1 常量的基本概念

与变量相对,常量是一个简单值的标识符 (名字)。如同其名称所暗示,在脚本执行期间该值不能改变 (除所谓魔术常量)。

PHP常量通常用来存储一个不被改变也不希望变化的数据,该数据只能是四种标量数据类型的数据:整型(integer)、浮点型 (float)、字符串 (string)、布尔型 (Boolean),不过从 PHP7开始常量支持了数组 (array)类型。

3.8.2 定义常量的两种方式

1. define( )函数

语法如下:

bool define ( string $name , mixed $value , [ bool $case_insensitive = false ] )

其中包含有三个参数:

name:必选参数,常量名称,即标志符。

value:必选参数,常量的值。与 C语言不同,Php作为一种弱类型语言,不需要严格设定该值的类型,与变量类似。

case_insensitive:可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。

实例:

1 <?php

2 define("WELCOME","一起学习 Php 吧"); //默认大小写敏感

3 echo WELCOME; //严格输入常量名称 (不需要加$), 正确

4 echo '<br>';

5 echo Welcome; //输入小写名称,错误

1 <?php

2 define("WELCOME", "一起学习 Php 吧", true);// 不区分大小写的常量名

3 echo wElcOme; // 正常输出结果 (不需要加$)

3.8. 常量 35

Page 42: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

2. const关键字

语法如下:

const $name = mixed $value

其中包含有两个参数:

name: 定义常量名称

value: 常量的值

实例:

1 <?php

2 const EXCELLENT= '212';

3 echo EXCELLENT; //输出:212

4 echo excellet; //PHP 提示常量未定义

3.8.3 预定义常量和魔术常量

1. 预定义常量 -预定义常量即指 PHP预先定义好的常量(具体常见类型见链接)

1 <?php

2 echo PHP_VERSION,'<br>'; //PHP 版本号

3 echo PHP_OS,'<br>'; //PHP 操作系统

4 echo PHP_INT_MAX,'<br>'; //PHP 中整型的最大值

2. 魔术常量 -魔术常量同样是预先定义的,但实际上他们并不是常量,其值随着在代码中的位置改变而改变(具体常见类型见链接)

1 <?php

2 echo __LINE__,'<br>'; //获取当前行号

3 echo __FILE__,'<br>'; //文件的完整路径和文件名

4 echo __DIR__,'<br>'; //文件所在的目录

3.8.4 与常量相关的重要函数

1. constant()函数

constant()函数用于返回一个常量的值,若常量未被定义则返回 NULL

语法如下:

constant($name即常量名)

36 Chapter 3. php基础知识

Page 43: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

1 <?php

2 define("WELCOME","HelloWorld!");

3 echo constant("WELCOME"); //输出该常量名对应的值,HelloWorld!

2. defined()函数 defined()函数检查是否定义了某一常量,若常量存在则返回 TRUE,否则返回 FALSE

语法如下:

defined($name即常量名)

1 <?php

2 define("WELCOME","HelloWorld!");

3 if(defined("WELCOME")) //如果已经定义了该常量,则 defined 函数返回 true,否则返回 false

不执行该判断语句

4 echo WELCOME; //输出

3. 补充 NULL、FALSE与 0的区别于联系

NULL vs FALSE vs 0 in Php

3.8.5 常量特点

• 常量一旦被定义就无法更改或撤销定义。

• 常量名不需要开头的 $

• 与变量不同,常量贯穿整个脚本是自动全局的。作用域 (见 2.12)不影响对常量的访问

• 常量值只能是字符串或数字

3.9 位运算符

3.9.1 二进制及位运算 (Bit Operation)概述

现代计算机中所有数据都以二进制的形式存储在设备中。即 0、1两种状态,计算机对二进制数据进行的运算 (+、-、/)等都叫位运算,合理的运用位运算能显著提高代码在机器上的执行效率。

3.9. 位运算符 37

Page 44: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.9.2 位运算符 (Bit Operator)概览

Table 1: 位运算符 (基于二进制)

符号 名称 结果

$a & $b 按位与 (And) 全 1出 1,否则出 0$a | $b 按位或 (Or) 有 1出 1,否则出 0$a ^ $b 按位异或 (Xor) 相反出 1,相同出 0~ $a 按位取反 (Not) 由 0变 1,由 1变 0$a << $b 左移 (Shift left) $a左移 $b位$a >> $b 右移 (Shift right) $a右移 $b位

3.9.3 位运算符具体介绍

1. 按位与 (And) 参与运算的两数各对应的二进位相与,当对应的两个二进位均为 1 时结果位为 1,否则为0(全 1出 1)如图:376 & 77

2. 按位或 (Or)参与运算的两数各对应的二进位相或,当对应的两个二进位有一个为 1时结果位就为 1,否则为 0。(有 1出 1)如图:262 | 136

3. 按位异或 (Xor)参与运算的两数各对应的二进位相异或,当两对应的二进位相异 (不相同)时结果为 1(相反出 1,相同出 0)如图:24 ^ 5

4. 按位取反 (Not)其功能是对参与运算的数的各二进位按位求反 (由 0变 1,由 1变 0)如图:~ 15

5. 左移 (Shift left)把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补 0如图:377 << 1

6. 右移 (Shift right)把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补 0,而为负数时,符号位为 1,最高位是补 0或是补 1取决于编译系统的规定如图:377 >> 1

38 Chapter 3. php基础知识

Page 45: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.9.4 注意事项

1. 使用运算符时应当考虑运算符优先级,必要时引用括号确保想要的优先级。如 $x & $y == false先比较再按位与;而 ($x & $y) == false则先按位与再比较。在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的运算顺序可能得出不同结果甚至出现运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。详情见运算符优先级

2. 位移在 PHP中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。

3.10 流程控制

3.10.1 Php流程控制简介

任何 PHP脚本都是由一系列语句构成的,正常情况下,代码就是按照编写的顺序从上往下逐行执行的,但并不是所有时候都希望程序顺序执行。所谓流程控制,就是在代码逻辑中增加一些“开关”,亦即一些语句来控制整个流程,让代码可以按照正常的业务需求运行到最后。

3.10.2 流程控制的三种结构

• 顺序结构:不需人为控制,代码按照编写的顺序逐行执行

• 分支结构:需要人为控制,根据既定条件判断结果,进而执行对应的预先设定的代码块

• 循环结构:是代码高效解决重复问题的一种方式,让代码块在符合设定变化条件的前提下在指定范围内重复执行

3.10.3 分支结构

1. if分支结构 (可无限层嵌套)

1 <?php

2 if (expr); //括号内容按照布尔求值取 true 或 false

3 statement; //true 则执行,flase 则跳过

1 <?php

2 if ($a > $b) {

3 echo "a is greater than b";

4 } else { //否则执行该命令

5 echo "a is NOT greater than b";

6 }

3.10. 流程控制 39

Page 46: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

1 <?php

2 if ($a > $b) {

3 echo "a is bigger than b";

4 } elseif ($a == $b) {

5 echo "a is equal to b";

6 } else {

7 echo "a is smaller than b";

8 }

2. switch分支结构

Switch也是一种通过特定条件匹配来选择执行代码块的分支结构,但是 Switch的条件只有一个,且运行机制与 if分支结构不一样。

语法如下:

1 <?php

2 switch(表达式/条件变量){

3   case 常量1:

4      //设定的满足该条件时执行的代码块;

5     break; //结束分支结构,必须加,否则会继续执行下去

6   case 常量 2:

7      //设定的满足该条件时执行的代码块;

8     break;

9   ...

10   default:

11      //匹配不到任何条件以执行代码块;

12     break;

13 }

3. if与 switch的区别:- if与 switch的分支逻辑不大相同,if分支是逐个匹配并执行命令,而 switch分支则是直接到达目标 case,因此对于较多分支的情况下,switch效率要更高 - if分支要相对更加灵活,而 switch只能是在既定的 case中匹配

3.10.4 循环结构

1. while循环结构

1 <?php

2 //输出 1 到 50 的整数

3 $i = 1; //定义初始化变量

4 while($i <= 50){

5 //循环体

6 echo $i; //如果到这结束,那么循环就进入死循环,因为$i 永远为 1 不满足条件(continues on next page)

40 Chapter 3. php基础知识

Page 47: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

7 //变更循环条件

8 $i++; //在循环体中控制循环变量

9 }

1 <?php

2 //求 100 以内的基数和

3 $i = 1;

4 $j = 0;

5

6 do{

7 $j += $i; //累计求和

8 $i++; //条件变更

9 }while($i <= 100); //条件判定

10 echo $j;

2. for循环结构

1 <?php

2 for ($i=1; $i<=5; $i++)

3 {

4 echo "Number:" . $i . PHP_EOL;

5 }

3. foreach循环结构

foreach循环,是 PHP中一种特定为数组设定的循环结构,能够方便的将数组的下标和值挨个取出来,从而实现对数组的所有元素的访问 (遍历数组)。每进行一次循环迭代,当前数组元素的值就会被赋值给 $value变量,并且数组指针会逐一地移动,直到到达最后一个数组元素。

语法如下:

1 <?php

2 foreach ($array as $value)

3 {

4 code to be executed;

5 }

实例:

1. continue 表示从 continue以后的循环体本次不再执行,重新开始下次循环

2. break 表示跳出整个循环

优点:continue和 break允许我们在循环内部设定特殊情况下的特殊执行方式,能使得循环流程更加灵活多变

3.10. 流程控制 41

Page 48: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.10.5 协助流程控制的一些特殊函数/语句

1. declare(directive): 控制代码的执行时间

2. return:返回值,中断代码执行

3. require(): 引入或者包含外部 php文件,require_once则不会对已引用的文件再次引用

4. include: 包含并运行指定文件,include_once则不会对已包含的文件再次包含

5. goto: 跳转到程序中的另一标记了的目的位置

3.11 文件包含四种形式

3.11.1 文件包含概述

1. 引入

不同的 PHP函数可以实现相对应的功能,但可能创建于不同的工程文件中,那其他文件中的代码必须要复制所需的函数代码过来才能正常访问吗?倘若一个文件中对应的功能已经写好了,那么想要在其他 PHP文件中使用,必须要保证该文件中的代码都进入到内存,而且彼此间有关联才可。而 PHP提供了这样一种解决方案,这就是文件包含

2. 文件包含的定义

文件包含,即是在一个要运行的 PHP脚本中,引用另外一个 PHP脚本中的代码并可以正常使用其被包含的文件中的内容,或者说能够做到让自己的内容在另外一个被包含的文件中使用。

3. 文件包含的意义

允许分工协作,各个脚本相互独立又能够紧密联系,能在很大程度上提高办事效率

• 使用被包含文件中的内容,实现代码的共享(重用):向上包含(索要)

• 允许自身的内容给别的文件使用,实现代码的共享(重用):向下包含(给予)

向上包含:在当前脚本包含并使用其他的文件中的功能代码向下包含:先写好代码,后包含文件,目的是为了在被包含文件中使用当前的已产生数据或是需要别的脚本来显示

3.11.2 文件包含的四种形式

include: 引入或者包含外部 php文件,有返回值

include_once: 与 include类似,但是不会对已经包含的文件再次包含

require: 引入或者包含外部 php文件

require_once: 与 require类似,但是不会对已经包含的文件再次包含

42 Chapter 3. php基础知识

Page 49: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.11.3 基本语法

include和 include_once,require和 require_once,这四种方式的用法是完全一样的:

include/include_once/require/equire_once(‘文件所在路径及文件名’);

3.11.4 四种形式的区别

• include和 require:

• include有返回值,而 require没有返回值。

• include在加载文件失败时,会生成一个警告(E_WARNING),在错误发生后脚本继续执行。所以 include用在希望继续执行并向用户输出结果时。require在加载失败时会生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本停止执行。一般用在后续代码依赖于载入的文件的时候。

• include/require和 include_once/require_once

• include载入的文件不会判断是否重复,只要有 include语句,就会载入一次(即使可能出现重复载入)。而 include_once 载入文件时会有内部判断机制判断前面代码是否已经载入过。这里需要注意的是 in-clude_once是根据前面有无引入相同路径的文件为判断的,而不是根据文件中的内容(即两个待引入的文件内容相同,使用 include_once还是会引入两个)。

• require_once与 require类似

3.11. 文件包含四种形式 43

Page 50: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.11.5 文件的载入和执行过程 *

3.12 函数基本概念

3.12.1 函数的定义

函数(function)是一种重要的语法结构,封装一段用于完成特定功能的代码。调用一个函数就是在调用一个由函数具体实现的功能。

其语法如下:

1 <?php

2 function 函数名(形参){

3 //函数体,专门用于实现特定功能的代码段

4 //返回值,需要使用 return 关键字将需要返回的数据传递给调用者。

5 }

说明:

1. 定义函数时的形参是一个仅在该函数内部使用的变量,形参可以根据需要设定,也可以忽略。

2. 函数名应清晰体现其功能,形参的命名也是,详情见函数命名规范

44 Chapter 3. php基础知识

Page 51: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.12.2 函数的分类

函数可以分为自定义函数和内置函数

1. 自定义函数按照上述的语法根据需求自己定义函数名称以及其将要实现的内容

2. 内置函数是系统已经定义好的函数,只需记住一些经典常用的,具体见 Php常用内置函数总结

3.12.3 函数的调用

1. 首先,将函数调用时的实参数据,传递(赋值)给函数的形参(变量);

2. 程序的执行流程,遇到函数调用,则进入到函数内部——此时可以认为是一个跟外界“隔离”的“独立运行空间”

3. 在函数内部,顺序执行其中的代码实现功能;

4. 直到函数结束,退出返回到原来调用函数的位置,继续执行后续代码。

5. 如果在函数内部执行的过程中有 return语句也会立即终止函数,并回到函数调用位置。

3.12.4 整体流程实例

1 <?php

2 function Test($x=3,$y=4){ // 定义 一个名为 Test 的函数,给形参赋予“默认值”

3 $s= $x * $x + $y * $y; //对输入的参数处理

4 $result = sqrt($s); //函数内部引用其他函数,此处引用系统内置函数求其开方

5 return $result;

6 } //返回值 result

7 $t1 = Test(6,8); // 调用 已定义的函数,赋予数据

8 echo "t1 = $t1";

3.13 作用域

3.13.1 作用域的基本概念

作用域是跟变量挂钩的概念,实际上就是指变量的范围,即它的生效范围或者说是变量能够被访问到的区域。

3.13. 作用域 45

Page 52: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.13.2 PHP变量及其作用域

1. 全局作用域

所有在函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global关键字。

2. 局部作用域

函数内部定义的变量,只能在函数内部使用

3. static作用域

PHP当一个函数完成时,它的所有变量通常都会被删除。为了有些局部变量不被删除,可以在第一次声明变量的时候使用 static关键字

1 <?php

2 function Test()

3 {

4 static $x=0; //利用 static 关键字定义静态变量

5 $y = 0; //局部变量

6 $x++;

7 $y++;

8 echo "x=$x";

9 echo "y=$y";

10 }

11 Test(); // x=1 ; y=1

12 Test(); // x=2 ; y=1

13 Test(); // x=3 ; y=1

4. 参数作用域

参数是通过调用代码将值传递给函数的局部变量。参数是在参数列表中声明的,作为函数声明的一部分

1 <?php

2 function Test($parameter)

3 {

4 echo "parameter = $parameter";

5 }

6 Test(5); //输出 parameter=5

46 Chapter 3. php基础知识

Page 53: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.13.3 global关键字和 $GLOBALS[index]数组

global关键字用于函数内访问全局变量。

1 <?php

2 $x = 50; //定义全局变量

3 function Test()

4 {

5 global $x; //利用 glbal 关键字在函数内部引用全局变量

6 $y = 100; //局部变量

7 $y = $y - $x;

8 }

9 Test();

10 echo $y;

PHP将所有全局变量存储在一个名为 $GLOBALS[index]的数组中。index保存变量的名称,这个数组可以在函数内部访问,也可以直接用来更新全局变量。

1 <?php

2 $x = 50 , $y= 25; //定义全局变量

3 function Test()

4 {

5 $GLOBALS['y'] = $GLOBALS['x'] / $GLOBALS['y'] ; //利用 GLOBALS 数组引用全局变量

6 }

7 Test();

8 echo $y;

9 >

3.14 静态变量

3.14.1 静态变量 static

• 在函数内部定义的变量,用 static关键字修饰,用来实现跨函数共享数据的变量。

• 函数运行结束,所有局部变量都会清空,若重新运行函数,所有局部变量将初始化。

3.14. 静态变量 47

Page 54: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.14.2 基本语法

Function函数名称 ( ) { static $变量名 =值; //定义变量并赋值 }

3.14.3 静态变量的作用

为了跨函数共享数据(指同一个函数被多次调用)

3.14.4 实例

1 <?php

2 function display(){

3 $local =1; //定义局部变量

4 static $count=1; //定义静态变量

5 echo $local++,$count++,'<br/>';

6 }

7 dispaly();

8 display();

9 display();

输出结果如下:11 12 13

即在运行过程中 $local变量在每次函数运行结束后都初始化,值始终为 1;而静态变量 $count在函数运行结束后保留在函数中进行的改变,且在下一次函数运行时以改变后的值被调用。

3.14.5 静态变量的使用

• 为了统计:当前函数被调用的次数

• 为了统筹函数多次调用得到的不同结果(递归思想)

3.15 可变函数

3.15.1 可变函数

当前有一个变量所保存的值,刚好是一个函数的名字,那么就可以使用变量 +()来充当函数名使用。

48 Chapter 3. php基础知识

Page 55: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.15.2 可变函数应用举例 (求 5加 10之后的四次方)

1 <?php

2 function calculate1($a,$b){

3 $b=$b+10;

4 return $a($b);

5 }

6 function calculate2($c){

7 return $c*$c*$c*$c;

8 }

9 echo calculate1('calculate2',5)

输出结果如下:50625

在 echo calculate1(‘calculate2’,5)中,第一个传入的参数为另一个函数的函数名,第二个参数为需要进行处理的数字 calculate2()被 calculate1()调用

将一个函数 ( calculate2() )传入给另一个函数 ( calculate1() )使用的过程叫回调过程。被传入的函数 ( calcu-late2() )也叫做回调函数。

3.16 匿名函数

3.16.1 基本概念

没有名字的函数

3.16.2 基本语法

1 变量名 = function(){

2 //函数内容

3 };

3.16.3 举例

1 <?php

2 $a = function(){ //定义基本匿名函数

3 echo 'hello world';

4 };

5 $a(); //调用匿名函数:可变函数

输出结果如下:hello world

3.16. 匿名函数 49

Page 56: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

变量保存匿名函数,本质得到的是一个对象

3.17 闭包

3.17.1 闭包

• 闭包一词来源于要执行的代码块和自由变量提供绑定的计算环境两者的结合。

• 简单理解:函数内部有一些局部变量(要执行的代码块)在函数执行后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)

3.17.2 举例

1 <?php

2 function display(){

3 $name = __FUNCTION__; //定义变量:局部变量

4 $innerfunction = function () use ($name){ //use 就是将外部变量(局部)保留给内部使用(闭

包)

5 echo $name; //函数内部的函数

6 };

7 $innerfunction(); //调用函数

8 }

9 display();

输出结果为:display

3.18 系统函数

3.18.1 有关输出的函数

• print():类似于 echo输出提供的内容,本质是一种结构(不是函数),返回 1,可以不使用括号。

• print_r():类似于 var_dump,但是比 var_dump简单,不会输出数据的类型,只会输出值(数组打印比较多)

50 Chapter 3. php基础知识

Page 57: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

举例

1 <?php

2 echo print('hello world<br/>');

3 print 'hello world<br/>';

4 $a = 'hello world';

5 print_r($a);

输出结果:

其中第二行的 1为 print的返回值

3.18.2 有关时间的函数

• date():按照指定格式对对应的时间戳 (从 1970年格林威治时间开始计算的秒数)

• time():获取当前时间对应的时间戳

• microttime():获取微秒级别的时间

• strtotime():按照规定格式的字符串转换成时间戳

实例

1 <?php

2 echo date(' Y 年 m 月 d 日 H : i: s',12345678),'<br/>'; //输出格林威治时间后第 12345678

秒后的时间戳

3 echo time(),'<br/>'; //输出当前的时间

4 echo microtime(),'<br/>';

5 echo strtotime('tomorrow 10 hours');

输出结果如下

其中 Y,m,d,H,i,s分别为年,月,日,时,分,秒的格式

3.18. 系统函数 51

Page 58: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.18.3 有关数学的函数

• max():比较出参数中最大值

• min():比较出参数中最小值

• rand():得到一个随机数,指定区间的随机整数

• mt_rand():与 rand()一样,只是底层结构不一样,效率比 rand()高(建议使用)

• round():四舍五入

• celi():向上取整

• floor():向下取整

• pow():求指定数字的指定指数次结果

• abs():取绝对值

• sqrt():求平方根

举例

1 <?php

2 echo max(25,30),'<br/>'; //比较 25 与 30 两个数较大的那个并输出

3 echo min(25,30),'<br/>'; //比较 25 与 30 两个数较小的那个并输出

4 echo rand(25,30),'<br/>'; //在 25 到 30 之间随机取一个数

5 echo mt_rand(25,30),'<br/>'; //在 25 到 30 之间随机取一个数

6 echo ceil(0.5),'<br/>'; //向上取整

7 echo floor(0.5),'<br/>'; //向下取整

8 echo pow(2,8),'<br/>'; //求 2 的 8 次方

9 echo abs(-20),'<br/>'; //求绝对值

10 echo sqrt(25),'<br/>'; //开方

输出结果如下

随机取数包括边界

52 Chapter 3. php基础知识

Page 59: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.18.4 有关函数的函数

• function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)

• func_get_arg():在自定义函数中去获取指定数值对应的参数

• func_get_args():在自定义函数中获取所有的参数(数组)

• func_num_args():获取当前自定义函数的参数数量

实例

1 <?php

2 echo '<br/><pre>'

3 function test($a,$b){

4 var_dump(func_get_arg(1)); //获取指定参数

5 var_dump(func_get_args()); //获取所有参数

6 var_dump(func_num_args()); //获取参数数量

7 }

8 function_exists('test') && test(1,'2',3,4);

输出结果如下

func_get_args和 func_num_args都是统计对应实参的数量

3.18. 系统函数 53

Page 60: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.19 字符串

3.19.1 字符串定义语法

• 单引号字符串:使用单引号包裹

• 双引号字符串:使用双引号包裹

• nowdoc字符串:没有单引号的单引号字符串

• heredoc字符串:没有双引号的双引号字符串

举例

1 <?php

2 $str1='hello';

3 $str2="hello";

4 $str3=<<<EOD

5 hello

6 EOD;

7 $str4=<<<'EOD'

8 hello

9 EOD;

10 var_dump($str1,$str2);

11 echo '<br/>';

12 var_dump($str3,$str4);

输出结果:

可看出定义结果差别不大,在定义较长字符串时,一般使用后两种方法。

54 Chapter 3. php基础知识

Page 61: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.19.2 字符串转义

含义:在计算机通用协议中,有一些特定的方式定义的字母,系统会特定处理

• \$:在 php中使用 $符号作为变量符号,因此需要特定识别

• \’:在单引号字符串中显示单引号

• \”:在双引号字符串中显示双引号

• 其余转义符号与 C语言相同

转义符号在单引号定义的字符串和双引号定义的字符串又有不同效果

举例(定义字符串识别转义符号)

1 <?php

2 $str1 = 'abc\r\ndef\t\'\"\$fg';

3 $str2 = "abc\r\ndef\t\'\"\$fg";

4 echo $str1 ,'<br/>',$str2;

输出结果:

结果显示,在单引号定义的字符串中,能识别 \’,双引号定义的字符串中,能识别 \”,\r,\n,\t,\$,因此双引号中可以解析变量。

双引号中变量识别的规则

• 变量本身系统能够与后面的内容区分:应该保证变量的独立性,不要让系统难以区分

• 使用变量专业标识符(区分),给变量加上一组大括号 {}

3.19.3 字符串长度

基本函数 strlen():得到字符串的长度(字节为单位,一个中文为三个字节)

3.19. 字符串 55

Page 62: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3.19.4 字符串相关函数(了解功能,依需查询)

1. 转换函数:- implode():将数组中的元素按照某个规则连接成一个字符串 - Explode():将字符串按照某个格式分割变成数组 - str_split():按照指定长度拆分字符串得到数组

2. 截取函数:- trim():本身默认用于去除两边的空格,但也可以指定要去除的内容,是按照指定的内容去除两边有的内容,知道碰到有一个不是目标字符为止 - ltrim():去除左边的 - rtrim():去除右边的

3. 截取函数:- substr():指定位置开始截取字符串,可以截取指定长度(起始位置从 0开始,若不指定长度,则截取到最后)- strstr():从指定位置开始,截取到最后(可以用来去文件后缀名)

4. 查找函数:- strpos():判断字符在目标字符串中首次出现的位置 - strrpos():判断字符在目标字符串中最后出现的位置

5. 大小转换函数:- strtolower():全部小写 - strtoupper():全部大小 - Ucfirst():首字母大写

6. 替换函数:- str_replace():将目标字符串中部分字符替换

7. 格式化函数:- printf()/sprintf():格式化输出数据

8. 其他:- str_repeat():重复某个字符串 n次 - str_shuffle():随机打乱某个字符串

3.20 php数组

3.20.1 数组的定义

数组是一个能在单个变量中存储多个值的特殊变量,并且可以根据键访问其中的值。

3.20.2 创建数组的几种情形

• 人工分配 ID键

1 $organ[0]="liver";

2 $organ[1]="kidney";

3 $organ[2]="intestine";

4

5 //关联数组——使用人为分配给数组的指定的键的数组

6 $age['Olivia']="20";

7 $age['Alysa']="22";

8 $age['Joe']="26";

9

10 //另一种关联数组定义方法

11 $age=array("Olivia"=>"20","Alysa"=>"22","Joe"=>"26");

• 自动分配 ID键

56 Chapter 3. php基础知识

Page 63: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

1 //自动按顺序由 0 开始分配 ID 键

2 $organ=array("liver","kidney","intestine"); //array 关键字

3 $organ=["heart","stomach","brain"]; //中括号

3.20.3 数组相关函数

• 获取数组长度——count函数

1 <?php

2 $organ=array("liver","kidney","intestine");

3 $arrlength=count($organ);

4 echo $arrlength;

• 遍历数组——foreach函数

每读一个值指向数组的指针自动后移一位

1 //foreach( $ 数组变量名 as $ 值 )

2 foreach($organ as $value)

3 {

4 echo $value,'<br/>';

5 }

1 //foreach($ 数组变量名 as $ 下标 =>$ 值)

2 $age=array("Olivia"=>"20","Alysa"=>"22","Joe"=>"26");

3 foreach($age as $name=>$name_value)

4 {

5 echo "Key=".$name.", Value=".$name_value;

6 echo "<br>";

7 }

• 其他函数

PHP自带一些对数组进行操作的 -其他函数,要求了解其功能,在需要的时候查询即可

3.20. php数组 57

Page 64: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

58 Chapter 3. php基础知识

Page 65: Larave-Admin 从入门到进阶

CHAPTER

FOUR

LARAVEL程序设计

4.1 HELLO WORLD

4.1.1 实验内容

Laradock是一套为 PHP提供的完整 Docker本地开发环境,有助于在 Docker上运行 PHP应用程序。包含了预先打包的 Docker镜像,所有预先配置都是为了提供一个完美的 PHP开发环境。本节的实验内容就是基于Laradock开发环境创建并运行一个 HelloWorld工程。

4.1.2 实验原理

1. 目录结构

下列是 Laravel项目 my-laravel-app的目录结构:

2. 目录说明

下列是关于 my-laravel-app项目的目录结构说明:

• app:存放应用核心代码,如模型、控制器、命令、服务等

• bootstrap:存放 Laravel框架每次启动时用到的文件

• config:用于存放项目所有配置文件

• database:存放数据库迁移和填充类文件

• public:Web应用入口目录,用于存放入口文件 index.php及前端资源文件(CSS、JS、图片等)

• resources:用于存放与非 PHP资源文件,如视图模板、语言文件、待编译的 Vue模板、Sass、JS源文件

• routes:项目的所有路由文件都定义在这里

• storage:用于存放缓存、日志、上传文件、已经编译过的视图模板等

• tests:存放单元测试及功能测试代码

• vendor:通过 Composer安装的依赖包都存放在这里,通常该目录会放到.gitignore文件里以排除到版本控制系统之外

59

Page 66: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 1: 图 4-1-1 my-laravel-app项目的目录结构

60 Chapter 4. Laravel程序设计

Page 67: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

3. 路由的简单定义

对 Laravel应用框架而言,通过 HTTP协议处理用户请求并返回响是核心必备功能,对任何一个Web应用框架而言,通过 HTTP协议处理用户请求并返回响应都是核心必备功能。最基本的 Laravel路由只接收一个路径(URL)和一个闭包,并以此为基础提供一个非常简单优雅的路由定义方法:

1 Route::get('hello',function(){

2 return 'Hello World!';

3 });

这里定义了个路由,匹配方法为 Get请求,导向路径为../hello,路由方法,返回输出“Hello World!”。

4. web.php文件

web.php文件用于处理终端用户通过Web浏览器直接访问的请求。

下面介绍下 web.php文件的程序结构,程序清单如下:

1 <?php

2

3 use Illuminate\Support\Facades\Route;

4

5 Route::get('/', function () {

6 return view('welcome');

7 });

第三行为引入类文件,类文件包含了 route方法。

第五行为匹配 get请求路由。

第六行为返回响应视图’welcome.blade.php’。

4.1.3 实验步骤

步骤 1.开启各项服务

首先,确保 docker中 laradock各项服务都在正常运行的状态下,如果还未开启,需要全部开启各项服务再进行下面的操作。

步骤 2.进入 laradock容器工作区

然后进入项目目录 laradock下输入 cmd指令,回车执行,运行命令行。

或者先运行命令行,通过 cd命令进入到 laradock所对应的路径。

在弹出的的命令行工具中,输入以下指令进入 laradock容器的工作区

1 docker-compose exec --user=laradock workspace bash //进入工作区指令

4.1. HELLO WORLD 61

Page 68: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 2: 图 4.1.2 laradock正常运行状态

Fig. 3: 图 4.1.3项目 laradock命令行运行

62 Chapter 4. Laravel程序设计

Page 69: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

进入 laradock容器工作区后,保持命令行,不要关闭。

步骤 3.修改 web.php文件

用Visual Studio Code软件打开my-laravel-app文件,找到并进入目录my-laravel-app/routes目录下,打开web.php文件,如图 4-1-2所示。

Fig. 4: 图 4-1-4 web.php文件

在”路由方法”区添加第 4-6行代码,定义一个 hello的路由,返回输出”Hello World!”,如程序清单所示

1 Route::get('/', function () {

2 return view('welcome');

3 });

4 Route::get('hello',function(){

5 return 'Hello World!';

6 });

最后,按 Crtl+S键保存,打开浏览器并访问地址:http://localhost/hello ,执行结果如图 4-1-3所示,可以看到网页上打印出了”Hello World!”。

4.1. HELLO WORLD 63

Page 70: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 5: 图 4-1-5 Hello World运行结果

4.2 表单传值

表单(Form)用来负责数据采集功能。表单传值即浏览器通过表单元素将用户的选择或者输入的数据提交给后台服务器语言。在表单传值过程中,Get与 Post是两种不同的提交方式。

HTTP定义了与服务器交互的不同方法,在客户端和服务器之间进行请求-响应时,两种最常被用到的方法是:GET和 POST。

4.2.1 为什么使用表单传值

动态网站(Web2.0)的特点就是后台根据用户的需求定制数据,所谓的“需求”就是用户通过当前的选择或者输入的数据信息,表单就是这些数据的承载者。

4.2.2 Get传值

Get表单方式的基本设定:<form method=”GET”>表单元素 </form>

浏览网页 http://localhost/test/form,页面效果:

点击提交按钮后,显示结果为

Get请求通过 URL传递表单值,服务端文件名后跟着“?”,表单元素 name属性的值 =用户输入的值(value属性的值),如果要提交多个属性值用 &分隔开。

64 Chapter 4. Laravel程序设计

Page 71: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 6: 图 4-2-1 Get传值 form页面

Fig. 7: 图 4-2-2 Get传值提交页面

4.2.3 Post传值

Post表单方式的基本设定:<form method=”POST”>表单元素 </form>

浏览网页 http://localhost/test/form,页面效果:

Fig. 8: 图 4-2-3 Post传值 form页面

点击提交按钮后,显示结果为

Post请求通过 URL看不到提交的表单的值,在服务端用 Form来接收数据。

4.2.4 Get传值和 Post传值区别

1、Get传输的数据主要用来获取数据,不改变服务器上资源:Get只是用来获取内容。

2、Post传输的数据主要用来增加数据,改变服务器上资源:POST会改变服务器上数据内容。

3、get传递的参数是可见的,post是不可见的,post更安全

Get是不安全的,因为在传输过程,数据被放在请求的 URL中。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。

4、Get传输的数据量小,Post传输数据量无限制

4.2. 表单传值 65

Page 72: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 9: 图 4-2-4 Post传值提交页面

Get传输的数据量小,这主要是因为受 URL长度限制;Post可以传输大量的数据,所以在上传文件只能使用Post。

5、传输的数据格式不同

get传输简单数据 (数值/字符串),post可以提交复杂数据 (数值/字符串/二进制等)

6、Get是 Form的默认方法。

4.2.5 PHP接收数据的方式

PHP 接收数据的方式有三种:$_GET、$_POST、$_REQUEST,都是 PHP 超全局预定义数组,表单元素的“name”属性的值作为数组的下标,而 value属性对应的值就是数组的元素值。

• $_GET方式:接收 GET方式提交的数据

• $_POST方式:接收 POST方式提交的数据

• $_REQUEST方式:接收 POST或者 GET提交的所有数据

4.3 HTML和 HTTP

4.3.1 HTML简介

HTML(Hypertext Markup Language,超文本标记语言)是用于描述网页文档的一种标记语言。超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。

HTML是一种描述性的标记语言,用于描述网页内容的显示方式,它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的 Internet资源连接为一个逻辑整体。HTML文本是由 HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等。

66 Chapter 4. Laravel程序设计

Page 73: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

4.3.2 HTTP

1. HTTP介绍

HTTP(HyperText Transfer Protocol,超文本传输协议)是用于Web服务器传输超文本和本地客户端(浏览器)之间的传送协议。HTTP是互联网上最普遍和广泛采用的应用程序协议之一,旨在启用客户端和服务器之间的通信。请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。

HTTP最重要也是最突出的优点是简单、灵活、易于扩展。还可以使浏览器更加高效,使网络传输减少,保证了计算机正确快速地传输超文本文档。

对于 http协议,主要的包括 scheme(协议)、host(主机)和 path(资源路径)。

比如:http://localhost/index.html则标明 http://协议、localhost主机名、/index.html资源路径。

HTTTP最常用的是 HTTP1.0/1.1。

最开始版本是 HTTP0.9,最新版本是 HTTP2.0,与 1.0/1.1相比,有了更高的性能、安全性和灵活性。

2. HTTP相关协议

HTTP是属于 TCP/IP模型中的应用层的协议,需要其他层次协议的配合完成信息的交换。

TCP协议是一种可靠的传输控制协议,IP协议使用 IP地址来标识互联网上的每一台计算机。

URI是统一资源标识符,使用它就能够唯一地标记互联网上资源,包含 URL。URL是统一资源定位符,即网址,用来传输数据和建立连接。

DNS(域名系统)作为将域名和 IP地址相互映射的一个分布式数据库,DNS协议是把 IP地址转换为便于人类记忆的协议。

3. HTTP工作过程

HTTP工作过程是一个请求-响应的全过程

(1)客户端输入 URL,DNS域名解析获取对应的 IP地址以及端口号

(2)发起建立 TCP/IP连接,连接到Web服务器

(3)发送 HTTP请求

(4)服务器接受请求并返回 HTTP响应

(5)释放 TCP/IP连接

(6)客户端浏览器解析 HTML内容

4.3. HTML和 HTTP 67

Page 74: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

4.4 请求流程

在 Hello World实验中,从客户端输入 URL(网址),到返回页面“Hello World!”的过程,是一个 HTTP请求响应过程。这是由一个最简单的 Laravel路由定义实现的,涵盖了一个Web框架的基本功能:处理请求,返回响应。本节将对于 Laravel的请求流程展开介绍。

4.4.1 概述

Laravel请求流程(请求生命周期)概括起来主要分为四个主要阶段:

• 加载项目依赖

• 创建 Laravel应用实例

• 接收请求并响应

• 发送响应与终止

要了解 Laravel框架的整个运行过程,首先要看 Laravel的入口文件 public/index.php。

Laravel应用的所有请求入口都是 public/index.php文件。所有的请求都是经由Web服务器(Apache/Nginx)通过配置引导到这个文件,而四个阶段的处理也都发生在入口文件 index.php中。

index.php文件包含代码并不多,但是完成了一个请求从接收到响应的全部过程。

1 //1. 加载项目依赖

2 require __DIR__.'/../vendor/autoload.php';

3

4 //2. 创建 Laravel 应用实例

5 $app = require_once __DIR__.'/../bootstrap/app.php';

6

7 //3. 接收请求并响应

8 $kernel = $app->make(Kernel::class);

9

10 $response = tap($kernel->handle(

11 $request = Request::capture()

12 ))->send(); //4. 发送响应

13

14 $kernel->terminate($request, $response);

68 Chapter 4. Laravel程序设计

Page 75: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

4.4.2 请求到响应流程

加载项目依赖

PHP依赖于 Composer包管理器,入口文件通过注册加载 Composer包管理器自动生成的 class loader(类加载程序),可以轻松注册并加载项目所依赖的第三方组件库。

所有组件的加载工作,由 index.php中的这一行代码来完成:

1 require __DIR__.'/../vendor/autoload.php';

创建 Laravel应用实例

创建 Laravel应用实例(即服务容器),由位于 bootstrap/app.php文件里的引导程序完成,创建服务容器的过程就是应用初始化的过程,主要实现了服务容器本身注册、基础服务提供者注册、核心类别名注册和基本路径注册。在注册过程中,服务容器会在对应属性中记录注册的内容,以便在程序运行期间提供对应的服务,同时还会绑定 HTTP内核及 Console内核到 APP容器。

创建 Laravel应用实例的工作,由 index.ph中的这一行代码来完成:

1 $app = require_once __DIR__.'/../bootstrap/app.php';

接收请求并响应

在完成 Laravel应用实例(即服务容器)的创建后,开始处理请求,生成响应。

1 $kernel = $app->make(Kernel::class);

2

3 $response = tap($kernel->handle(

4 $request = Request::capture()

5 ))->send();

第 1行为内核实例化的过程,在 HTTP内核和 Console内核绑定到了 APP容器之后,使用时通过 APP容器的make()方法将内核解析出来.

第 3行到第 5行为处理 HTTP请求的过程,包含两个阶段:创建请求实例(第 4行),处理请求(第 3-5行)。handle()方法接收一个 HTTP请求,并最终生成一个 HTTP响应。

4.4. 请求流程 69

Page 76: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

发送响应与终止

到这里,对 HTTP请求的响应已经生成了,接下来以 HTTP响应的形式发送给客户端,实现请求生命周期的最后环节。响应的发送是通过“$response->send();”实现的,发送响应由 send()方法完成。

在完成 HTTP响应的发送之后,接下来进入程序生命周期的最后阶段——程序终止,Laravel框架中,程序终止主要是完成终止中间件的调用。Web服务器将等待下一轮用户请求。

本节介绍了请求到响应的整个执行过程,分别是加载项目依赖、创建 Laravel应用实例、接收请求并响应、发送响应与终止。每个阶段都有对应的职责功能,这就是 Laravel框架的整个生命周期过程。

70 Chapter 4. Laravel程序设计

Page 77: Larave-Admin 从入门到进阶

CHAPTER

FIVE

LARAVEL框架初识

5.1 路由的定义与重定向

5.1.1 路由的概念

路由用来将用户的请求按照事先规划好的方案提交给指定的控制器,或者功能函数来进行处理。

简单来说,路由就是访问的地址形式。在我们搭建好 laravel框架后再浏览器输入 localhost为什么就能呈现欢迎界面,这实际上是由于在路由文件中已经定义好了路由,这个路由被称为跟路由。可以看出,路由是外界访问 Laravel应用程序的通路或者说其定义了 Laravel向外界提供服务的具体方式。此处对于概念感到不理解也没有关系,在接下来的路由学习过程中再反复回头来看定义就会发现清晰了很多。

对路由的定义主要在搭建的 laravel框架下的路由文件 routes/web.php内进行。文件具体内容见 5.3目录结构,下述操作都在该路由文件下进行。

5.1.2 路由的定义方式

路由的基本定义方式如图:

可以看见,最简单的路由定义包括了

1. Route::请求方法

2. 请求的 URL路径

3. 闭包或控制器

所有复杂的路由定义都是在这些基本组成成分上做进一步的升华,我们将在路由学习过程中陆续掌握。

71

Page 78: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

URL路径

关于 URL路径在第四章 HELLO WORLD实验中其实就有体现,URL路径的设定帮助人们更好的清晰记住网站而非由一串不规律数字组成的地址。

路由动作(请求方式)

Route::(路由动作)该语法的意义就是匹配某种请求路由,具体有如下几种

1 <?php

2 Route::get(‘/’,function(){});

3 Route::post('/', function () {});

4 Route::put('/', function () {});

5 Route::delete('/', function () {});

此外还可通过 route::any的方式定义一个可以捕获任何请求的路由,一般不建议这样定义。

为了兼顾便利性,我们可以用如 route::match指定请求方式,如这个路由就可以匹配两种请求 Route::match([‘get’,‘post’],‘/’, function () {});

闭包和控制器

闭包应该是在 php学习中就很熟悉的概念了,关于控制器的内容可以参考控制器学习

5.1.3 路由参数

路由参数可以理解为可变的 URL地址段,在路由中定义路由参数后,该值可以传递给闭包,具体可以分为如下几种类型

必选参数

1 <?php

2 Route::get('user/{id}', function (id) { return 'User ' .id;

3 });

在浏览器里访问 user/1就可以得到:User 1;若只输入 user则会报错,参数必选

定义多个参数:

1 <?php

2 Route::ger('posts'/{post},'comments'/{comment},function($postId,$commentId){

3 return $postId. '-'.$commentId;

4 });

72 Chapter 5. Laravel框架初识

Page 79: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

可选参数

可选参数绑定使得路由变得更灵活

1 <?php

2 Route::get('user/{name?}', function ($name = null) { //在参数后加?则为可选参数

3 return ‘name: ’.$name;

4 });

5 //访问 user/ 输出结果 name: //不输入参数则按设定的默认赋值

6 Route::get('user/{name?}', function ($name = 'John') {

7 return $name; //output:John

8 });

9 //访问 user/Olivia 输出结果 name: Olivia //输入参数则赋值给方法

正则约束过滤

关于正则表达式的相关知识见正则表达式利用 where关键字为路由参数设定正则匹配规则,从而起到约束过滤的效果。常见类型如下

1 <?php

2 Route::get('page/{id}', function ($id) {

3 return ' 页面 ID: ' . $id;

4 })->where('id', '[0-9]+');

5

6 Route::get('page/{name}', function ($name) {

7 return ' 页面名称: ' . $name;

8 })->where('name', '[A-Za-z]+');

9

10 Route::get('page/{id}/{slug}', function ($id, $slug) {

11 return $id . ':' . $slug;

12 })->where(['id' => '[0-9]+', 'slug' => '[a-zA-Z]+']);

5.1.4 重定向

应用情形

重定向 (Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。我们在网站建设中,时常会遇到需要网页重定向的情况:

1. 网页被移到一个新地址;

2. 网站调整(如改变网页目录结构);

3. 网页扩展名改变 (如应用需要把.php改成.Html)。

5.1. 路由的定义与重定向 73

Page 80: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

这种情况下,如果不设定重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个 404页面错误信息,丢失访问流量;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

具体实现

1. Meta标签实现

1 <?php

2 if (!empty($url)) //$url 为将重定向到的地址

3 {

4 echo '<meta http-equiv="refresh" content="0;url= $url">'; //表示在当前页面停留 0 秒后跳转到

目标页面

5 }

2. Php页面重定向实现

1 <?php

2 header('Location: https://www.baidu.com'); //location 后有一个空格

3. 利用脚本来实现

1 <?php

2 echo '<script>window.location.href = 'https://www.baidu.com';</script>';

几点提醒

1. 建议删除除此重定向脚本外所有代码。

2. 在新页面上提到用户应更新其链接和书签。

3. 使用此代码创建一个重定向用户的下拉菜单。

5.2 路由命名和分组

5.2.1 路由命名

路由命名可以方便地为指定路由生成 URL或者重定向。通过在路由定义上链式调用 name方法可以指定路由名称。

1 <?php

2 Route::get('user/profile',function(){

(continues on next page)

74 Chapter 5. Laravel框架初识

Page 81: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

3 //闭包行为

4 })->name('profile');

同时可以指定控制器行为的路由名称:

1 <?php

2 Route::get('user/profile',[UserProfileController::class,'show'])->name('profile');

注意:路由器命名必须是唯一的

生成指定路由的 URL

一旦为路由指定了名称,就可以使用全局辅助函数 route来生成链接或者重定向到该路由:

1 <?php

2 //生成链接

3 $url=route('profile');

4

5 //生成重定向

6 return redirect()->route('profile');

如果有定义参数的命名路由,可以把参数作为 route 函数的第二个参数传入,指定的参数将会自动插入到URL中对应的位置

1 <?php

2 Route::get('user/{id}/profile', function ($id) {

3 //

4 })->name('profile');

5

6 $url = route('profile', ['id' => 1]);

如果在数组中传递额外的参数,这些键或值将自动添加到生成的 URL的查询字符串中:

1 <?php

2 Route::get('user/{id}/profile', function ($id) {

3 //

4 })->name('profile');

5

6 $url = route('profile', ['id' => 1,'photos'=>'yes']);

7 // /user/1/profile?photos=yes

5.2. 路由命名和分组 75

Page 82: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

检查当前路由

如果你想判断当前请求是否指向了某个命名过的路由,你可以调用路由实例上的 name方法。例如,你可以在路由中间件中检查当前路由名称

1 <?php

2 public function handle($request, Closure $next)

3 {

4 if ($request->route()->named('profile')) {

5 //

6 }

7

8 return $next($request);

9 }

5.2.2 路由分组

通常,一组路由会有一些特定的特征:比如,一定的认证要求、路径前缀,或者是控制器与命名空间等。在每个路由上反复定义这些共同的特征不仅会显得很烦琐,还可能会改变路由文件的模型并影响应用程序的某些结构。

路由组允许多个路由组合在一起,并且可以将任何共享的配置应用于整个组,从而减少配置信息的重复。此外,这些路由会被组合在一起,所以路由组也是未来开发者的可视化提示。

要将两个或多个路由组合在一起,需要将路由的定义放在路由组里面。实际上,这是将闭包传递给路由组定义,并在闭包中定义分组的路由。

1 <?php

2 Route::group([],function(){

3 Route::get('hello',function(){

4 return 'Hello';

5 });

6

7 Route::get('world',function(){

8 return 'World';

9 });

10 });

11 //路由组中的第一个参数为空数组,该空数组允许传递各种配置信息,这些配置将对该组内的所有路由生效

路由组最常见的功能就是将中间件应用于一组路由中,但是在其他方面,路由组在 Laravel中也常常被应用在权限控制方面,比如,对用户进行验证以及对访客用户使用网站的某些内容进行限制等。

在示例中,将 dashboard 与 account 组成一个路由组,并且为该路由组建立一个中间件 auth,auth 中间件是laravel自带的用户认证中间件。此时该中间件对 dashboard与 account这两者都会生效。在此示例中,表示用户必须登录后才能查看控制中心(dashboard)或账户页面(account)。

76 Chapter 5. Laravel框架初识

Page 83: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

1 <?php

2 Route::group(['middleware'=>'auth'],function(){

3 Route::get('dashboard',function(){

4 return view('dashboard');

5 });

6 Route::get('account',function(){

7 return view('account');

8 });

9 });

路径前缀

如果有一组路由需要共享某个路径段,可以用路由组简化此结构

1 <?php

2 Route::group(['prefix'=>'api'],function(){

3 Route::get('/',function(){

4 //设置路径为 /api

5 });

6 Route::get('users',function(){

7 //设置路径为 /api/users

8 });

9 });

子域名路由

子域名路由与路由前缀一样,但是作用域不同:子域名路由的作用域是子域名,而不是路由前缀。这主要有两个作用。首先,可以在不同的子域名中展示应用程序中的不同部分(或完全不同的应用程序)。

1 <?php

2 Route::group(['domain'=>'api.myapp.com'],function (){

3 Route::get('/',function(){

4 //

5 });

6 });

其次,可以将子域名的某一部分设置为参数。通常,这在多租户技术的案例中用的比较多(例如 Slack 或Harast,其实每个公司都有自己的子域名,例如 tighten.slack.co)。

1 <?php

2 Route::group(['domain'=>'{account}.myapp.com'],function(){

3 Route::get('/',function($account){

(continues on next page)

5.2. 路由命名和分组 77

Page 84: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

4 //

5 });

6 Route::get('users/{id}',function ($account,$id){

7 //

8 });

9 });

需要注意的是,路由组中的任何参数都将通过第一个参数传递到路由组内各路由的方法中。

命名空间前缀

当按照子域名或者路由前缀的方式对路由进行分组时,它们的控制器可能会有相同的 PHP命名空间。在 API的示例中,所有的 API路由的控制器都可能在一个 API命名空间内。通过使用路由组命名空间前缀,就可以避免在群组内使用很长的控制器进行引用,如”API/ControllerA@index”以及”API/ControllerB@index”。

1 <?php

2 // App\Http\Controllers\ControllerA

3 Route::get('/','ControllerA@index');

4

5

6 Route::group(['namespace'=>'API'],function(){

7 // App\Http\Controllers\API\ControllerB

8 Route::get('api/','ControllerB@index');

9 });

名称前缀

前缀并不仅局限于此。通常,路由名称会反映路径元素的继承链(inheritance chain),因此,users/comments/5将会由名为 users.comments.show的路由实现。在这种情况下,在 users.comments资源下面的所有路由中使用路由组是很常见的。就像可以使用前缀 URL字段和控制器命名空间一样,也可以在路由名称前面加上前缀字符串。使用路由组名称前缀,可以定义该组中的每个路由,让它们都有一个给定的字符串作为其名称前缀。在这种情况下,我们会将前缀“users.”添加到每个路由名称前,然后添加“comments.”。

1 <?php

2 Route::group(['as'=>'users.','prefix'=>'users'],function(){

3 Route::group(['as'=>'comments.','prefix'=>'comments'],function(){

4 //路由名称将是 users.comments.show

5 Route::get('{id}',function(){

6 //

7 })->name('show');

8 });

9 });

78 Chapter 5. Laravel框架初识

Page 85: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

5.3 目录结构

Laravel默认的目录结构试图为不管是大型应用还是小型应用提供一个良好的起点。同时通过对项目目录结构的研究,有利于我们迅速的掌握框架各个目录所完成的具体功能。

通过这种规范的目录结构,可以更好地实现文件的自动加载和分类。当然,我们也可以按照自己的要求自由地组织 Laravel框架的结构。Laravel对于指定类志在何处被加载没有任何限制,只需要 Composer实现自动加载。

5.3.1 根目录

默认的 Laravel框架应用程序是符合规范的,所以相应的目录结构也是固定的,不同目录加载了不同的功能文件。Laravel框架根目录组织结构如下:

下面,我们将依个对 Laravel应用的目录结构进行说明解释,有利于迅速掌握框架各个目录所完成的具体功能。

表- Laravel应用的目录结构说明

根目录 说明 功能

app 应用目录 存放应用的核心代码,用户构建应用的大部分工作都在这个目录下进行。包括路由文件、控制器文件、模型文件等

bootstrap 启动目录 存放 Laravel框架启动和自动加载配置的文件config 配置目录 存放应用常用的配置文件信息

database 数据库目录 存放数据迁移和数据填充文件

public 对外公开目录

应用的入口目录,存放应用入口文件 index.php,以及静态资源文件(CSS、Javascript、images等)

resources 资源目录 存放非 PHP资源文件,如视图模板、语言文件等routes 路由目录 存放了应用定义的所有路由

storage 文件存储目录

存放编译后的 Blade视图模板、基于文件的 session、文件缓存和日志等文件

tests 测试目录 存放自动化测试文件

vendor Vendor目录 存放依赖库文件,通过 composer安装的依赖包。其中包含 Laravel框架源代码

另外地,以下这三个文件也都实现了不同的功能:

• .env文件:主要设置一些系统相关的环境配置文件信息

• artisan(脚手架)文件:主要用于生成的代码,比如生成控制器,模型文件等

• composer.json文件:依赖包配置文件,声明当前需要的软件依赖

5.3. 目录结构 79

Page 86: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 1: 图 5-3-1 Laravel框架的根目录结构

80 Chapter 5. Laravel框架初识

Page 87: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

5.3.2 app目录介绍

应用的核心代码、大部分代码都存放在 app目录下,该目录位于命名空间 App下,通过 composer来自动加载其中的文件。在使用 Laravel框架开发项目时,几乎大部分的新开发功能也会放置在这个目录下。下面介绍app目录下的组织结构。

1. 子目录

Fig. 2: 图 5-3-2 app目录下的子目录结构

• Console:包含应用所有自定义的 Artisan命令

• Exceptions:包含应用的异常处理器,同时还是处理应用抛出的任何异常的地方

• Http:包含了控制器、中间件以及表单请求等,是应用与 Laravel框架源代码等外部库交互的地方

• Models:包含了所有的 Eloquent模型类文件

• Providers:包含应用的服务提供者的相关文件

2. 其他目录

其他目录默认不存在,会在通过 Artisan命令 make生成相应类的时候自动生成到 app目录下。

• Events:存放与事件相关的类

• Jobs:存放消息队列任务

• Listeners:存放监听事件类文件

• Broadcasting:存放所需的所有广播频道类

• Mail:存放应用所有邮件相关类

• Policies:存放应用所有的授权策略类

• Rules:存放应用的自定义验证规则对象

5.3. 目录结构 81

Page 88: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

5.4 MVC架构

5.4.1 简介

架构模式是一个通用的、可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题。架构模式与软件设计模式类似,但具有更广泛的范围。

MVC(Model View Controller)是软件工程中的一种软件架构模式,它把软件系统分为模型(M)、视图(V)和控制器(C)三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。此模式透过对复杂度的简化,使程序结构更加直观。

MVC架构是交互式应用中广泛使用的架构。实现一种动态的程序设计,使程序结构更加直观。

5.4.2 MVC部件

模型(Model)

模型是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。

模型接受视图请求的数据,并返回最终的处理结果。

在 Laravel中,模型就是一个快速操作数据库(准确的说是对应的数据表,一个模型对应一个数据表)的方法,可以实现增删改查等操作。

视图(View)

视图是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。

视图是是应用中处理响应给客户端的页面的部分,用于跟用户进行交互。

控制器(Controller)

控制器是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。

下面,我们将从流程上来理解 MVC架构的工作模式和运行过程,更好地明白每个 MVC部件在工作模式中起到的作用和实现的功能。

82 Chapter 5. Laravel框架初识

Page 89: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 3: 图 4.2.1 MVC架构的工作模式

5.4. MVC架构 83

Page 90: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

5.4.3 MVC的基本使用

通过对MVC架构模式有了一定的了解认识,本节将介绍MVC架构模式在 Laravel中的基本使用。

1. 注册路由

在第一节中,我们已经介绍过路由的命名和基本使用方法。下面,我们将在路由文件 my-laravel-app/app/Http/routes.php 中注册一个新的路由。双击进入到文件 routes.php 下,添加如下列程序清单所示的第 4行、第 10行代码:

1 <?php

2

3 use Illuminate\Support\Facades\Route;

4 use App\Http\Controllers\MVCController;

5

6 Route::get('/', function () {

7 return view('welcome');

8 });

9

10 Route::get('/MVC', [MVCController::class, 'index']);

在这里,引入了MVC控制器命名空间;定义注册了一个路由,匹配方法为 get,跳转路径 URL为 /MVC,调用了MVCController控制器中的 index方法。

2. 创建控制器

在 Laravel中创建控制器由两种方式,分别是手动创建和 artisan命令行工具创建。在这里,我们介绍用 artisan命令行工具创建MVCController控制器。

首先进入 laradock容器的工作区并运行创建控制器指令,然后保持命令行运行,不要关闭。

1 docker-compose exec --user=laradock workspace bash //进入工作区指令

2

3 php artisan make:controller MVCController //创建控制器指令

如下图所示,则说明已进入工作区,并成功创建了一个MVCController控制器。

Fig. 4: 图 4.2.2成功创建MVCController控制器

在以上步骤都顺利完成后,双击打开 app/Http/Controllers/MVCController.php文件,添加如下列程序清单所示的第 3-5行代码,下面按照顺序对这些语句进行解释:

(1)第 1行代码:定义类MVCController继承基类 Controller

(2)第 3至第 5行代码:声明 index函数

84 Chapter 5. Laravel框架初识

Page 91: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(3)第 4行代码:结果返回调用模型MVC.php中的 index函数

1 class MVCController extends Controller

2 {

3 public function index(){

4 return MVC::index();

5 }

6 }

3. 创建模型

创建模型,首先我们新建一个MVC模型,命令行工作区下运行指令:

1 php artisan make:model MVC

Fig. 5: 图 4.1.3创建模型

创建完成后,双击打开 app/Models/MVC.php,添加如下列程序清单所示的第 3-6行代码。

1 class MVC extends Model

2 {

3 public static function index()

4 {

5 return view("MVC");

6 }

7 }

4. 创建视图

完成了以上步骤,最后我们需要创建一个MVC视图。双击打开 resources/views,新建一个 PHP文件,文件名为MVC.blade.php。

完成视图创建后,在视图文件中添加以下语句:

1 这是 MVC 架构!

以上步骤完成,自此完成了一个基本MVC架构的搭建。下面访问地址 http://localhost/MVC,如图所示。

5.4. MVC架构 85

Page 92: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 6: 图 4.2.4新建MVC视图

Fig. 7: 图 4.2.5 MVC运行结果

86 Chapter 5. Laravel框架初识

Page 93: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

5.5 服务容器

5.5.1 简介

在 Laravel框架中,服务容器是整个系统功能调度配置的核心是 Laravel框架的“心脏”所在,因为它提供了整个框架运行过程中需要的一系列服务。

服务容器从程序角度上难以理解其功能含义,只需从字面上理解。容器是用来装东西的器皿,而服务容器是用来装服务的。

在 Laravel中,我们可以将服务理解为系统运行中需要的东西,如对象、文件路径、系统配置等,服务容器就是这些东西的载体,在程序运行过程中动态地提供这些服务,提供这些资源。

5.5.2 控制反转和依赖注入

说到服务容器,服务容器有两个重要概念 IOC(控制反转)和 DI(依赖注入)。

这两者目的是为了降低软件开发的复杂度,是提升模块低耦合、高内聚的一种设计模式。

• 控制反转:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

• 依赖注入:应用程序依赖容器创建并注入它所需要的外部资源。

1. 控制反转

控制反转的作用就是实现模块或对象的解耦,将组件间的依赖关系从程序内部提到外部容器 Ioc 容器来管理。。

引入了 IoC容器后,对象 A、B、C、D之间没有了依赖关系,这时候控制权属于 IoC容器。即控制权反转了,从某个对象类转到了 IoC容器。

Fig. 8: 图 5-5-1控制反转

2. 依赖注入

5.5. 服务容器 87

Page 94: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

对于依赖注入,首先要明白依赖是一种关系。

当在类 A中创建了类 B的实例,就可以说 A依赖于 B。这时候会存在改变实例化的对象类 B时,需要去到类 A中修改的耦合问题。

所以,将类 B实例作为类 A构造器参数进行传入,而不是直接在类 A中实例化。转由外部传入依赖对象,通过动态注入的方式实现,这就是依赖注入。

Fig. 9: 图 5-5-2依赖注入

解释完服务容器的主要作用 IOC(控制反转)和 DI(依赖注入),下面将介绍服务容器的使用。

5.5.3 服务绑定

在服务容器生成后,首先要做的就是向其中装服务,也就是所谓的服务绑定,服务容器绑定都是在服务提供者中完成。

在服务提供器中,总是可以通过 $this->app属性访问容器。

1. 简单绑定

使用 bind方法注册一个绑定,该方法需要两个参数,第一个参数是想要注册的类名或接口名称,第二个参数是返回类的实例的闭包:

1 $this->app->bind('HelpSpot\API', function ($app) {

2 return new HelpSpot\API($app->make('HttpClient'));

3 });

2. 绑定单例

singleton方法绑定一个只会解析一次的类或接口到容器,然后接下来对容器的调用将会返回同一个对象实例:

88 Chapter 5. Laravel框架初识

Page 95: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

1 $this->app->singleton('HelpSpot\API', function ($app) {

2 return new HelpSpot\API($app->make('HttpClient'));

3 });

3. 绑定实例

instance方法绑定一个已存在的对象实例到容器,随后调用容器将总是返回给定的实例:

1 $api = new HelpSpot\API(new HttpClient);

2 $this->app->instance('HelpSpot\API', $api);

4. 绑定基本值

当有一个类不仅需要接受一个注入类,还需要注入一个基本值(比如整数)。可以使用上下文绑定来轻松注入这个类需要的任何值:

1 $this->app->when('App\Http\Controllers\UserController')

2 ->needs('$variableName')

3 ->give($value);

5.5.4 服务解析

前面介绍了服务绑定的内容,当服务已经绑定到服务容器之后,就可以在之后随时获取,称为服务解析。

make方法可以从容器中解析对象,接收想要解析的类名或接口名作为参数。

如果所在的代码位置访问不了 $app变量,可以使用辅助函数 resolve。

某些类的依赖不能通过容器来解析,可以通过关联数组方式将其传递传递到 makeWith方法来注入。

1 $api = $this->app->make('HelpSpot\API'); //make 方法

2

3 $api = resolve('HelpSpot\API'); //辅助函数 resolve

4

5 $api = $this->app->makeWith('HelpSpot\API', ['id' => 1]); //关联数组 makewith

5.5.5 容器事件

服务容器每次解析对象时会触发一个事件,可以使用 resolving方法监听这个事件:

1 $this->app->resolving(function ($object, $app) {

2

3 });

4

5 $this->app->resolving(HelpSpot\API::class, function ($api, $app) {

(continues on next page)

5.5. 服务容器 89

Page 96: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

6

7 });

5.6 请求处理管道介绍

90 Chapter 5. Laravel框架初识

Page 97: Larave-Admin 从入门到进阶

CHAPTER

SIX

LARAVEL框架之控制器

6.1 控制器路由 (控制器和路由之间如何关联,控制器和路由如何传递数据,控制器和视图如何传递数据)

6.1.1 控制器和路由之间的关联方式(绑定)

1. 首先定义控制器

1 <?php

2

3 use App\Http\Controllers\Controller;

4

5 class TasksController extends Controller //控制器名称:TasksController

6 {

7 public function home()

8 {

9 return 'Hello, World!'; //控制器功能

10 }

11 }

2. 绑定

1 <?php

2

3 Route::get('/', 'TasksController@home');

这样就可以通过访问/路由看到返回的内容:Hello,World!

91

Page 98: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

6.1.2 控制器和路由如何传递数据

与路由传递参数形式大致相同,在路由定义处定义参数

先定义路由器

1 <?php

2 Route::get('/{id}/{password}', 'TasksController@home');

再在控制器处对数据进行处理

1 <?php

2 namespace App\Http\Controllers;

3

4 use App\Http\Controllers\Controller;

5

6 use App\Models\User;

7

8 class TasksController extends Controller

9 {

10 public function home($id,$password)

11 {

12 echo "hello $id";

13 }

14 }

6.1.3 控制器传值到视图中

要传值到视图中,可以在控制器中这样操作:

1 <?php

2 namespace App\Http\Controllers;

3

4 use App\Http\Controllers\Controller;

5

6 use App\Models\User;

7

8 class TasksController extends Controller

9 {

10 public function home()

11 {

12

13 return view('helloworld', ['test1' => ' 测试 1','test2' => ' 测试 2','test3' =>

↪→' 测试 3']);

(continues on next page)

92 Chapter 6. Laravel框架之控制器

Page 99: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

14

15 //在 view() 方法中添加第二个参数,第二个参数为需要传进视图的数据,若数据有多个,可以

16 //像举例一样使用数组,若只有一个数据可以使用 with()

17 //举例:view('helloworld')->with('test1',' 测试 1'); 此时变量$test1= 测试 1

18

19 }

20 }

在视图中:

1 <?php

2 echo '$test1';

即可输出数据

6.2 资源控制器

6.2.1 资源控制器的概念

资源控制器是 Laravel控制器的一种,具有索引、创建、存储、编辑、更新和删除资源(或模型)的所有方法。

资源控制器可以让我们很便捷地构建基于资源的 RESTful 控制器。RESTful 是一种接口设计的思想和规范,REST (Represesntational State Tranfer)意为“表现状态转化”,Laravel的 RESTful控制器支持了这一接口规范。

6.2.2 与普通控制器的区别

资源控制器和普通控制器相比,创建后的初始普通控制器不含有任何方法功能,需要逐个添加方法。

1 <?php

2

3 namespace App\Http\Controllers;

4

5 use Illuminate\Http\Request;

6

7 class PostController extends Controller

8 {

9 //添加方法

10 }

在普通控制器添加方法后,需要在 routes/web.php中像这样定义指向该控制器方法的路由:

6.2. 资源控制器 93

Page 100: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

1 <?php

2 Route::请求方法(' 指向路径', [PostController::class, ' 添加的方法名']);

而资源控制器自从创建开始,便具有索引、创建、存储、显示、编辑、更新和删除功能。

1 <?php

2 namespace App\Http\Controllers;

3

4 use Illuminate\Http\Request;

5

6 class PostController extends Controller

7 {

8 public function index()

9 {

10 //索引

11 }

12

13 public function create()

14 {

15 //创建

16 }

17

18 public function store(Request $request)

19 {

20 //存储

21 }

22

23 public function show($id)

24 {

25 //显示

26 }

27

28 public function edit($id)

29 {

30 //编辑

31 }

32

33

34 public function update(Request $request, $id)

35 {

36 //更新

37 }

38

39 public function destroy($id)

(continues on next page)

94 Chapter 6. Laravel框架之控制器

Page 101: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

40 {

41 //删除

42 }

43 }

在资源控制器创建后,只需要通过 resource方法为该控制器注册一个资源路由,其中包含了处理资源对应方法的多个路由。

1 <?php

2 Route::resource(' 指向路径', \App\Http\Controllers\PostController::class);

资源控制器方法列表

请求方法 URL 控制器方法 路由命名

GET /photos index photos.indexGET /photos/create create photos.createPOST /photos store photos.storeGET /photos/{photo} show photos.showGET /photos/{photo}/edit edit photos.editPUT/PATCH /photos/{photo} update photos.updateDELETE /photos/{photo} destroy photos.destroy

6.2.3 资源控制器的使用

创建资源控制器

首先,需要通过 Artisan命令创建一个资源控制器。

基本资源控制器

使用 Artisan命令 make:controller可以快速创建这样一个资源控制器:

1 php artisan make:controller PhotoController --resource

这个命令将会生成一个控制器 app/Http/Controllers/PhotoController.php,其中包括每个可用资源操作的方法,具体生成控制器的代码如上小节所示。

指定模型资源控制器

如果使用了路由模型绑定,并且想在资源控制器的方法中使用类型提示,可以在生成控制器的时候使用–model选项:

1 php artisan make:controller PhotoController --resource --model=Photo //生成绑定 Photo 模

型的控制器

6.2. 资源控制器 95

Page 102: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

API资源控制器

要快速生成不包含 create或 edit方法的用于开发接口的资源控制器,要在执行make:controller命令时使用–api参数:

1 php artisan make:controller API/PhotoController --api

注册路由

接下来,需要给控制器注册一个资源路由:

单个资源控制器路由

1 <?php

2 Route::resource('photos', PhotoController::class);

多个资源控制器路由

也可以通过将数组传参到 resources方法中的方式来一次性的创建多个资源控制器路由:

1 <?php

2 Route::resources([

3 'photos' => PhotoController::class, //PhotoController 资源控制器

4 'posts' => PostController::class, //PostController 资源控制器

5 ]);

这些方法将创建方法列表里七种控制器方法对应的路由。

当然也可以自定义,保留所需的某些路由,去掉不需要的路由。

1 <?php

2 Route::resource('photos', PhotoController::class)->only([

3 'index', 'show' //保留 index,show 方法路由

4 ]);

5

6 Route::resource('photos', PhotoController::class)->except([

7 'destroy' //去掉 destroy 方法路由

8 ]);

单个 API资源

当声明用于 APIs的资源路由时,通常需要排除显示 HTML模板的路由(如 create和 edit)。为了方便起见,可以使用 apiResource方法自动排除这两个路由:

1 <?php

2 Route::apiResource('photos', PhotoController::class);

96 Chapter 6. Laravel框架之控制器

Page 103: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

多个 API资源

也可以传递一个数组给 apiResources方法来同时注册多个 API资源控制器:

1 <?php

2 Route::apiResources([

3 'photos' => PhotoController::class,

4 'posts' => PostController::class,

5 ]);

嵌套资源

有时可能需要定义一个嵌套的资源型路由。例如,照片资源可能被添加了多个评论。那么可以在路由中使用“.”符号来声明资源型控制器:

1 <?php

2 Route::resource('photos.comments', PhotoCommentController::class);

该路由会注册一个嵌套资源,可以使用如下 URI访问:

1 /photos/{photo}/comments/{comment}

命名资源路由

默认情况下,所有资源控制器动作都有一个路由名称,不过,我们可以通过传入 names数组来覆盖这些默认的名称:

1 <?php

2 Route::resource('photos', PhotoController::class)->names([

3 'create' => 'photos.build'

4 ]);

命名资源路由参数

默认情况下,Route::resource会根据资源名称的「单数」形式创建资源路由的路由参数。你可以在选项数组中传入 parameters参数来轻松地覆盖每个资源。parameters数组应该是资源名称和参数名称的关联数组:

1 <?php

2 Route::resource('users', AdminUserController::class)->parameters([

3 'users' => 'admin_user'

4 ]);

资源的 show路由生成如下的 URI:

1 /users/{admin_user}

本地化资源 URI

6.2. 资源控制器 97

Page 104: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

默认情况下,Route::resource将会用英文动词创建资源 URI。如果需要自定义 create和 edit行为的动作名,可以在 AppServiceProvider的 boot中使用 Route::resourceVerbs方法实现:

1 <?php

2 use Illuminate\Support\Facades\Route;

3

4 public function boot()

5 {

6 Route::resourceVerbs([

7 'create' => 'crear',

8 'edit' => 'editar',

9 ]);

10 }

资源控制器补充

如果需要增加额外的路由到默认的资源路由之中,需要在 Route::resource前定义它们;否则,resource方法定义的路由可能会无意间优先于定义的路由:

1 <?php

2 Route::get('photos/popular', [PhotoController::class, 'popular']);

3

4 Route::resource('photos', PhotoController::class);

98 Chapter 6. Laravel框架之控制器

Page 105: Larave-Admin 从入门到进阶

CHAPTER

SEVEN

LARAVEL框架之数据库与模型

7.1 laravel数据库配置

7.1.1 数据库简介

归根结底,Web系统的开发就是对数据的操作,或者说是围绕数据库的程序设计。PHP在开发Web站点或一些管理系统时,需对大量的数据进行处理,虽然 XML文件或者文本文件也可以作为数据的载体,但不易进行管理和对大量数据的存储,所以在项目开发时,数据库就显得非常重要。

简单地说,数据库 DB (Database)就是一组经计算机整理后的,保存一系列有组织的数据的容器/仓库,而管理这个数据库的软件就称为数据库管理系统 DBMS (Database Management System),

我们这里所讲的学习数据库,实际上是指学习数据库管理系统 DBMS。

MySQL数据库可以称得上是目前运行速度最快的 SQL语言数据库之一,也是本章的重点学习内容。

7.1.2 数据库配置

1. 创建账户

打开 Navicat for MySQL,创建一个账户

2. 拥有一个数据库

在 laradock时已经自动创建好了 default数据库等,数据在数据库中以表的形式存储在数据库中

1. DBMS-DB连接

首先确保服务器开启,如图点击打开左上角的“链接”,显示如图界面,设定连接名,连接名可以根据需求自由设定,密码默认为 root或 123456

成功连接后可以看到如图界面,连接名下有若干个数据库,其中就包含了 default数据库,各个数据库中又包含了若干个表存储数据

4. laravel连接数据库

99

Page 106: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 1: 图 7.1.1 DBMS-DB连接

100 Chapter 7. Laravel框架之数据库与模型

Page 107: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 2: 图 7.1.2连接成功

7.1. laravel数据库配置 101

Page 108: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 3: 图 7.1.3数据库中的表

102 Chapter 7. Laravel框架之数据库与模型

Page 109: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

回忆最初我们搭建环境时更改了 laravel文件中的.env文件,其实就是将框架连接上创建 laradock时同时创建的名为 default的数据库。

Fig. 4: 图 7.1.5 laravel链接数据库

7.1.3 表的创建

表的创建可以是如图自己手动规定其中包含的内容并输入数据

Fig. 5: 图 7.1.5表

命名表时建议以复数形式命名。另一种更快捷常用的方式是直接导入 sql表,具体的操作参考数据库连接

7.1. laravel数据库配置 103

Page 110: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

主键:对于关系表有个很重要的约束,就是任意两条记录不能重复即指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。因此,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。作为主键最好是完全业务无关的字段,我们一般把这个字段命名为 id。

7.1.4 简单测试

新建控制器 DataController用以结合路由来管理 laravel所连接的数据库中的数据(表)

1 <?php

2

3 namespace App\Http\Controllers;

4

5 use Illuminate\Http\Request;

6 use Illuminate\Support\Facades\DB; //引用 DB 类

7

8 class DataController extends Controller

9 {

10 public function index(){

11 //此处可先忽略具体语法,着重体会数据库与 Laravel 的关系

12 $user = DB::select('select * from students'); //从已连接的 default 数据库中找到表

students 并读取所有数据(*)

13 return [$user];} //返回数据

14 }

路由文件定义路由

Route::get('data',[DataController::class,'index']); //定义路由

结果所有数据展示如图

由此可见,有了数据库的引入,我们可以不用再像学习控制器和视图章节时那样只使用假数据了,而是可以通过数据库来实现真实的变动的数据的管理操作,而下一节所讲的模型就是这个过程中的一个很好的工具。

7.2 laravel数据库与模型

在第 4章的框架初始中已简单提到了MVC模型中M(model)的概念。在学习本章第一节以对数据库有了一定的概念了解后,就能很好的理解模型的意义了。

我们已经知道数据在数据库中以表的形式存储在数据库中,而模型就是一个快速操作数据库中的数据表的方法,以协助实现数据的快速操作。可以利用模型结合一些自己想要的操作对数据表进行快速的增删改查等操作。

模型存储在 App/Model目录下,User是 laravel自带的一个已建立好的模型。

104 Chapter 7. Laravel框架之数据库与模型

Page 111: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 6: 图 7.1.6测试结果

7.2. laravel数据库与模型 105

Page 112: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 7: 图 7.4.1模型

106 Chapter 7. Laravel框架之数据库与模型

Page 113: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

前面提到,一个模型对应一个表,因此在创建一个新的模型时就建立起了该模型与数据库中表的联系了。最初情况下,模型会默认的与以模型名复数为名的表进行连接,也即表 users,这也是为什么我们在最初打开已连接的 DB时看到有一张自带的表 users,这是因为有一个已创好的模型 User,该模型自动连接了已建立的users表,避免因未设置连接表名而连接不到表的情况。因此在上一章表的创建时我们建议以复数形式命名表,道理就在这了。

如果你想将该模型连接到你指定的表而非以模型名复数为名的表,则可以在模型中定义 $table

protected $table='students'; //连接到表 students,后续操作中就不需像构造器那样输入表名了

7.2.1 简单测试

同创建控制器一样,利用指令创建一个名为 student的模型,由于没有 $tabel指令,默认该模型连接表 students。

php artisan make:model student //创建一个名为 student 的模型

Fig. 8: 图 7.4.1模型的创建

新建控制器 modelController用以结合路由来管理 laravel所连接的数据库 default中的 students表

1 <?php

2

3 namespace App\Http\Controllers;

(continues on next page)

7.2. laravel数据库与模型 107

Page 114: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

4

5 use Illuminate\Http\Request;

6 use App\Models\Student; //引用 Student 模型

7

8 class modelController extends Controller

9 {

10 public function index(){

11 $students=Student::all(); //直接引用 Student 模型,表示从该模型对应的表取出所有数据赋

给变量$students

12 dd($students);

13 }

14 }

在控制器中利用模型管理数据时要 use引用对应模型

Fig. 9: 图 7.4.1对应模型的引用

路由文件定义路由

Route::get('model',[modelController::class,'index']); //定义路由

利用模型后,结果所有数据展示如图,思考对比一下使用模型和上一节中没使用模型有什么区别。

108 Chapter 7. Laravel框架之数据库与模型

Page 115: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 10: 图 7.1.6测试结果

7.2. laravel数据库与模型 109

Page 116: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

7.3 数据管理——基于模型的增删改查

模型不过是数据管理的另一种方式,在前面几节学过原生 SQL语句以及一些构造器之后,模型的使用就很好理解了。

模型存储在该目录下,User是 laravel自带的一个已建立好的模型。在控制器中运用模型管理数据时要 use引用

Fig. 11: 图 7.4.1模型

最初情况下,该模型内没有定义 $table,模型会默认的与以模型名复数为名的表进行连接,也即表 users,这也是为什么我们在最初打开已连接的 DB时看到有一张自带的表 users,就是为了避免因未设置连接表名而连接不到表的情况。

本节中继续利用表 students作为学习工具,因此要在使用的模型亦即 User中定义 $table,输入以下语句

protected $table='students'; //连接到表 students,后续操作中就不需像构造器那样输入表名了

7.3.1 数据查询

在定义 $table后,可以通过简单的模型查看所有数据

$students=User::all(); //$students=User::get() 也可以

dd($students);

如开篇所说,模型跟构造器很像,也都是能够添加限制条件显示数据

1 $students = User::where([

2 ['gender',' 女'],

(continues on next page)

110 Chapter 7. Laravel框架之数据库与模型

Page 117: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

3 ['number','>',111]

4 ])->limit(2)->get(); //仅输出两个符合该条件的数据

5 dd($students);

6 //其他的查询细节就不在这一一赘述,根据需求参考构造器或者搜索有关内容即可

7.3.2 数据增添

User模型中默认设定了一些会自动添加的项,这时候如果与数据库的表所含有的项不一致时就会出现问题。首先来看一段代码,代码本身便是利用模型增添数据的标准形式。

save()方法

1 $students = new User(); //新建类后输入相应数据

2 $students->name=' 弗拉基米尔';

3 $students->gender=' 男';

4 $students->age=27;

5 $students->save(); //save()

运行该代码会发现报了如下错误

Fig. 12: 图 7.4.2代码运行结果

可以看到这里出现了我们代码中并没有输入的值,说明是User模型中自动帮我们添加了这样两项数据 (创造、更新时间),但是我们的表中并没有这两项,或者说,字段名不一样,这就造成了如图的报错信息。对这样的情况可以有两种解决方法。

1. 如果你是需要这样的默认数据的,只是因为你所创建的表中字段名与默认字段名不一致导致的报错,则可以输入以下代码以更改模型中的默认字段名。

const CREATED_AT = 'createDt'; //createDt 即是你需要改成的与你所创建的表一致的字段名

const UPDATED_AT = 'updateDt';

2. 如果并不需要默认添加这样的数据,则可以在模型中输入以下代码以取消掉模型的这一默认操作

public $timestamps = false;

7.3. 数据管理——基于模型的增删改查 111

Page 118: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

create()方法

再来看另一种方式添加数据,如下代码即使标准的 create方法使用

1 User::create([

2 'name' => ' 迦娜',

3 'gender'=> ' 女'

4 ]);

运行程序后结果如图。代码中输入的 gender最后并未添加到数据库中

Fig. 13: 图 7.4.3代码运行结果

这涉及到了 Laravel模型的 fillable (白名单)和 guarded (黑名单)属性,他限制了一些允许填入的项和不允许的信息,这是为了防止意外改动了重要信息,可以看到模型 User里允许 name输入因此 name能正常添加,而gender并未出现在白名单上,因此被忽略了。因此我们可以根据需求人为的在模型中进行设定

7.3.3 数据更新更改

save()方法

1 //若数据已经存在则自动更新相异的内容,否则新建数据

2 $students = User::find(4);

3 $students ->gender = ' 男';

4 $students ->save();

112 Chapter 7. Laravel框架之数据库与模型

Page 119: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

update()方法

1 User::where('name',' 嘉文四世')

2 ->update([

3 'number'=> 996,

4 'age' => 40,

5 ]);

7.3.4 数据删除

delete()方法

1 $students = User::find(2);

2 $students -> delete();

3

4 //批量删除

5 $students = User::where('age',40);

6 $students -> delete();

7

8 destroy(id) 方法

9 //通过主键删除免去了查询操作

10 User::destroy(12);

软删除

软删除与我们之前所讲的真实的删除不一样,并非真的删除了,只是隐藏了数据。

软删除功能的开启需要在模型中设置

//User 类外部引入

use Illuminate\Database\Eloquent\SoftDeletes;

//User 类内部开启使用软删除功能

use SoftDeletes;

开启了软删除功能后,删除操作语法一样,但是都变成了软删除。与数据更新类似,软删除会自动产生一个赋值操作,这时候如果数据库的列中没有 deleted_at字段则会报错,在数据库中添加这一字段后,我们通过一个简单测试来更加清晰的认识软删除。

$student = User::find(45);

$student ->delete(); //软删除 id 为 45 的数据

//也可以通过 destory 方法删除 User::destroy(45);

软删除后查询结果代码及结果如图。可以看到,被软删除的数据自动隐藏,无法正常查看 (find返回为 null),但是在数据库中仍可以看见该数据,同时自动的添加了软删除的时间。

7.3. 数据管理——基于模型的增删改查 113

Page 120: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

既然软删除后的仍能在数据库中看到,很容易想到,就像是文件删除后可以在回收站中看见并恢复一样,这样的数据应该也是能够重新恢复的

$student = User::onlyTrashed()->find(45);

$student->restore(); //还原后可以重新尝试查询,此时查询就会有结果

若在开启软删除后,需要真实的永久删除一项数据,可使用 forceDelete()方法

$student = User::onlyTrashed()->find(45);

$student ->forceDelete();//真实删除后数据库中改数据也会消失

下面介绍一些操作或指定软删除数据的语法

//withTrashed() 方法获取包含软删除的数据 (即所有数据)

$students = User::withTrashed()->all();

dd($students);

//onlyTrashed() 方法获取所有软删除的数据 (仅软删除数据)

$students = User::onlyTrashed()->get();

dd($students);

//trashed 方法判断改数据是否被软删除

$student = User::withTrashed()->find(45);

return $student->trashed();

114 Chapter 7. Laravel框架之数据库与模型

Page 121: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

7.4 数据管理——基于构造器的数据查询

7.4.1 引入

数据库有一个专用类 DB。use Illuminate/Support/Facades/DB;

可以用它来实现原生查询和构造器查询。

本章第一节中的简单测试实际上就是利用了最简单的原生查询,这显然不足以满足我们对于数据管理的诸如分类查询,特定数据查询等需求,而构造器能帮我们很好的实现这些需求。

7.4.2 简单的查询构造器

//以下示例皆省去输出语句 return [$user]。建议在自己建立数据库的基础上尝试下列语句

$user = DB::select('select * from students'); //原生 SQL 返回所有数据

$users = DB::table('students')->get(); //构造器 get 方法获取表 students 中所有数据

$user = DB::table('students')->find(3); //读取该表中的序号为 3 的信息

$users = DB::table('students')->pluck('name', 'gender'); //pluck(字段名) 获取所有特定数据

(单列值) 的集合

DB::table('students')->orderBy('id')->chunk(3,function($students){

foreach($students as $student)

{

echo $student->name; //在该表中按照 id 的顺序,每 3 位 (可更改) 输出一次,切割分块执行

能在大批量数据读取时更清晰显示

}

echo '<br>';

});

return DB::table('students')->avg('number'); //类似的还有 count()、max()、min()、

sum() 等聚合查询

if (DB::table('orders')->where('finalized', 1)->doesntExist())

{

//... //exist 和 doesntExist 方法判断查询结果是

否存在

};

7.4. 数据管理——基于构造器的数据查询 115

Page 122: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

7.4.3 查询表达式

where/orWhere查询

where查询亦即条件查询,作为限制条件补充在一般的查询构造器中间。

//基本形式:

where(字段 , 条件 , 字段)

//例如 要求查询 number 大于等于 100 的人员信息,若为等于则等号可省略,like 找出含关键词的信息

$students = DB::table('students')->where('number','>=',100)->get();

$students = DB::table('students')->where('number',100)->get();

$students = DB::table('students')->where('name','like','% 桑%')->get();

//对于多条件的情况,要运用数组形式添加条件

$students = DB::table('students')->where([

['age',19],

'gender' => ' 女', //条件为‘=’的情况的另一种表达方式

['number','<=',600]

])->get();

where可以理解为 and关系,而 orWhere则可以表示 or关系

//基本形式与 where 一致

$students = DB::table('students')

->where('id','>',2)

->orWhere(function($query){

$query->where('number','<=',600)

->where('age',19);

})

一些其他的 where 语句如 (or)whereBetween、(or)whereNotBetween、(or)whereIn、(or)whereNotIn、whereDate、whereMonth、whereDay、whereYear、whereTime等内容可根据需要使用。

select查询

selcet允许你按照需求制定你想要的列而非全部

$users = DB::table('students')->select('name', 'number as rank')->get(); //查询指定列同

时设置输出列别名

有时候不同情况下我们需要查询的内容不大一致,但又有重复的地方,addSelect方法则可以帮助我们避免重复冗杂的工作

116 Chapter 7. Laravel框架之数据库与模型

Page 123: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

$base = DB::tabel('students')->select('id','name'); //$base 作为以构建好的查询可以查询 id

和 name

$student = $base->addSelect('gender')->get(); //利用 addSelcet 方法能在$base 基础上

查询更多内容

$users = DB::table('users')->distinct()->get(); //distinct 方法避免结果重复

7.5 数据管理——基于构造器的数据增删改

7.5.1 新增数据

insert()方法

1 //新增一条记录

2 DB::table('students')->insert([

3 //'id'=>13, 由于第一节输入数据时选择 id 自动增加 所以不填也会自动有相应的 id

4 'number'=> 1000, //其余的字段如 createDt 没填则为

5 'name' =>' 婕拉',

6 'gender'=>' 女',

7 'age' => 27

8 ]);

9

10 //新增多条记录

11 DB::table('students')->insert([

12 [...],

13 [...]

14 ]);

15

16 //insert() 方法数据新增成功后返回值为 1,可以用 return DB::table('students')->insert([...]}

尝试验证。

insertGetId()方法

1 //获取新增后返回的 ID

2 $id = DB::table('users')->insertGetId([

3 'id' => 44,

4 'name' =>' 易',

5 'gender'=>' 男',

6 'age' => 40

7 ]);

8 return $id;

insertOrIgnore()方法

7.5. 数据管理——基于构造器的数据增删改 117

Page 124: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

1 //忽略重复新增数据的错误,若存在相同 id(因为 id 选择了主键),则忽略该新增命令

2 DB::table('users')->insertOrIgnore([

3 'id' => 8,

4 'name' =>' 伊芙琳',

5 'gender'=>' 女',

6 'age' => 28

7 ]);

7.5.2 更改更新数据

update()方法

1 //依照 where 条件找到需要更新的数据并做更新

2 DB::table('students')->where('id', 11)

3 ->update([

4 'age' => '30',

5 'gender'=> ' 女'

6 ]);

updateOrInsert()方法

1 //参数 1:修改条件,若存在则修改否则新增

2 //参数 2:修改/新增内容

3 DB::table('students')->updateOrInsert(

4 ['id'=>66],

5 ['name'=>' 黑豆', 'age'=>'1', 'gender'=>' 男']

6 );

increment() / decrement()方法

//默认自增/自减值为 1,可依照需求设置

DB::table('students')->where('id', 6)->increment('number');

DB::table('students')->where('id', 7)->increment('number', 2);

7.5.3 删除数据

delete()方法

1 //删除一条数据

2 DB::table('users')->delete(9);

3 DB::table('users')->where('id', 9)->delete();

4 //清空(continues on next page)

118 Chapter 7. Laravel框架之数据库与模型

Page 125: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

5 DB::table('users')->delete();

6 DB::table('users')->truncate()

7 //使用 delete() 删除数据,通常要加上条件,否则清空所有数据;测试时要注意备份

7.5. 数据管理——基于构造器的数据增删改 119

Page 126: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

120 Chapter 7. Laravel框架之数据库与模型

Page 127: Larave-Admin 从入门到进阶

CHAPTER

EIGHT

LARAVEL框架之视图

8.1 Blade模板入门(什么是 blade模板以及基础使用)

8.2 blade模板的流程控制

121

Page 128: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

122 Chapter 8. Laravel框架之视图

Page 129: Larave-Admin 从入门到进阶

CHAPTER

NINE

LARAVEL框架的数据库及操作

9.1 ORM

123

Page 130: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

124 Chapter 9. Laravel框架的数据库及操作

Page 131: Larave-Admin 从入门到进阶

CHAPTER

TEN

ECHART的使用

10.1 echart使用(什么是 echart,echart的简单使用)

10.1.1 数据可视化

数据可视化 (图表等) 在当今时代有很重要的价值和意义,他是科学可视化 (坐标几何) 和信息可视化 (非几何的数据)的结合,其对数据分析导向进行展示,便于了解具体的事物逻辑以及认识数据的趋势,对于后台管理来讲,数据可视化能让我们更直观的看到数据的变化,从而大大提升我们对数据管理和认识的效率,而Echarts就能很好的满足我们这样的需求。

10.1.2 Echarts

Echarts是一个纯 JavaScript的图标库,兼容绝大部分的浏览器,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。

接下来我们尝试使用 echarts(要求有一定的 html基础)。在这之前,首先要引入囊括 Echarts语法的库,这里推荐一个

• `资源网站 `_,复制好这段代码后引入到 html代码中,则成功引入了 Echarts语法了,其他一些资源也可以通过同样的方法获得。

10.1.3 简单实践

创建一个以 html为后缀的文件并用 VSCode打开,英文输入法状态下键盘打出!的同时按 tab键即可自动生成 html基本框架。

尝试输入以下代码以实现简单基础的图表

1 <!DOCTYPE html>

2 <html lang="en">

3 <head>

(continues on next page)

125

Page 132: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 1: BootCDN资源网站使用

(continued from previous page)

4 <meta charset="UTF-8">

5 <meta http-equiv="X-UA-Compatible" content="IE=edge">

6 <meta name="viewport" content="width=device-width, initial-scale=1.0">

7

8 <!-- 此处即为复制的资源链接 -->

9 <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.1.2/echarts.common.min.js

↪→"></script>

10

11 <title>Document</title>

12 </head>

13 <body>

14 <!-- 为 Echarts 准备一个 Dom 并赋予唯一 id -->

15 <div id="test" style=" width:600px ; height:400px;"></div>

16 <script type="text/javascript">

17 var myChart = echarts.init(document.getElementById('test')); //通过 id 找到准备

好的 dom 并初始化 echarts 实例

18

19 //开始设计图标的配置项和数据

20 var option = {

21 title: {

22 text: ' 第一个 Echarts 实例' //图表的名称

23 },

24 tooltip:{},

25 legend:{ //图例 (说明)

26 data: [{

27 name: ' 学历',

28 icon: 'circle', //强制设置图形为圆,默认

为长方形。 (continues on next page)

126 Chapter 10. echart的使用

Page 133: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

29 textStyle: {

30 color: 'red' // 设置文本为红色

31 }

32 }]

33 },

34 xAxis: {

35 data: [" 专科"," 本科"," 硕士"," 博士"," 博士后"] // x 轴

36 },

37 yAxis:{}, // y 轴

38 series:[{

39 name:' 学历', //这类数据的名称,应当与

图例对应

40 type:'bar', //bar 即柱形图

41 data:[7,40,46,21,11]

42 }]

43 };

44 myChart.setOption(option); //使用指定的配置项和数据

option 显示图表

45 </script>

46 </body>

47 </html>

Fig. 2: Echarts编写的图表

可以看到,Echarts实际上就是嵌套在 script标签中进行编写的,通过既定的框架和语法实现美观清晰的图表呈现。

10.1. echart使用(什么是 echart,echart的简单使用) 127

Page 134: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Echarts的有关语法不需要全部背下,只需记住一些如上述例子中的经典语法,其他的语法可以像查字典一样到官网文档的配置项

• `配置项 `_中查看使用

10.2 Echarts与 laravel的结合

10.2.1 引入

上一节的图表实现,仅是在本地创建的一个 html文件,如果我们能够将 Echarts与 laravel结合,则能通过路由的形式查看图表了

10.2.2 laravel框架

截至目前,我们已经学习了路由,控制器等 laravel知识,对整个 laravel框架有了一定的认知。回忆我们最初输入 laravel这一根目录的时候展现的是欢迎界面,其实就是由 laravel框架下定义路由时路由返回视图 views下的 welcome视图从而展现出来的,查看 welcome视图的代码可以发现,他也是 html形式的代码,这与我们在上一节的代码形式很像,从而可以知道,Echarts与 laravel的结合应当在视图落手、

10.2.3 Echarts与 laravel的结合

1. 定义路由

use App\Http\Controllers\EchartsController;

Route::get('Echarts',[EchartsController::class,'test']);

2. 创建一个控制器 EchartsController,执行闭包 test以返回视图 Echarts

class EchartsController extends Controller

{

//

public function test(){

return view('Echarts');

}

}

3. 创建一个名为 Echarts的视图文件,并将上节的代码放入文件中

1. 在浏览器输入对应 URL即可展现同上一节的图表结果

128 Chapter 10. echart的使用

Page 135: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 3: 创建的 Echarts视图文件

10.2. Echarts与 laravel的结合 129

Page 136: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

Fig. 4: echarts与 laravel结合后绘出的图表

10.3 laravel向 echarts传递数据以及显示

10.3.1 引入

回顾上一节的 Echarts与 laravel结合,我们能够认识到视图文件、控制器文件以及路由文件分工合作以实现从表格样式设计到最后通过路由在浏览器展示出来的整个过程。然而截止现在,对于所展示的数据其实都是我们在指定表格的时候自己自由设定的假数据。那么对数据展示之前我们应当从数据库里获得我们需要以图表形式展示的数据,至此就需要结合数据库一章以及本章前两节的知识了。

其实大体流程是跟上一节一样的,只是这次我们需要加入从既连的数据库以传递我们需要的真实数据。

10.3.2 参数传递

参数传递的内容已经在数据库一章中有所介绍,此处简单介绍部分需要用到的参数传递方法

$data = '100';

return view('welcome')->with('data',$data); //单值传递,数组则利用数组形式

$data=[];

$data['first']='12';

$data['second']='34'; //作为 view 参数传递

return view('id',$data);

130 Chapter 10. echart的使用

Page 137: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

$data=[];

$data[0] = count(User::where('age','>',88995589)->get('id'));

$data[1]=count(User::where([

['age','>',41],

['age','<=',51], //compact 传值

])->get('id'));

return view('Echarts',compact('data'));

10.3.3 简单实践

这次实践中我们通过年龄段数据的分析帮助我们重新体会一次 laravel与 echarts结合并呈现图表的过程,同时认识如何进行真实数据的传递

1. 定义路由

use App\Http\Controllers\EchartsController;

Route::get('Echarts',[EchartsController::class,'test']);

2. 创建一个控制器 EchartsController,执行闭包 test,在此处进行真实数据的查询和筛选,并将值传递给视图 Echarts

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\DB;

use App\Models\User;

class EchartsController extends Controller

{

//

public function test(){

$data=[];

//$data[4]=DB::table('students')->pluck('number');

$data[0] = count(User::where('age','>',88995589)->get('id'));

$data[1]=count(User::where([

['age','>',41],

['age','<=',51],

])->get('id'));

$data[2]=count(User::where([

['age','>',31],

['age','<=',41],

])->get('id'));(continues on next page)

10.3. laravel向 echarts传递数据以及显示 131

Page 138: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

$data[3]=count(User::where([

['age','>',21],

['age','<=',31],

])->get('id'));

$data[4]=count(User::where('age','<=',21)->get('id'));

return view('Echarts',compact('data')); //对比上一节代码中控制器内容加入了数据库的内容

实现数据传递

}

}

3. 创建一个名为 Echarts的视图文件,输入对年龄阶段图表设计的代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.1.2/echarts.common.min.js

↪→"></script>

<!--<script type="text/javascript" src="resources/js/echarts/dist/echarts.min.js">

↪→</script>-->

<title></title>

</head>

<body>

<div id="test" style=" width:600px ; height:400px;"></div>

<script type="text/javascript">

var myChart = echarts.init(document.getElementById('test'));

var option = {

title: {

text: ' 年龄段分析'

},

tooltip:{},

legend:{

data:[' 人数']

},

xAxis: {

data: [" 远古生物","70 后","80 后","90 后","00 后"]

},

yAxis:{},(continues on next page)

132 Chapter 10. echart的使用

Page 139: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

(continued from previous page)

series:[{

name:' 人数',

type:'bar',

//对传递进来的数据引用需要用这样的结构 {{}}

data:[{{$data[0]}},{{$data[1]}},{{$data[2]}},{{$data[3]}},{{$data[4]}}

↪→],

}]

};

myChart.setOption(option);

</script>

</body>

</html>

1. 在浏览器输入对应 URL,可以看见数据经过分组传递后移直观的图表形式展示了出来

Fig. 5: laravel向 echarts传递数据以及显示

10.3. laravel向 echarts传递数据以及显示 133

Page 140: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

134 Chapter 10. echart的使用

Page 141: Larave-Admin 从入门到进阶

CHAPTER

ELEVEN

LARAVEL-ADMIN安装以及认识

11.1 Laravel-admin安装及初识

11.1.1 原理:

说明 laravel-admin和 laravel的关系

11.1.2 步骤:

一步步命令完成安装

135

Page 142: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

136 Chapter 11. Laravel-admin安装以及认识

Page 143: Larave-Admin 从入门到进阶

CHAPTER

TWELVE

权限设计

12.1 实验原理

12.1.1 内容

解释用户,角色,权限三个名词,阐述三者之间的关系

12.2 实验步骤

1. 添加权限以及注意事项

2. 添加角色

3. 添加用户

4. 验证权限

137

Page 144: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

138 Chapter 12. 权限设计

Page 145: Larave-Admin 从入门到进阶

CHAPTER

THIRTEEN

菜单设计

13.1 实验原理

13.1.1 内容

菜单和权限的关系,功能划分

13.2 实验步骤

1. 设计菜单层级

2. 添加各个菜单

3. 测试结果

139

Page 146: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

140 Chapter 13. 菜单设计

Page 147: Larave-Admin 从入门到进阶

CHAPTER

FOURTEEN

模块设计

14.1 实验原理

14.1.1 内容

控制器和模型以及迁移文件之间的关系,以及操作数据库的方法

14.2 实验步骤

1. 模型设计

2. 通过 artisan创建控制器模型以及数据迁移文件

3. 添加路由

4. 测试菜单是否正常

141

Page 148: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

142 Chapter 14. 模块设计

Page 149: Larave-Admin 从入门到进阶

CHAPTER

FIFTEEN

生命参数

15.1 实验原理

15.1.1 内容

生命参数需要完成什么功能,需要显示和修改那些数据,波形绘制方法。

15.2 实验步骤

1. 修改迁移文件完成数据库设计

2. 执行迁移文件创建数据字段

3. 修改模型提供数据支持

4. 修改控制器提供数据操作接口

5. 添加路由

6. 添加波形前端模板

143

Page 150: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

144 Chapter 15. 生命参数

Page 151: Larave-Admin 从入门到进阶

CHAPTER

SIXTEEN

智能诊断

16.1 实验原理

16.1.1 内容

智能诊断需要完成什么功能,需要显示和修改那些数据

16.2 实验步骤

1. 修改迁移文件完成数据库设计

2. 执行迁移文件创建数据字段

3. 修改模型提供数据支持

4. 修改控制器提供数据操作接口

5. 添加路由

145

Page 152: Larave-Admin 从入门到进阶

Larave-Admin从入门到进阶, Release 1.0

146 Chapter 16. 智能诊断

Page 153: Larave-Admin 从入门到进阶

CHAPTER

SEVENTEEN

用户分析

17.1 实验原理

17.1.1 内容

用户分析需要完成什么功能,需要显示和修改那些数据。Echart在本章中的作用。

17.2 实验步骤

1. 修改迁移文件完成数据库设计

2. 执行迁移文件创建数据字段

3. 修改模型提供数据支持

4. 修改控制器提供数据操作接口

5. 添加路由

6. 使用 echart绘图

147