Laravel框架第4天
复习
composer:就是PHP的软件管家,帮助PHP下载项目所需组件(类),如:验证码类、上传文件类等等
数据迁移:就是用PHP管理数据库
创建迁移:php artisan make:migration 数据迁移名称
创建迁移:php artisan make:migration create_表名_table –create=表名
创建迁移:php artisan make:migration update_表名_table –table=表名
运行迁移:php artisan migrate
撤销迁移:php artisan migrate:rollback
数据填充:就是用PHP快速插入测试数据
创建填充:php artisan make:seeder 填充器名称
运行填充:php artisan db:seed –class=填充器名称
faker说明:就是PHP的一个库(类)
faker作用:生成假数据
一、视图2(页面布局)
1、说明
一般在做网站的时候,我们会将网页中公共的部分提取出来,形成一个公共的布局文件(父模板,提取公共的区域),然后在让其他的页面继承该文件以获取公共的区域内容。同时在子页面我们可以定义好自己的内容,然后在公共的页面进行调用显示。
2、语法
@yield(‘标识’) 父(公共区域)定义内容片段,子填充
@extends(‘标识’) 子继承父(公共区域)
@section(‘标识’, ‘默认值’) 子填充父(公共区域)文字
@section(‘标识’) 子填充父(公共区域)HTML代码
存放子页面内容
@endsection
@include(‘视图标识’, [‘key’ => ‘value变量值’]) 调取公共页面(一般多个子页面提取)
3、代码
resources\views\layouts\common.blade.php
<!DOCTYPE html>
<html lang=”zh-CN”>
<head>
<meta charset=”utf-8″>
<meta http-equiv=”X-UA-Compatible” content=”IE=edge”>
<meta name=”viewport” content=”width=device-width, initial-scale=1″>
<title>laravel</title>
<!– Bootstrap CSS 文件 –>
<link rel=”stylesheet” href=”{{ asset(‘asset/static’) }}/bootstrap/css/bootstrap.min.css”>
@yield(‘css’)
</head>
<body>
<div class=”navbar navbar-default”>
<div class=”container”>
<div class=”navbar-header”>
<a href=”/” class=”navbar-brand”>首页</a>
<button type=”button” class=”navbar-toggle collapsed” data-toggle=”collapse” data-target=”#menu” aria-expanded=”false”>
<span class=”sr-only”>菜单折叠</span>
<span class=”icon-bar”></span>
<span class=”icon-bar”></span>
<span class=”icon-bar”></span>
</button>
</div>
<div class=”collapse navbar-collapse” id=”menu”>
<ul class=”nav navbar-nav”>
<li class=”active”><a href=”/”>开发</a></li>
<li><a href=”#”>列表</a></li>
<li><a href=”#”>头条</a></li>
<li class=”dropdown”>
<a href=”#” class=”dropdown-toggle” data-toggle=”dropdown”>资讯 <span class=”caret”></span></a>
<ul class=”dropdown-menu”>
<li><a href=”#”>学习一</a></li>
<li><a href=”#”>学习二</a></li>
<li class=”divider”></li>
<li><a href=”#”>技术学习</a></li>
<li class=”divider”></li>
<li><a href=”#”>jq学习</a></li>
</ul>
</li>
</ul>
<form class=”navbar-form navbar-left”>
<div class=”form-group”>
<input type=”text” class=”form-control” placeholder=”Search…”>
</div>
<button type=”submit” class=”btn btn-default”>搜索</button>
</form>
<ul class=”nav navbar-nav navbar-right”>
<li><a href=”./login.html”>登录</a></li>
<li><a href=”./register.html”>注册</a></li>
<li class=”dropdown”>
<a href=”#” class=”dropdown-toggle” data-toggle=”dropdown”>相关<span class=”caret”></span></a>
<ul class=”dropdown-menu”>
<li><a href=”#”>系列一</a></li>
<li class=”divider”></li>
<li><a href=”#”>系列二</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<!– 头部 –>
<div class=”jumbotron jump”>
<div class=”container”>
<h2>@yield(‘title’)</h2>
<p> 玩转- laravel</p>
</div>
</div>
<!– 中间内容区局 –>
<div class=”container”>
@yield(‘main’)
</div>
<!– 尾部 –>
<div class=”jumbotron” style=”margin:0;”>
<div class=”container”>
<span> @2017 laravel</span>
</div>
</div>
<!– jQuery 文件 –>
<script src=”{{ asset(‘asset/static’) }}/jquery/jquery.min.js”></script>
<!– Bootstrap JavaScript 文件 –>
<script src=”{{ asset(‘asset/static’) }}/bootstrap/js/bootstrap.min.js”></script>
<link href=”https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css” rel=”stylesheet”>
<script src=”https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert-dev.js”></script>
<script type=”text/javascript”>
@if (Session::has(‘tips’))
swal(“{{ Session::get(‘tips’) }}!”, “操作提示!”,”{{ Session::get(‘state’) }}”)
@endif
</script>
</body>
</html>
resources\views\layouts\form.blade.php
<form action=”{{ url(‘student/add’) }}” class=”form-horizontal” method=”post”>
{{ csrf_field() }}
<div class=”form-group”>
<label for=”name” class=”col-sm-2 control-label”>姓名</label>
<div class=”col-sm-5″>
<input type=”text” name=”uname” class=”form-control” id=”name” placeholder=”请输入学生姓名”>
</div>
<div class=”col-sm-5″>
<p class=”form-control-static text-danger”>姓名不能为空</p>
</div>
</div>
<div class=”form-group”>
<label for=”age” class=”col-sm-2 control-label”>密码</label>
<div class=”col-sm-5″>
<input type=”text” name=”pwd” class=”form-control” id=”age” placeholder=”请输入学生年龄”>
</div>
<div class=”col-sm-5″>
<p class=”form-control-static text-danger”>密码不能为空</p>
</div>
</div>
<div class=”form-group”>
<label for=”age” class=”col-sm-2 control-label”>年龄</label>
<div class=”col-sm-5″>
<input type=”text” name=”age” class=”form-control” id=”age” placeholder=”请输入学生年龄”>
</div>
<div class=”col-sm-5″>
<p class=”form-control-static text-danger”>年龄只能为整数</p>
</div>
</div>
<div class=”form-group”>
<label class=”col-sm-2 control-label”>性别</label>
<div class=”col-sm-5″>
<label class=”radio-inline”>
<input type=”radio” name=”sex” value=”1″> 男
</label>
<label class=”radio-inline”>
<input type=”radio” name=”sex” value=”2″> 女
</label>
</div>
<div class=”col-sm-5″>
<p class=”form-control-static text-danger”>请选择性别</p>
</div>
</div>
<div class=”form-group”>
<div class=”col-sm-offset-2 col-sm-10″>
<button type=”submit” class=”btn btn-primary”>提交</button>
</div>
</div>
</form>
resources\views\student\add.blade.php
@extends(‘student.layout.common’)
@section(‘title’, ‘添加’)
@section(‘css’)
<link rel=”stylesheet” href=”{{ asset(‘asset/static’) }}/bootstrap/css/form.css”>
@endsection
@section(‘main’)
<div class=”row”>
<!– 左侧菜单区域 –>
<div class=”col-md-3″>
<div class=”list-group”>
<a href=”./index.html” class=”list-group-item “>学生列表</a>
<a href=”./form.html” class=”list-group-item active”>新增学生</a>
</div>
</div>
<!– 右侧内容区域 –>
<div class=”col-md-9″>
<!– 所有的错误提示 –>
<div class=”alert alert-danger”>
<ul>
<li>姓名不能为空</li>
<li>年龄只能为整数</li>
<li>请选择性别</li>
</ul>
</div>
<!– 自定义内容区域 –>
<div class=”panel panel-default”>
<div class=”panel-heading”>新增学生</div>
<div class=”panel-body”>
@include(‘student.layout.form’)
</div>
</div>
</div>
</div>
@endsection
resources\views\student\index.blade.php
@extends(‘student.layout.common’)
@section(‘title’, ‘首页’)
@section(‘css’)
<link rel=”stylesheet” href=”{{ asset(‘asset/static’) }}/bootstrap/css/index.css”>
@endsection
@section(‘main’)
<div class=”row”>
<!– 左侧菜单区域 –>
<div class=”col-md-3″>
<div class=”list-group”>
<a href=”index.blade.php” class=”list-group-item active”>学生列表</a>
<a href=”./form.html” class=”list-group-item”>新增学生</a>
</div>
</div>
<!– 右侧内容区域 –>
<div class=”col-md-9″>
<!– 成功提示框 –>
<div class=”alert alert-success alert-dismissible” role=”alert”>
<button type=”button” class=”close” data-dismiss=”alert” aria-label=”Close”>
<span aria-hidden=”true”>×</span>
</button>
<strong>成功!</strong> 操作成功提示!
</div>
<!– 失败提示框 –>
<div class=”alert alert-danger alert-dismissible” role=”alert”>
<button type=”button” class=”close” data-dismiss=”alert” aria-label=”Close”>
<span aria-hidden=”true”>×</span>
</button>
<strong>失败!</strong> 操作失败提示!
</div>
<!– 自定义内容区域 –>
<div class=”panel panel-default”>
<div class=”panel-heading”>学生列表</div>
<table class=”table table-striped table-hover table-responsive”>
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>添加时间</th>
<th width=”120″>操作</th>
</tr>
</thead>
<tbody>
@foreach ($student as $item)
<tr>
<th scope=”row”>{{ $item->id }}</th>
<td>{{ $item->uname }}</td>
<td>{{ $item->age }}</td>
<td>
@if ($item->sex === 1)
公
@else
母
@endif
</td>
<td>{{ $item->created_at }}</td>
<td>
<a href=””>详情</a>
<a href=””>修改</a>
<a href=””>删除</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!– 分页 –>
<div style=”text-align: right;”>
{{ $student->links() }}
{{–<ul class=”pagination pull-right”>–}}
{{–<li>–}}
{{–<a href=”#” aria-label=”Previous”>–}}
{{–<span aria-hidden=”true”>«</span>–}}
{{–</a>–}}
{{–</li>–}}
{{–<li class=”active”><a href=”#”>1</a></li>–}}
{{–<li><a href=”#”>2</a></li>–}}
{{–<li><a href=”#”>3</a></li>–}}
{{–<li><a href=”#”>4</a></li>–}}
{{–<li><a href=”#”>5</a></li>–}}
{{–<li>–}}
{{–<a href=”#” aria-label=”Next”>–}}
{{–<span aria-hidden=”true”>»</span>–}}
{{–</a>–}}
{{–</li>–}}
{{–</ul>–}}
</div>
</div>
</div>
</div>
@endsection
二、会话技术
1、session会话
1)语法
- 位置:config\session.php存储了session的相关配置说明(注:非php.ini)
脚下留心
- 说明:Laravel中支持三种方式操作session
- Http Request类的session方法
设置: $request->session()->put(键,值)
获取指定:$request->session()->get(键 [,默认值])
获取所有:$request->session()->all()
判断: $request->session()->has(键);
- session辅助函数
设置:session([键1=>值1,…,键n=>值n])
获取:session(键)
- Session facade门面 (通过Session类调用静态方法)
设置: Session::put(键,值);
获取指定: Session::get(键 [,默认值])
获取所有: Session::all()
删除指定: Session::forget(key)
判断: Session::has(key)
删除所有: Session::flush()
压入session数组:Session::push(key, value)
获取后删除: Session::pull(key)
闪存: Session::flash(key, value)
2)练习
设置
获取全部
压入
获取指定
获取全部
闪存
查看
2、cookie会话
1)语法
- 设置:Cookie::make(键,值)
- 设置:Cookie::forever(键,键) #理论上的永久设置
- 获取:Cookie::get(键)
Laravel中必须通过withCookie使响应头中携带cookie信息
2)练习
设置cookie
控制器
三、中间件(middleware)
概念
- 中间件:就是将HTTP请求交给控制器方法处理前的过滤层
- 简单理解:
语法
- 语法:php artisan make:middleware 中间件名称
- 位置:Http\Middleware\中间件名称
- 使用步骤
- 步骤1:创建中间件,并书写过滤代码
- 步骤2:注册激活中间件(app\Http\Kernel.php)
- 步骤3:路由声明使用哪个中间件过滤
Route::HTTP请求类型(路径,闭包函数或控制器方法)->middleware(中间件名称)
Route::group([‘namespace’=>, ‘prefix’=>”, ‘middleware’=>中间件名称], function(){
})
练习(需求:访问 /test时闭包函数输出111,中间件输出222)
步骤1:创建中间件并书写逻辑代码
步骤2;激活
步骤3:路由使用
防翻墙
步骤1:保存用户信息到session中
步骤2:创建中间件
//判断用户是否登录
if (!Session::has(‘userinfo’)) {
return redirect(‘/student/login’)->with([‘state’=>’error’, ‘tips’=>’犊子,去登录’]);
}
步骤3:激活中间件
步骤4:使用
步骤5:修改laravel的session机制
四、Laravel控制器数据验证
1、概念
1)说明
为了保证项目安全除前段必须验证外后端也必须进行数据验证,Laravel提供了一套完善的验证机制。
2)分类(Laravel提供了三种方式验证)
- 控制器直接使用validate方法
- 单独创建验证类
- 使用validator门面验证
验证规则
required: 不能为空
max:255最长255个字符,
min:1最少1个字符
email:验证邮箱是否合法
confirmed:验证两个字段是否相同,如果验证的字段是password,则必须输入一个与之匹配的password_confirmation字段
integer:验证字段必须是整型
ip:验证字段必须是IP地址
numeric 验证字段必须是数值
max:value 验证字段必须小于等于最大值,和字符串,数值,文件字段的size规则一起使用。
min:value 验证字段的最小值,对字符串、数值、文件字段而言,和size规则使用方式一致。
size:value 验证字段必须有和给定值value想匹配的尺寸,对字符串而言,value是相应的字符数目,对数值而言,value是给定整型值;对文件而言,value是相应的文件字节数。
string 验证字段必须是字符串
unique:表名,字段,需要排除的ID
验证规则手册:http://laravelacademy.org/post/6768.html#toc_17
多学一招:多个验证规则可以通过 “|” 字符进行隔开
方法1:控制器使用validate方法
语法
- $this->validate($request,验证规则 [,提示信息])
练习
控制器
//数据验证
$this->validate($request, [
‘uname’ => ‘required’,
‘pwd’ => ‘required’,
‘age’ => ‘required|integer’,
‘sex’ => ‘required|integer’,
], [
‘age.integer’ => ‘年龄必须是整型’,
‘age.required’ => ‘年龄必须’,
]);
视图
@if (count($errors) > 0)
<div class=”alert alert-danger”>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
多学一招:验证提示信息汉化
- 下载:https://github.com/caouecs/Laravel-lang
- 将下载的汉化包放到项目中
- 修改config\app.php
4)重新提交测试即可
方法2:单独创建验证类
语法
- 语法:php artisan make:request 验证类名称
- 位置:app\Http\Requests
2)练习
步骤1:创建验证类并书写规则
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CheckStudent extends FormRequest
{
public function authorize()
{
return true; //开启验证
}
public function rules()
{
if ($this->isMethod(‘get’)) return [];
return [
‘uname’ => ‘required’,
‘pwd’ => ‘required’,
‘age’ => ‘required|integer’,
‘sex’ => ‘required|integer’,
];
}
public function messages()
{
return [
‘uname.required’ => ‘用户名有消磁’
];
}
}
步骤2:在控制器中使用
方法3:使用Validator门面验证器(类)
1)语法
- $validator = Validator::make(待验证的数据,验证规则 [,提示信息])
- $validator->passes() 是否成功:成功-true,失败-false
- $validator->fails() 是否失败:失败-true,成功-false
- $validator->messages() 获取错误信息
2)练习
$validator = Validator::make($request->all(), [
‘uname’ => ‘required’,
‘pwd’ => ‘required’,
‘age’ => ‘required|integer’,
‘sex’ => ‘required|integer’,
]);
if ($validator->fails()) {
//如果异步请求则响应json dd($validator->messages());
return redirect(‘student/add’)->withErrors($validator);
}
︴显示单个错误
语法:{{ $errors->first(键) }}
多表查询【★★★★★★★★★★★★★★】
︴测试数据准备
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
`aid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘编号’,
`title` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ‘用户名’,
`content` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ‘密码’,
`uid` int(11) DEFAULT NULL,
PRIMARY KEY (`aid`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `article` VALUES (‘1’, ‘文章1’, ‘内容1’, ‘1’);
INSERT INTO `article` VALUES (‘2’, ‘文章2’, ‘内容2’, ‘1’);
INSERT INTO `article` VALUES (‘3’, ‘文章3’, ‘内容3’, ‘2’);
INSERT INTO `article` VALUES (‘4’, ‘文章4’, ‘内容4’, ‘3’);
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘编号’,
`uname` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ‘用户名’,
`pwd` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ‘密码’,
`age` tinyint(3) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘年龄’,
`sex` tinyint(3) unsigned NOT NULL DEFAULT ‘1’ COMMENT ‘性别:1-男,2-女’,
`created_at` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘创建于’,
`updated_at` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘更新于’,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `student` VALUES
(‘1’, ‘test’, ‘$2y$10$0.wXoff3zfaqM4DSMzlzbOEkDfk5ztnJn32vilBAS/WEWSWLcZcrK’, ’64’, ‘1’, ‘1515226698’, ‘1515226698’),
(‘2’, ‘Kariane Shields’, ‘$2y$10$xM5YmEL5D3jpomMvqIH/5eS.W.F0o.9oqfNr/FhlmTInRJFEBc9Wi’, ’94’, ‘2’, ‘1515226713’, ‘1515226713’),
(‘3’, ‘Prof. Dino Brakus’, ‘$2y$10$hhSBJh69wyAO9wK.JABiEO02rxOzz2MfjHZVbfbLE5RiI7ZRuw6qa’, ‘107’, ‘1’, ‘1515226713’, ‘1515226713’),
(‘4’, ‘Miss Vivienne Senger V’, ‘$2y$10$CgsLmcYEmYukWKV4i/qAtOHnnnLvUSlJ/NU46.Tke/OuNRgrRES9W’, ’15’, ‘1’, ‘1515226713’, ‘1515226713’);
1、概念
一对一关系:一篇文章属于一个用户
一对多关系:一个用户有多篇文章
查询构建器
1)语法
DB::table(表1)
->leftJoin(表2, ‘表1.公共字段’, ‘=’, ‘表2.公共字段’)
->get()
2)练习
#一对一关系:一遍文章属于一个用户
public function test()
{
#一对一关系:一遍文章属于一个用户
$data = DB::table(‘article’)
->leftJoin(‘student’, ‘article.uid’, ‘=’, ‘student.id’)
->get();
echo ‘<pre>’;
print_r($data);
#一对多关系:一个用户拥有多篇文章
}
#一对多关系:一个用户拥有多篇文章
#一对多关系:一个用户拥有多篇文章
$data = DB::table(‘student’)
->leftJoin(‘article’, ‘article.uid’, ‘=’, ‘student.id’)
->get();
echo ‘<pre>’;
print_r($data);
模型
1)语法
- 一对一
步骤1:模型定义
public function 推荐写表名()
{
return $this->hasOne(关联模型,关联模型公共字段, 本模型公共字段);
}
步骤2:控制器调用【模型名::with(‘推荐写表名’)->get()】
- 一对多
步骤1:模型定义
public function 推荐写表名s()
{
return $this->hasMany(关联模型,关联模型公共字段, 本模型公共字段);
}
步骤2:控制器调用【模型名::with(‘推荐写表名’)->get()】
2)练习
#一对一关系:一遍文章属于一个用户
步骤1:设置模型
步骤2:控制器调用
public function test()
{
#潜规则:
#单模型直接查询, 则$v是一个小对象 通过$v->字段名可以获取数据
#with模型关联查询,则$v是一个小对象
# 获取本模型数据: 通过$v->本模型的字段
# 获取其他模型数据:通过$v->with的名称->其他模型的字段
echo ‘<pre>’;
#一对一关系:一遍文章属于一个用户
$articles = Article::with(‘student’)->get();
print_r($articles);
foreach ($articles as $article) {
echo ‘学生表ID:’.$article->student->id . ‘<br />’;
echo ‘文章表ID:’.$article->aid . ‘<br />’;
echo ‘<hr />’;
}
}
#一对多关系:一个用户拥有多篇文章
模型
控制器
public function test()
{
#潜规则:
#单模型直接查询, 则$v是一个小对象 通过$v->字段名可以获取数据
#with模型关联查询,则$v是一个小对象(1:N)
# 获取本模型数据: 通过$v->本模型的字段
# 获取其他模型数据:通过$v->with的名称 (数组,需要foreach 第二次foreach的$v是关联模型的一个个小对象)
echo ‘<pre>’;
#一对多关系:一个用户拥有多篇文章
$students = Student::with(‘articles’)->get();
foreach ($students as $student) {
echo $student->id . ‘<br />’;
//显示学生信息(脚下留心:relations是数组,没有关联数据则空数组)
foreach ($student->articles as $student) {
echo $student->aid. “<br />”;
}
echo ‘<hr />’;
}
}
路由2
理解RESTful
- 说 明:RESTful是目前最流行的一种互联网软件架构(思想)
- 架构规则:
Laravel资源控制器语法(RESTful)
- 创建资源控制器:php artisan make:controller Home\Day3Controler –resource
- 创建资源控制器路由:Route::resource(URL信息,控制器);
资源控制器指会自定帮我们按照restful规则创建好方法
︴练习
创建资源控制器
2)创建资源控制器路由
3)访问
扩展
https://www.cnblogs.com/CraryPrimitiveMan/p/6242167.html?utm_source=itdadao&utm_medium=referral
︴其他扩展
1、PHP use 使用场景(or or and 数据库操作)
2、钻石设计软件