【文档说明】PHP网站开发实例教程-第7章-Laravel框架(上)课件.ppt,共(90)页,2.860 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-3184.html
以下为本文档部分文字说明:
PHP第7章Laravel框架(上)•初识Laravel•路由•控制器•数据库操作•视图•防御CSRF攻击•模型•自动验证PHP网站开发实例教程✎学习目标掌握了解Laravel框架13熟悉Laravel框架对CSRF攻击的
处理方式掌握Laravel框架中路由的使用方法5掌握Laravel框架中对控制器、模型、视图的定义和使用方法24掌握Laravel框架的数据库操作和自动验证的使用方法✎目录☞点击查看本节相关知识点☞点击查看本节相关知识点路由初识Laravel控制器☞点击查看本小节知识架构数据库操作
☞点击查看本小节知识架构✎目录☞点击查看本节相关知识点☞点击查看本节相关知识点防御CSRF攻击视图模型☞点击查看本小节知识架构自动验证☞点击查看本小节知识架构✎7.1初识Laravel1Laravel概述Laravel是一套简洁、优雅的
Web应用框架,具有富于表达性且简洁的语法,提供了强大的工具来开发大型应用,这些工具包括自动验证、路由、Session、缓存、数据库迁移、单元测试等✎7.1初识Laravel1Laravel概述Laravel框架具有目前大部分框架都具有的共同
特点:⚫单入口。为了让框架统一管理所有的请求,整个项目对外只提供一个入口⚫MVC开发模式。利用MVC可以更好地协同开发,为后期的维护提供方便⚫ORM(对象关系映射)方式操作数据库,支持AR(活动记录)模式✎7.1初识Larave
l2创建Laravel项目步骤:⚫开启常用扩展⚫开启重写⚫配置虚拟主机⚫安装Laravel✎7.1初识Laravel2创建Laravel项目extension=curlextension=fileinfoextension=gd2extension=
mbstringextension=opensslextension=pdo_mysql开启常用扩展:✎7.1初识Laravel2创建Laravel项目<VirtualHost*:80>DocumentRoot"C:/w
eb/www/laravel/public"ServerNamewww.laravel.testServerAliaslaravel.test</VirtualHost><Directory"C:/web/www/laravel/pu
blic">Options-indexesAllowOverrideAllRequireallgranted</Directory>配置虚拟主机:✎7.1初识Laravel2创建Laravel项目composercreate-
projectlaravel/laravel=5.5.*--prefer-dist./安装Laravel:✎7.1初识Laravel2创建Laravel项目安装结果:✎7.1初识Laravel2创建Laravel项目访问http://w
ww.laravel.test,页面显示结果:✎7.1初识Laravel3配置VSCode编辑器使用VSCode编辑器打开Laravel项目,创建.vscode/settings.json文件,添加配置对代码进行语法检查和自动格式化{"php.su
ggest.basic":false,"php.executablePath":"C:/web/php7.2/php.exe","phpcs.standard":"psr2","files.eol":"\n"}✎7.1初识Lara
vel4Laravel目录结构Laravel一级目录的作用:目录作用app应用目录,保存项目中的控制器、模型等bootstrap和框架的启动相关的文件config存放一些配置文件database数据库迁移文件及数据填充文件public应用入口文件index.php和前
端资源文件(如CSS、JavaScript等)resources存放视图文件、语言包和未编译的前端资源文件routes存放应用中定义的所有路由storage存放编译后的模板、Session文件、缓存文件、
日志文件等tests自动化测试文件vendor存放通过Composer加载的依赖✎7.1初识Laravel4Laravel目录结构Laravel常用的子目录和文件:类型路径作用目录app\Http存放HTTP请求相关的文件目录app\Http\Controllers存放控制器文件
目录app\Http\Controllers\AuthAuth模块的控制器目录文件app\Http\Controllers\Controller.php控制器的基类文件目录app\Http\Middleware中间件目录文件app\User.phpUser模型文件文件bootstrap
\autoload.php自动加载文件文件config\app.php全局配置文件✎7.1初识Laravel4Laravel目录结构Laravel常用的子目录和文件:类型路径作用文件config\auth.phpAuth模块的配
置文件文件config\database.php数据库配置文件文件config\filesystem.php文件系统的配置文件目录database\factories存放工厂模式的数据填充文件目录database\migrations存放
数据库迁移文件目录database\seeds存放数据填充器文件目录resources\lang存放语言包文件目录resources\views存放视图文件✎7.1初识Laravel4Laravel目录结构Laravel常用的子目录和文
件:类型路径作用文件routes\web.php定义路由的文件目录storage\app存放用户上传的文件目录storage\framework存放与框架自身相关的文件目录storage\logs存放日志文件文件pub
lic\index.php入口文件文件.env环境变量配置文件文件artisan脚手架文件文件composer.jsonComposer依赖包配置文件✎7.2路由1配置路由路由需要在routes/web.php文件中进行配置,Route类定义路由的方式:Route:
:get('/hello',function(){return'hello';});//同时匹配get和post请求方式Route:match(['get','post'],'test1',function(){return'通过match(
)匹配';});//匹配任意请求方式Route:any('test2',function(){return'通过any()匹配';});✎7.2路由2路由参数Laravel允许在请求URI中传递一些动态的参数,
称为路由参数路由参数分为必选参数和可选参数,必选参数的语法为“{参数名}”可选参数的语法为“{参数名?}”演示如何使用必选参数:Route::get('find/{id}',function($id){retur
n'输入的id为'.$id;});✎7.2路由2路由参数演示如何使用可选参数:Route::get('find2/{id?}',function($id=0){return'输入的id为'.$id;});✎7.2路由3路由别名路由别名用来在路由定义的时候,
为路由起一个别名演示给路由设置别名:Route::get('/hello/123',function(){return'hello';})->name('hello');✎7.2路由4路由分组为了方便路由的管理,对路由进行分组,分组后可以对一组路由统一进行管理例如下面一组路由:/
admin/login/admin/logout/admin/index/admin/user/add/admin/user/del✎7.2路由4路由分组路由分组后:Route::group(['prefix'=
>'admin'],function(){Route::get('login',function(){return'这里是/admin/login';});Route::get('logout',function(){return'这里是/admin/logout';}
);Route::get('user/add',function(){return'这里是/admin/user/add';});});✎7.3控制器1创建控制器一个控制器文件应包含命名空间的声明和引入,以及控制器类的定义为了防止出错Laravel提供了自动生成控制器的命令ph
partisanmake:controller控制器名✎7.3控制器1创建控制器代码演示使用phpartisan创建一个TestController控制器:phpartisanmake:controllerTestController✎7.3控制器1创建控制器Test控制器代
码如下所示:<?phpnamespaceApp\Http\Controllers;useIlluminate\Http\Request;classTestControllerextendsController{//}✎7.3控制器2控制器路由控制器
路由是路由的一种定义方式控制器路由是将回调函数修改为“控制器类名@方法名”Route::get('admin/test1','Admin\TestController@test1');✎7.3控制器3接收用户输入接收用户输入的方式主要有两
种:⚫通过Request实例接收⚫通过路由参数接收✎7.3控制器3接收用户输入通过Request实例接收用户输入:<?phpnamespaceApp\Http\Controllers;useIlluminate\Http\Request;//1.导入命名空间classTestCon
trollerextendsController{//2.依赖注入publicfunctioninput(Request$request){//3.调用input()方法获取数据$name=$request->input('name
');return'name的值为'.$name;}}✎7.3控制器3接收用户输入使用Request实例接收查询字符串:1.给input()方法定义路由Route::get('test/input','TestCont
roller@input');2.访问http://www.laravel.test/test/input?name=xiaoming输出结果:“name的值为xiaoming”✎7.3控制器3接收用户输入使用Request实例接收路由参数:1.修改路由定义方式,在路由中匹配nam
e参数Route::get('test/input/{name}','TestController@input');2.修改input()方法3.访问http://www.laravel.test/t
est/input?name=xiaoming输出结果:“name的值为xiaoming”publicfunctioninput(Request$request){$name=$request->name;return'nam
e的值为'.$name;}✎7.3控制器3接收用户输入通过路由参数接收用户输入:1.修改路由定义方式,在路由中匹配name参数Route::get('test/input/{name}','TestController@input');2.修改input
()方法3.访问http://www.laravel.test/test/input?name=xiaoming输出结果:“name的值为xiaoming”publicfunctioninput(Request$reque
st){return'name的值为'.$name;}✎7.4数据库操作1配置数据库步骤:⚫创建Laravel数据库,在数据库中创建member表⚫在config\database.php文件中将配置参数从环境变量中获取⚫在.env文件中配置数据库的参数⚫在test控制器中创
建方法,测试DB类✎7.4数据库操作2添加数据insert()方法返回值为true或false,表示是否添加成功$data=['name'=>'tom','age'=>'22','email'=>'tom@laravel.test'];dump(DB::table('member')->
insert($data));✎7.4数据库操作2添加数据insertGetId()方法返回值为自动增长的id$data=['name'=>'tom','age'=>'22','email'=>'tom@laravel.test'];dump(
DB::table('member')->insertGetId($data));✎7.4数据库操作3修改数据update()方法用来修改指定的字段//将表中所有记录的name字段的值都改为tom$data=['nam
e'=>'tom'];dump(DB::table('member')->update($data));✎7.4数据库操作3修改数据increment()方法用来对数字进行递增//将表中所有记录的age字段的值都加1dump(DB::t
able('member')->increment('age'));//将表中所有记录的member字段的值都加5dump(DB::table('member')->increment('age',5));✎7.4数据库操作3修改数据
decrement()方法用来对数字进行递减//将表中所有记录的member字段的值都减1dump(DB::table('member')->decrement('age'));//将表中所有记录的member字段的值都减5dump(DB::table('
member')->decrement('age',5));✎7.4数据库操作3修改数据使用WHERE条件限定要操作的记录//参数形式1:where(字段名,运算符,字段值)DB::table('member')->where('id','=','1')->upda
te($data);//参数形式2:where(字段名,字段值),使用“=”运算符DB::table('member')->where('id','1')->update($data);//参数形式3:where([字段名=>字段值]),使用=运算符
,支持多个字段,AND关系DB::table('member')->where(['id'=>1])->update($data);//where()表示AND,即“WHEREid=1ANDname='tom'”DB::tab
le('member')->where(['id'=>1])->where(['name'=>'tom'])->…//orWhere()表示OR,即“WHEREid=1ORname='tom'”DB::table('member')->where(['i
d'=>1])->orWhere(['name'=>'tom'])…✎7.4数据库操作4查询数据查询多行数据:$data=DB::table('member')->get();foreach($dataas$v){echo$v->id.'-'.$v->name.'<br>
';}✎7.4数据库操作4查询数据查询单行数据://查询id为1的记录$data=DB::table('member')->where('id','1')->first();//输出id字段的值dump($data->id);✎7.4数据库操作4查询数据
查询指定字段的值://获取name和email两个字段,返回多条记录$data=DB::table('member')->get(['name','email']);//获取name和email两个字段,返回一条记录$data=DB::table('member')->first
(['name','email']);✎7.4数据库操作4查询数据查询某个字段的值://查询id为1的记录,返回name字段的值$name=DB::table('member')->where('id','1')->value('name')
;✎7.4数据库操作4查询数据排序:$data=DB::table('member')->orderBy('age','desc')->get();✎7.4数据库操作4查询数据分页:$data=DB::table('member')->li
mit(3)->offset(2)->get();✎7.4数据库操作5删除数据第1种方式使用delete()方法删除指定的记录第2种方式使用truncate()方法清空整个数据表//删除id为1的记录,返回值为删除的行数$res
=DB::table('member')->where('id','<''3')->delete();//清空数据表(相当于SQL中的“TRUNCATEmember”)DB::table('member')->truncate();✎7.4数据库操作6执行SQL语句通过DB类直接执行一些复杂SQL
语句//执行SELECT语句,返回结果集$data=DB::select('SELECT*FROM`member`');//执行INSERT语句,返回true或falseDB::insert('INSERTINTO`member`SET`name`=\'tom\'')
;//执行UPDATE语句,返回受影响的行数DB::update('UPDATE`member`SET`name`=\'tim\'WHERE`id`=1');//执行DELETE语句,返回受影响的行数DB::delete('DELETEFROM`member`WHERE`id`=1');//执
行其他语句,如CREATETABLE,返回true或falseDB::statement('CREATETABLE`test`(`id`INT)');✎7.5视图1创建视图文件⚫视图文件保存在resources\views目录中⚫视图文件的名称以“.blade.php”或“.php”结尾⚫当
以“.blade.php”结尾,表示使用Blade模板引擎,在视图中可以使用模板语法和PHP原生语法⚫当以“.php”结尾,表示不使用模板引擎,只能使用PHP原生语法✎7.5视图1创建视图文件演示视图文件的使用:创建resour
ces\views\show.blade.php文件<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Document</title></head><body>当前显示的
视图文件是show.blade.php</body></html>✎7.5视图1创建视图文件演示视图文件的使用:在控制器中加载视图文件publicfunctionshow(){//加载视图文件resources\views\show.blade.phpre
turnview('show');}✎7.5视图1创建视图文件演示视图文件的使用:浏览器访问测试运行结果✎7.5视图1创建视图文件view()函数的使用:对应的视图文件路径为resources\view\home\test\show
.blade.phpreturnview('home/test/show');//写法1,用“/”分隔returnview('home.test.show');//写法2,用“.”分隔✎7.5视图2向视图传递数据在视图文件中不能直接
访问控制器中的变量,需要在控制器中为视图传递数据使用view()函数或with()函数为视图传递数据//方式1:通过view()的第2个参数传数据returnview(模板文件,数组);//方式2:通过with()传
数据returnview(模板文件)->with(数组);//方式3:通过连续调用with()传数据returnview(模板文件)->with(名称,值)->with(名称,值)…✎7.5视图3视图数据的处理特殊字符转义:Blade模板引擎在输出字符串时,会自动进行HTML特殊
字符的转义如果禁止Blade自动转义,在变量输出时使用“{!!$content!!}”✎7.5视图3视图数据的处理通过函数对数据进行处理:在视图中输出数据时,可以通过函数来对数据进行处理例如,向视图传入一个时间戳数据,在视
图中使用date()函数进行格式化处理<body>当前时间是:{{date('Y-m-dH:i:s',$time)}}</body>✎7.5视图4循环操作使用“@foreach”模板语法来实现循环输出数组语法格式:@foreach($variabl
eas$key=>$value)//循环体@foreach✎7.5视图4循环操作代码演示“@foreach”语法的使用:<body><h1>循环操作</h1>@foreach($dataas$v){{$v->id}}-{{$v->name}}<br>@endf
oreach</body>✎7.5视图5循环操作使用“@if”模板语法进行判断操作语法格式:@if(条件表达式1)//语句1@elseif(条件表达式2)//语句2@elseif(条件表达式3)//语句3……@else//以上条件都不满足时执行的语句@endif✎7.5视图6模板继承将一个完整
页面中的公共部分放在父页面中将不同的部分放在不同的子页面中子页面可以继承父页面来获得完整的页面头部区域内容区域(空)尾部区域子页面1子页面2父页面继承继承内容区域1内容区域2✎7.5视图6模板继承子页面继承父页面语法:@extends('需要继承的父页面')@section('区块名称')区块内容
@endsection✎7.5视图7模板包含把多个页面中相同的部分抽取到子页面中,通过@include()将公共部分包含进来,得到完整的页面。头部区域(空)内容区域尾部区域(空)子页面1子页面2主页面包含包含头部区域头部区域✎7.6防御CSRF攻击1什么是CSRF攻击CSRF(
Cross-SiteRequestForgery,跨站请求伪造)是互联网中常见的一种攻击方式它出现的原因是,当用户在网站中登录以后,网站无法判断其接下来收到的请求是用户主动发起的,还是被其他网站的恶意程序伪造的。当用户访问了其他网
站时,其他网站可以伪造一个请求,发给这个已登录的网站,造成用户在不知情的情况下执行了发帖子、删除文章、转账之类的操作✎7.6防御CSRF攻击1什么是CSRF攻击GET方式的CSRF攻击<imgsrc="http://xxx/admin/data/delete/id/1">当用户浏览了包含
img标签的页面时,删除数据的操作在用户不知情的情况下就被执行了。✎7.6防御CSRF攻击1什么是CSRF攻击POST方式的CSRF攻击<formid="f"method="post"action="http:/
/xxx/admin/data/delete"target="i"><inputtype="hidden"name="id"value="1"></form><iframestyle="display:none"name
="i"></iframe><script>document.getElementById('f').submit();</script>当用户浏览了包含表单的页面时,删除数据的操作就已经静默执行了。✎7.6防御CSRF攻击2在Laravel中防御CSRF攻击Laravel框架会对POST方
式发过来的请求进行令牌验证,因此对安全性要求高的操作(如添加、修改、删除数据),应使用POST方式对GET方式不会进行令牌验证,因此而对安全性没有要求的操作(如查询),可以使用GET方式✎7.6防御CSRF攻击2在Laravel中防御CSRF攻击POST方式的请求通常使用表单
进行发送,在视图文件中编写表单的时候,可以通过模板语法“{{csrf_field()}}”或“{{csrf_token()}}”来获取令牌,将令牌放入表单中,随表单一起提交,这样就可以通过CSRF验证✎7.6防御CSR
F攻击2在Laravel中防御CSRF攻击<formaction="{{route('trans')}}"method="post">收款人:<inputtype="text"name="name"><br>
转账金额:<inputtype="text"name="money"><br>{{csrf_field()}}<inputtype="submit"value="转账"></form>表单提交的POST请求,推荐使用{{csrf_field()}}✎7.6防御CSRF攻击2在Laravel中
防御CSRF攻击$.ajax({url:'{{route("trans")}}',type:'POST',headers:{'X-CSRF-TOKEN':'{{csrf_token()}}'},data:{},sccces
s:function(res){console.log(res);}});Ajax提交的POST请求,推荐使用{{csrf_token()}}✎7.6防御CSRF攻击3从CSRF验证中排除例外的路由⚫并不是所有的请求都需要防御CSRF攻击⚫例如为客户端(微信小
程序、手机应用)提供接口时,不需要CSRF验证⚫在app\Http\Middleware\VerifyCsrfToken.php文件中添加要排除的路由⚫如果希望所有的路由都不进行验证,可以用“*”来表示✎7.7模型1定义模型使用phpartisan命令可以自动创建
一个模型phpartisanmake:model模型名✎7.7模型1定义模型代码演示使用phpartisan创建一个Member模型:phpartisanmake:modelMember✎7.7模型1定义模型Member模型
代码如下所示:<?phpnamespaceApp;useIlluminate\Database\Eloquent\Model;classMemberextendsModel{//}✎7.7模型1定义模型在模型类中还可以添加
一些可选的属性:⚫protected$primaryKey:用来设置主键的名称,默认值为id⚫public$timestamps:是否自动维护时间戳,默认为true。模型会自动维护表中的created_at和updated_at
字段⚫protected$fillable:表示允许某些字段被添加或修改,格式为一维数组⚫protected$guarded:表示禁止某些字段被添加或修改,与$fillable二选一✎7.7模型2在控制器中使用模型⚫引入模型
的命名空间⚫静态调用模型⚫实例化模型类//方式1:静态调用Member::get();//方式2:实例化模型$member=newMember();$member->get();✎7.7模型3使用模型添加数
据save()方法的使用方式:先实例化模型,为模型的属性赋值,模型的属性对应数据表中字段,赋值完成后,调用save()方法进行保存$member=newMember();$member->name='
save';$member->age='20';dump($member->save());//保存数据dump($member->id);//获取自动增长id✎7.7模型3使用模型添加数据fill()方法的使用方式:先在模型类中
定义允许填充的字段,以数组的方式为模型填充数据,数组的键名对应字段名//定义允许填充的字段protected$fillable=['name','age','email'];//fill()方法的使用$data=['name'=>'fill','age'=>'20'];$mem
ber=newMember();$member->fill($data);$member->save();✎7.7模型3使用模型添加数据create()方法的使用方式:先在模型类中定义允许填充的字段,在实例化模型的同时,为模型填充数据//定义允许填充的字段protected$fillab
le=['name','age','email'];//create()方法的使用$data=['name'=>'tom','age'=>'20'];$member=Member::create($data);$member->save();✎7.7模型4使用模型查询
数据find()方法根据主键查询记录//查询主键为4的记录,返回模型对象$member=Member::find(4);dump($member->name);//获取name字段的值dump($member->toArray());//将模型对象转换为数组//添加查询条件,返回name和age字
段$member=Member::where('name','tom')->select('name','age')->find(1);//查询主键为1、2、3的记录,返回对象集合$members=Mem
ber::find([1,2,3]);✎7.7模型4使用模型查询数据get()方法返回查询结果是对象集合$members=Member::where('id','1')->get();dump(get_class($members[0
]));//输出结果:"App\Member"✎7.7模型4使用模型查询数据all()方法查询表中所有记录,返回模型对象集合//查询所有记录,返回对象集合$members=Member::all();//查询所有记录的name和age字段,返回对象集合
$members=Member::all(['name','age']);✎7.7模型5使用模型修改数据先查询后保存数据:$member=Member::find(5);if($member){$memb
er->name='test';$member->email='test@laravel.test';$member->save()}else{dump('修改失败:记录不存在');}✎7.7模型5使用模型修改数据直接修改数据:Member::where('id',7)
->update(['name'=>'test','age'=>30]);✎7.7模型6使用模型删除数据先查询后删除数据:$member=Member::find(5);if($member){$member->delete()}else
{dump('删除失败:记录不存在');}✎7.7模型6使用模型删除数据直接删除数据:$data=Member::where('id',8)->delete();✎7.8自动验证1如何进行自动验证自动验证示例代码:publicfunctionsave(Request$request){$th
is->validate($request,[//'验证的字段名'=>'规则1|规则2|规则3''name'=>'required|min:2|max:20|unique:member','age'=>'required|in
teger|min:1|max:120','email'=>'required|email']);//执行到此处表示验证通过return'表单提交成功。';}✎7.8自动验证1如何进行自动验证Laravel中常见的验证规则:⚫required:表示该字段不能省略⚫m
in和max:表示验证字符串的长度或者数字的大小,取决于验证的字段的数据类型。min表示最小值,max表示最大值⚫unique:用于验证其值在某个表中是否唯一,防止出现重复值⚫integer:用于验证该字段是不是一个整数⚫email:用于验证邮箱格式✎7.8自动验证1如何进行
自动验证设置自定义的中文错误信息:$this->validate($request,['name'=>'required|min:2|max:20|unique:member','age'=>'required
|integer|min:1|max:120','email'=>'required|email'],['name.required'=>'用户名不能为空','name.min'=>'用户名最少2个字符','name.max'
=>'用户名最多20个字符','name.unique'=>'用户名已存在,请换一个','age.required'=>'年龄不能为空','age.integer'=>'年龄必须是整数','age.min'=>'年龄最小值为1','age.max'=>'年龄最大值为120','email.re
quired'=>'邮箱不能为空','email.email'=>'邮箱格式有误']);✎7.8自动验证2在Ajax请求中使用自动验证发送Ajax请求:$.ajax({url:'/test/save',
type:'POST',headers:{'X-CSRF-TOKEN':'{{csrf_token()}}'},data:{},success:function(data){console.log(JSON.parse(data));}});✎7.8自
动验证2在Ajax请求中使用自动验证在浏览器的控制台中可以看到服务器的验证结果