当前位置: 首页 > 后端技术 > PHP

Laravel5.4入门系列6.文章创建

时间:2023-03-29 19:14:39 PHP

基本功能创建文章的第一步是用户发送请求,然后返回到创建文章的页面。路由:处理用户“创建帖子”的请求/routes/web.phpRoute::get('/posts/create','PostsController@create');Controller:返回后期编辑视图/app/Http/Controllers/PostsController。phppublicfunctioncreate(){returnview('posts.create');}视图:使用Bootstrap组件创建文章编辑页面/resources/views/posts/create.blade.php@extends('layouts.master')@section('content')

创建帖子


title
content
submit
@endsectionaction方法根据controller生成对应的route,也可以使用之前学过的url方法:生成的url如下:用户提交后,用户提交需要在路由中处理数据请求:/routes/web.phpRoute::post('/posts','PostsController@store');最后,为了保存文章,我们使用request()方法来获取请求字段,保存首页后跳转到博客:useApp\Post;publicfunctionstore(){$post=newPost();$post->title=request('title');$post->body=request('body');$post->save();returnredirect('posts');}现在,访问posts/create,创建post后点击submit,查看效果其实会报错报:TokenMismatchExceptioninVerifyCsrfToken.phpline68AddCSRFprotection虽然我们已经完成ted基本功能,但是提交请求的时候还是会报错。其实这是为了防止CSRF攻击。举个简单的例子,你登录一个投票网站,发送这个请求给25号人投票:http://example.com/vote/25CSRF是如何攻击的?顾名思义,CSRF是Cross-siterequestforgery的缩写,即跨站请求伪造,所以需要满足两个条件:跨站。首先,我登录了投票网站,该网站保存了我的,然后我登录了另一个网站;假请求。在其他网站的界面中,可能包含等HTML代码。由于投票网站无法区分您将请求发往何处,则表示您投票给了30号选手;解决方法也很简单:当你登陆网站A,当你生成token提交请求时,token也被提交了第一步,验证两者。Laravel已经为我们实现了它:/vendor/laravel/framework/src/Illuminate/Session/Store.phppublicfunctionstart(){$this->loadSession();如果(!$this->has('_token')){$this->regenerateToken();}return$this->started=true;}第二步Laravel也帮我们封装好了,直接使用csrf_field()函数即可,我们可以在文章编辑表单中添加:/resources/views/posts/create.blade.php

创建文章


{{csrf_field()}}Title
可以看看函数长什么样:functioncsrf_field(){returnnewHtmlString('');}因此,我们也可以写:最后一步,Laravel通过中间件进行自动检查:publicfunctionhandle($request,Closure$next){if($this->isReading($request)||$this->runningUnitTests()||$this->inExceptArray($request)||$this->tokensMatch($request)){return$this->addCookieToResponse($request,$next($request));}thrownewTokenMismatchException;}简单解释下、中间件的处理流程:判断请求类型,如果是GET、HEAD、OPTIONS等不改变资源的请求,则通过;如果是测试环境,则通过;在url中添加$except数组默认会通过;tokens匹配也会通过;通过后会添加一个名为XSRF-TOKEN的cookie;如果不通过则会抛出异常,也就是我们上一节展示的错误信息批量创建文章刚才我们使用了save()方法来保存文章。其实也可以使用create()方法,它允许一次插入多条数据,所以必须指定一个允许批量插入的字段:/app/Post。phpclassPostextendsModel{protected$fillable=['title','body',];}store()方法可以写成:/app/Http/Controllers/PostsController.phppublicfunctionstore(Request$request){Post::create(['title'=>request('title'),'body'=>request('body')]);returnredirect("posts");}或将数组传递给request():/app/Http/Controllers/PostsController.phppublicfunctionstore(Request$request){Post::create(request(['title','body']));returnredirect("posts");}添加字段验证,然后进一步完善创建文章的功能,即字段验证。可以直接使用validate方法:/app/Http/Controllers/PostsController.phppublicfunctionstore(Request$request){$this->validate(request(),['title'=>'required|unique:posts|max:255','body'=>'required|min:5',]);发布::创建(请求(['标题','正文']));returnredirect("posts");}我们在title中添加非空、唯一性和最大字符数的验证规则,在body字段中添加非空和最小字符数的规则。如果违反规则,错误信息$errors会自动保存在session中的flashmemory中,也就是只有下次请求才会生效。并且,我们不需要返回给视图,Laravel已经帮我们做了,我们所有的视图都可以获得$errors变量,可以显示:/resources/views/layouts/master.blade.php@include('layouts.errors');@include('layouts.footer')具体错误信息:/resources/views/layouts/errors.blade.php@if(count($errors))
    @foreach($errors->all()as$error)
  • {{$error}}
  • @endforeach
@endifFormsBootstrapCSRF(跨站请求伪造)攻击示例和PHP中的预防-堆栈内存溢出