利用laravel搭建一个迷你博客实战教程


Posted in PHP onAugust 13, 2017

本文主要给大家介绍的是关于利用laravel搭建一个迷你博客的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

一、设计与思路

在开始写第一行代码之前,一定要尽量从头到尾将我们要做的产品设计好,避免写完又改,多写不必要的代码。

  • 需求分析:我们的迷你博客应该至少包含:新增/编辑/查看/删除文章,以及文章列表展示功能。
  • 数据库分析:基于这个功能,我们只需要一张 Articles 数据表来存放文章即可。
  • 页面结构分析:应该使用模板继承建立一张基础模板包含:头部/文章列表/底部信息

二、创建路由

完成这个博客大概需要以下几条路由:

| 路由 | 功能 | | -------- | ---------------- | | 文章列表页面路由 | 返回文章列表页面 | | 新增文章页面路由 | 返回新增文章页面 | | 文章保存功能路由 | 将文章保存到数据库 | | 查看文章页面路由 | 返回文章详情页面 | | 编辑文章页面路由 | 返回编辑文章页面 | | 编辑文章功能路由 | 将文章取出更新后重新保存到数据库 | | 删除文章功能路由 | 将文章从数据库删除 |

可以看到几乎全部是对文章的数据操作路由,针对这种情况,Laravel 提供了非常方便的办法:RESTful 资源控制器和路由。

打开routes.php加入如下代码:

Route::resource('articles', 'ArticlesController');

只需要上面这样一行代码,就相当于创建了如下7条路由,且都是命名路由,我们可以使用类似route('articles.show') 这样的用法。

Route::get('/articles', 'ArticlesController@index')->name('articles.index'); 
Route::get('/articles/{id}', 'ArticlesController@show')->name('articles.show'); 
Route::get('/articles/create', 'ArticlesController@create')->name('articles.create'); 
Route::post('/articles', 'ArticlesController@store')->name('articles.store'); 
Route::get('/articles/{id}/edit', 'ArticlesController@edit')->name('articles.edit'); 
Route::patch('/articles/{id}', 'ArticlesController@update')->name('articles.update'); 
Route::delete('/articles/{id}', 'ArticlesController@destroy')->name('articles.destroy');

三、创建控制器

利用 artisan 创建一个文章控制器:

php artisan make:controller ArticlesController

四、创建基础视图

resources/views/layouts/art.blade.php

见模板index.html

五、新建文章表单

@extends('layouts.art')
@section('content')

 <form class="form-horizontal" method="post" action="{{route('blog.store')}}">
   {{ csrf_field() }}
 <div class="form-group">
 <label for="inputEmail3" class="col-sm-2 control-label">标题</label>
 <div class="col-sm-8">
  <input type="title" class="form-control" id="title" name="title">
 </div>
 </div>

 <div class="form-group">
 <label for="inputEmail3" class="col-sm-2 control-label">内容</label>
 <div class="col-sm-8">
  <textarea class="form-control" rows="5" id="content" name="content"></textarea>
 </div>
 </div>

 <div class="form-group">
 <div class="col-sm-offset-2 col-sm-10">
  <button type="submit" class="btn btn-default">创建</button>
 </div>
 </div>
</form> 
@endsection

六、文章存储

此时如果你填写新建文章表单点击提交也会跳到一个空白页面,同样的道理,因为我们后续的控制器代码还没写。

要实现文章存储,首先要配置数据库,创建数据表,创建模型,然后再完成存储逻辑代码。

1、配置数据库

修改.env文件

2、创建数据表

利用 artisan 命令生成迁移:

php artisan make:migration create_articles_talbe --create=articles

修改迁移文件

public function up() 
 {
  Schema::create('articles', function (Blueprint $table) {
   $table->increments('id');
   $table->string('title');
   $table->longText('content');
   $table->timestamps();
  });
 }
public function down() 
 {
  Schema::dropIfExists('articles');
 }

我们创建了一张 articles 表,包含递增的 id 字段,字符串title字段,长文本content字段,和时间戳。

执行数据库迁移:

php artisan migrate

登录mysql,查看数据表。

3、创建模型

利用 artisan 命令创建模型:

php artisan make:model Article

打开模型文件,输入以下代码:

app/Article.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model 
{
 //对应的表
 protected $table = 'articles';
 //通过model可以写入的字段
 protected $fillable = [
  'title', 'content',
 ];
}

4、存储逻辑代码

打开 ArticlesController.php 控制器,找到 store() 方法。

app/Http/Controllers/ArticlesController.php

public function store(Request $request)
 {
  //数据验证 错误处理
  $this->validate($request,[
   'title'=>'required|max:50',
   'content'=>'required|max:500',
   ]);
  // 1 orm方式写入
  $article = Article::create([
   'title'=>$request->title,
   'content'=>$request->content,
   ]);
  //2 或者
  /* $article = new Article();
   $article->title =$request->title;
   $article->content = $request->content;
   $article->save();*/

   //3 db方式写入
   //insert()方法返回值为true 和 false
   //$res = DB::table('articles')->insert(['title'=>$request->title,'content'=>$request->content]);
  return redirect()->route('blog.index');
 }

验证错误显示

@if (count($errors) > 0)
 <div class="alert alert-danger">
  <ul>
   @foreach($errors->all() as $error)
   <li>{{ $error }}</li>
   @endforeach
  </ul>
 </div>
@endif

七、文章列表展示

完成了添加文章功能后,就可以实现我们的文章列表展示页了。

打开 ArticlesController.php 找到 index() 方法,添加代码如下:

app/Http/Controllers/ArticlesController.php

use App\Article;

public function index() 
 {
  $articles = Article::orderBy('created_at','asc')->get();

  return view('articles.index', ['articles'=>$articles]);
 }

视图index.blade.php

@extends('layouts.art')
@section('content')

 <a class="btn btn-primary" href="{{route('blog.create')}}" rel="external nofollow" >添加文章</a>


 @foreach($articles as $article)
 <div class="panel panel-default">
 <div class="panel-body">
 {{$article->title}}
 <a href="{{route('blog.show',$article->id)}}" rel="external nofollow" class="btn btn-info">阅读</a>
 <a href="{{route('blog.edit', $article->id)}}" rel="external nofollow" class="btn btn-info">修改</a>

  <form action="{{ route('blog.destroy', $article->id) }}" method="post" style="display: inline-block;">
   {{ csrf_field() }}
   {{ method_field('DELETE') }}
   <button type="submit" class="btn btn-danger">删除</button>
  </form>
 </div>
 </div>
 @endforeach

 {!! $articles->render() !!}
 @endsection

八、编辑文章表单

编辑文章表单其实和之前创建的新建文章表单很类似,只是需要额外将现有的数据读取出来填在表单上。

首先我们在文章列表页的每个文章上添加一个编辑按钮:

视图:

@extends('layouts.art')
@section('content')

 <form class="form-horizontal" method="post" action="{{route('blog.update',$article->id)}}">
   {{ csrf_field() }}
  {{ method_field('PATCH') }}
 <div class="form-group">
 <label for="inputEmail3" class="col-sm-2 control-label">标题</label>
 <div class="col-sm-10">
  <input type="title" class="form-control" id="title" name="title" value="{{ $article->title }}">
 </div>
 </div>


 <div class="form-group">
 <label for="inputEmail3" class="col-sm-2 control-label">内容</label>
 <div class="col-sm-10">
  <textarea class="form-control" rows="5" id="content" name="content"> {{ $article->content }}</textarea>
 </div>
 </div>


 <div class="form-group">
 <div class="col-sm-offset-2 col-sm-10">
  <button type="submit" class="btn btn-default">修改</button>
 </div>
 </div>
</form> 
@endsection

注意这段代码中的 {{ method_field('PATCH') }} ,这是跨站方法伪造,HTML 表单没有支持 PUT、PATCH 或 DELETE 动作。所以在从 HTML 表单中调用被定义的 PUT、PATCH 或 DELETE 路由时,你将需要在表单中增加隐藏的 _method 字段来伪造该方法,详情参考 官方文档。

控制器

//展示修改模板
public function edit($id) 
 {
  $article = Article::findOrFail($id);
  return view('art.edit',['article'=>$article]);
 }
//执行修改
public function update(Request $request, $id) 
 {
  $this->validate($request, [
   'title' => 'required|max:50',
   'content'=>'required|max:500',
  ]);

  $article = Article::findOrFail($id);
  $article->update([
   'title' => $request->title,
   'content' => $request->content,
  ]);

   return redirect()->route('blog.index');
 }

九、删除文章

删除按钮

<form action="{{ route('blog.destroy', $article->id) }}" method="post" style="display: inline-block;">
   {{ csrf_field() }}
   {{ method_field('DELETE') }}
   <button type="submit" class="btn btn-danger">删除</button>
  </form>

控制器:

public function destroy($id) 
 {
  $article = Article::findOrFail($id);
  $article->delete();
  return back();
 }

十、结语

本次实验通过一个很简单的迷你博客对 Laravel RESTful 资源控制器和路由,视图,orm进行了强化练习。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
mac下安装nginx和php
Nov 04 PHP
php分页代码学习示例分享
Feb 20 PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 PHP
php 生成Tab键或逗号分隔的CSV
Sep 24 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
Mar 14 PHP
laravel批量生成假数据的方法
Oct 09 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
Apr 26 PHP
Laravel框架集合用法实例浅析
May 14 PHP
利用laravel+ajax实现文件上传功能方法示例
Aug 13 #PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 #PHP
php数据序列化测试实例详解
Aug 12 #PHP
PHP新特性之字节码缓存和内置服务器
Aug 11 #PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
Aug 11 #PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 #PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 #PHP
You might like
PHP的宝库目录--PEAR
2006/10/09 PHP
支持oicq头像的留言簿(一)
2006/10/09 PHP
php str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
Angularjs过滤器使用详解
2016/05/25 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
python列出目录下指定文件与子目录的方法
2015/07/03 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
初学者学习Python好还是Java好
2020/05/26 Python
Pycharm安装python库的方法
2020/11/24 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
九州传奇上机题
2014/07/10 面试题
英文版餐饮运营管理求职信
2013/11/06 职场文书
计算机毕业大学生推荐信
2013/12/01 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
干部培训自我鉴定
2014/01/22 职场文书
个性婚礼策划方案
2014/05/17 职场文书
学校节能减排方案
2014/06/13 职场文书
党员剖析材料范文
2014/09/30 职场文书
工程质检员岗位职责
2015/04/08 职场文书
小学生手册家长意见
2015/06/03 职场文书
立案决定书范文
2015/06/24 职场文书
小学运动会报道稿
2015/07/22 职场文书
母亲节感言
2015/08/03 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android