Laravel 系列入门教程(四)【最适合中国人的 Laravel 教程】
本篇文章中,我将跟大家一起实现 Article 的新增、编辑和删除功能,仔细解读每一段代码,相信本篇文章看完,你就能够 get Laravel 使用之道。 RESTful 资源控制器资源控制器是 Laravel 内部的一种功能强大的约定,它约定了一系列对某一种资源进行“增删改查”操作的路由配置,让我们不再需要对每一项需要管理的资源都写 N 行重复形式的路由。中文文档见: 我们只需要写一行简单的路由: Route::('photo','PhotoController');
就可以得到下面 7 条路由配置: 左边是 HTTP 方法,中间是 URL 路径,右边是 控制器中对应的函数,只要某个请求符合这七行中某一行的要求,那么这条请求就会触发第三列的 function。这是 Laravel 对于 RESTful 的规范,它不仅仅帮我们省去了几行路由配置代码,更是如何合理规划 URL 的指路明灯,相信你会从中学到很多。 下面我们正式开始一项一项地实现 Article 的新增、编辑、删除功能: 开始行动配置资源路由将当前路由配置中的? 修改之前写好的视图文件由于从单数变成了复数,后台首页及文章列表页的视图文件里的链接也需要修改。
新增 Article新增一篇文章需要两个动作:第一步,获取“新增Article”的页面;第二步,提交数据到后端,插入一篇文章到数据库。我们使用下图中红框内的两条路由规则来实现这两步操作: 获取“新增Article”的页面第一个红框里告诉我们应该使用? view('admin/article/create'
新增视图文件? @('layouts.app'@section('content'<span style="color: #000000">) <div <span style="color: #0000ff">class="container"> <div <span style="color: #0000ff">class="row"> <div <span style="color: #0000ff">class="col-md-10 col-md-offset-1"> <div <span style="color: #0000ff">class="panel panel-default"> <div <span style="color: #0000ff">class="panel-heading">新增一篇文章 <div <span style="color: #0000ff">class="panel-body"><span style="color: #000000">
点击文章管理页面最上面的“新增”按钮,你将得到以下页面: 视图调用上文中我使用?
提交数据到后端“新增Article”的页面已经展示出来,下一步就是提交数据到后端了,理解提交数据,要从 HTML 表单开始。 表单视图文件中有一个表单: 这是一个非常普通的 HTML form(表单),只有两点需要我们费点心思去理解。 第一,表单的 action。form 是 HTML 规范,在点击了表单中的提交按钮后,浏览器会使用 method 属性的值(GET、POST等)将某些数据组装好发送给 action 的值(URL),这里我们动态生成了一个 URL 作为 action,并且指定了表单提交需要使用 POST 方法。 第二,csrf_field。这是 Laravel 中内置的应对 CSRF 攻击的防范措施,任何 POST PUT PATCH 请求都会被检测是否提交了 CSRF 字段。对应的代码为? {!! csrf_field() !!}?实际上会生成一个隐藏的 input: 这一行也可以这么写: 如果你的系统有很多的 Ajax,而你又不想降低安全性,这里的 csrf_token() 函数将会给你巨大的帮助。 后端接收数据我们在页面中随便填入一些数据,点击提交按钮,这条请求会被分配到那里呢? 第二个红框告诉我们,应该向? store(Request ->validate(,'title' => 'required|unique:articles|max:255','body' => 'required',
</span><span style="color: #800080">$article</span> = <span style="color: #0000ff">new</span><span style="color: #000000"> Article;
</span><span style="color: #800080">$article</span>->title = <span style="color: #800080">$request</span>->get('title'<span style="color: #000000">);
</span><span style="color: #800080">$article</span>->body = <span style="color: #800080">$request</span>->get('body'<span style="color: #000000">);
</span><span style="color: #800080">$article</span>->user_id = <span style="color: #800080">$request</span>->user()-><span style="color: #000000">id;
</span><span style="color: #0000ff">if</span> (<span style="color: #800080">$article</span>-><span style="color: #000000">save()) {
</span><span style="color: #0000ff">return</span> redirect('admin/articles'<span style="color: #000000">);
} </span><span style="color: #0000ff">else</span><span style="color: #000000"> {
</span><span style="color: #0000ff">return</span> redirect()->back()->withInput()->withErrors('保存失败!'<span style="color: #000000">);
}
} 检验成果填入数据: 点击按钮,页面跳转到“文章管理”页,将此页面拉到最底部: 恭喜你,文章新增功能完成! 详细注释下面我已注释的形式细细解析每一段代码的作用: store(Request )
->validate(,
'body' => 'required',
</span><span style="color: #008000">//</span><span style="color: #008000"> 通过 Article Model 插入一条数据进 articles 表</span>
<span style="color: #800080">$article</span> = <span style="color: #0000ff">new</span> Article; <span style="color: #008000">//</span><span style="color: #008000"> 初始化 Article 对象</span>
<span style="color: #800080">$article</span>->title = <span style="color: #800080">$request</span>->get('title'); <span style="color: #008000">//</span><span style="color: #008000"> 将 POST 提交过了的 title 字段的值赋给 article 的 title 属性</span>
<span style="color: #800080">$article</span>->body = <span style="color: #800080">$request</span>->get('body'); <span style="color: #008000">//</span><span style="color: #008000"> 同上</span>
<span style="color: #800080">$article</span>->user_id = <span style="color: #800080">$request</span>->user()->id; <span style="color: #008000">//</span><span style="color: #008000"> 获取当前 Auth 系统中注册的用户,并将其 id 赋给 article 的 user_id 属性
// 将数据保存到数据库,通过判断保存结果,控制页面进行不同跳转</span>
<span style="color: #0000ff">if</span> (<span style="color: #800080">$article</span>-><span style="color: #000000">save()) {
</span><span style="color: #0000ff">return</span> redirect('admin/articles'); <span style="color: #008000">//</span><span style="color: #008000"> 保存成功,跳转到 文章管理 页</span>
} <span style="color: #0000ff">else</span><span style="color: #000000"> {
</span><span style="color: #008000">//</span><span style="color: #008000"> 保存失败,跳回来路页面,保留用户的输入,并给出提示</span>
<span style="color: #0000ff">return</span> redirect()->back()->withInput()->withErrors('保存失败!'<span style="color: #000000">);
}
} 编辑 Article这两行路由配置可以满足我们的需求: 上面一行:展示“编辑某一篇文章”的表单;下面一行:上传数据并到数据库更新这篇文章。 这个就当做第二个小作业留给你们,尝试自己去构建吧这里面还有个小坑,参考我的代码就可以迅速地解决呦 删除 Article删除某个资源跟新增、编辑相比最大的不同就是运行方式的不同:删除按钮看起来是一个独立的按钮,其实它是一个完整的表单,只不过只有这一个按钮暴露在页面上: 大家可能注意到了这句代码? 在控制器中增加删除文章对应的是 destroy 方法: destroy(::find()-> redirect()->back()->withInput()->withErrors('删除成功!'
点击删除按钮,检验效果: 恭喜你,文章新增、编辑、删除功能构建成功! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |