利用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极大的增强功能和性能
Oct 09 PHP
php 读取文件乱码问题
Feb 20 PHP
PHP中调用ASP.NET的WebService的代码
Apr 22 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
php计算整个mysql数据库大小的方法
Jun 19 PHP
Symfony2创建基于域名的路由相关示例
Nov 14 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
PHP创建XML接口示例
Jul 04 PHP
laravel5表单唯一验证的实例代码
Sep 30 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
php cookie 详解使用实例
2016/11/03 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
jQuery父级以及同级元素查找介绍
2013/09/04 Javascript
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
详解python时间模块中的datetime模块
2016/01/13 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
python实现图片识别汽车功能
2018/11/30 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
python文件路径操作方法总结
2020/12/21 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
怎么样写好简历中的自我评价
2013/10/25 职场文书
资料员的岗位职责
2013/11/20 职场文书
老公给老婆的保证书
2014/04/28 职场文书
篮球比赛策划方案
2014/06/05 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
Python机器学习之基础概述
2021/05/19 Python
mysql函数全面总结
2021/11/11 MySQL
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏