在后台实现文章标签增删改查功能


我们在十分钟开发博客项目一节开发的博客应用只是一个基本的博客系统,还有许多地方需要进一步完善。对大多数博客平台而言,例如 Wordpress,都可以给博客文章添加分类或标签,本节我们就来为博客文章添加标签功能。

1、创建标签模型和迁移

首先需要创建 Tag 模型类:

该命令会在 app/Models 目录下创建模型类文件 Tag.php,由于我们在 make:model 命令中使用了 --migration 选项,所以同时会创建 Tag 模型对应数据表 tags 的数据库迁移。

在标签(Tag)和文章(Post)之间存在多对多的关联关系,因此还要按照下面的命令创建存放文章和标签对应关系的数据表迁移:

编辑标签迁移文件

database/migrations 目录下编辑新创建的标签迁移文件内容如下:

下面我们对上面迁移文件中新增的字段作简要说明:

  • page_image:标签图片
  • meta_description:标签介绍
  • layout:博客终归要使用布局
  • reverse_directions:在文章列表按时间升序排列博客文章(默认是降序)

编辑文章与标签对应关系迁移

编辑文章与标签对应关系表迁移文件内容如下:

运行迁移

登录到 Laradock,在项目根目录下通过运行如下 Artisan 命令以生成这两个数据表:

2、实现 admin.tag.index

在博客后台管理一节中我们已经创建了 TagController 并定义了相应的路由。实现 admin.tag.index 就跟玩儿似地,只需要更新 TagControllerindex 方法,然后为其提供一个渲染视图即可。

实现 TagController@index

app/Http/Controllers/Admin 目录下修改 TagControllerindex 方法如下:

很简单吧,只需要返回一个传递 $tags 变量的视图。

创建 admin.tag.index 视图

接下来我们来渲染这个视图,首先在 resources/views/admin 目录下创建一个 tag 子目录,然后在该目录下创建 index.blade.php 并编辑其内容如下:

这个模板很简单,我们使用了后台布局,在文件顶部是页面标题和创建新标签的按钮,然后用表格来显示所有标签,最后,在页面顶部我们引入了一些 JavaScript 脚本将表格转化为 DataTables。

还有两个被包含进来的局部视图:admin.partials.errorsadmin.partials.successadmin.partials.errors 已经在构建后台管理系统一节中创建了,但 admin.partials.success 还没有创建。下面我们就来创建这个局部视图。

创建返回成功信息局部视图

resources/views/admin/partials 目录下创建 success.blade.php 文件,编辑其内容如下:

访问后台标签管理列表

在浏览器中访问 http://blog.app/admin/tag

现在还没有任何数据,所以是个空的列表。

3、实现 admin.tag.create

接下来我们将会实现添加标签功能,这样当你点击「新增标签」按钮时就会跳转到填写标签表单页面。

实现 TagController@create

修改 app/Http/Controllers/Admin 目录下的 TagController 如下:

该方法会在点击「添加新标签」或者表单被填充但是验证失败时执行,对于后者我们会将传过来的数据通过 old 方法回写到表单中。

创建 admin.tag.create 视图

resources/views/admin/tag 目录下新建 create.blade.php 文件,编辑其内容如下:

由于我们会在添加和编辑标签时共用同一个表单,所以我们将表单部分放到一个独立的局部视图 admin.tag._form 中,下面我们就来创建这个局部视图:

创建 admin.tag._form 局部视图

resources/views/admin/tag 目录下新建一个 _form.blade.php 文件,编辑其内容如下:

在后台标签列表中点击「新增标签」按钮访问刚刚创建的页面:

4、实现 admin.tag.store

现在我们已经有了创建标签表单,还需要编写表单被提交后保存标签的业务逻辑代码。

创建表单请求类 TagCreateRequest

Laravel 的一个优秀特性就是表单请求类,这些类可以对指定表单字段进行验证。

使用如下 Artisan 命令创建一个新的 TagCreateRequest

创建的类存放在 app/Http/Requests 目录下,编辑刚刚创建的 TagCreateRequest.php 文件内容如下:

该类继承自 Illuminate\Foundation\Http\FormRequest,当该类实例化的时候就会对请求进行验证,需要验证的项目有两个:

  • authorize() :验证用户是否经过登录认证
  • rules():返回验证规则数组

表单请求的神奇之处在于会在表单请求类实例化的时候对请求进行验证,如果验证失败,会直接返回表单提交页面并显示错误信息。这意味着如果将表单请求作为控制器方法参数,那么验证工作将会在执行对应方法第一行代码之前进行。接下来我们就来定义保存的控制器方法。

实现 TagController@store

编辑控制器 TagController.php 代码如下:

现在,通过依赖注入,TagCreateRequest 被构造、表单被验证,只有验证通过后才会将请求参数传递到 store 方法。store 方法接下来才会创建并保存新的 Tag 实例。最后,页面重定向到后台标签列表,并带上保存成功消息:

点击「添加新标签」按钮提交表单,保存成功:

5、实现 admin.tag.edit

接下来,我们来编辑路由方法 admin.tag.edit 来显示标签编辑表单。

实现 TagController@edit

更新 TagController 控制器,编辑 edit 方法如下:

创建 admin.tag.edit 视图

resources/views/admin/tag 目录下,创建 edit.blade.php 并编辑其内容如下:

在浏览器中访问编辑页面

现在如果在列表页点击标签的编辑按钮,就会看到编辑表单,如果点击删除按钮则会弹出确认按钮:

当然,标签现在还不能真的被删除或更新,接下来我们要在后台实现其业务逻辑。

6、实现 admin.tag.update

admin.tag.store 路由处理 admin.tag.create 表单请求一样,我们使用 admin.tag.update 路由处理 admin.tag.edit 表单请求。

创建表单请求类 TagUpdateRequest

我们使用如下 Artisan 命令生成处理更新表单请求类 TagUpdateRequest

然后编辑刚刚生成的 TagUpdateRequest.php 文件(该文件位于 app/Http/Requests 目录下):

该请求处理类和 TagCreateRequest 基本一样。

实现 TagController@update

接下来我们更新 TagController.php 文件内容如下:

现在我们就可以编辑标签并点击「保存修改」按钮实现标签修改操作。

7、实现标签删除功能

到目前为止,我们已经基本完成后台标签功能了(我们后续将会在博客文章创建及编辑中实现标签与文章的绑定),剩下来要做的就是实现标签删除功能了。

实现 TagController@destroy

要在编辑标签页面实现删除标签功能,首先要修改 TagController.phpdestroy 方法如下:

没有任何神奇的地方:获取标签、删除标签,删除成功后重定向到标签列表页:

移除 admin.tag.show

你可能已经注意到还有一个路由到目前为止还没有被使用,admin.tag.show 用来显示标签详情,该路由通常用于给那些没有编辑权限的用户查看详情。

在本系统中我们不需要查看标签详情(实际上这个功能也没有什么意义),所以将其删除。

首先在 routes/web.php 中修改路由如下:

然后在控制器 TagController.php 中移除 show() 方法。

下一节我们将会为博客系统实现文件上传功能。


<< 上一篇: 构建博客后台管理系统

>> 下一篇: 在后台实现文件上传删除管理功能