1、创建文章数据表及其模型(0:00~2:30)

我们已经在上一节中为博客项目完成了大部分准备工作,现在首先要做的就是为这个项目创建一个新的文章表 posts及该表对应的模型类 Post,使用如下Artisan命令即可完成这两个创建工作:

php artisan make:model --migration Post

上述命令会做两件事情:

  • 在 app 目录下创建模型类 App\Post
  • 创建用于创建 posts 表的迁移,该迁移文件位于 database/migrations 目录下。

注:如果不了解什么是迁移,可参考 Laravel 迁移文档

编辑 database/migrations 目录下刚生成的这个迁移文件内容如下:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; class CreatePostsTable extends Migration
{ /**
* Run the migrations.
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('slug')->unique();
$table->string('title');
$table->text('content');
$table->timestamps();
$table->timestamp('published_at')->index();
});
} /**
* Reverse the migrations.
*/
public function down()
{
Schema::drop('posts');
}
}

我们在默认生成的迁移文件基础上新增四个额外的列:

  • slug:将文章标题转化为URL的一部分,以利于SEO
  • title:文章标题
  • content:文章内容
  • published_at:文章正式发布时间

登录到 Homestead 虚拟机项目根目录(~/Code/vagrant/blog)运行迁移命令:

php artisan migrate

最后修改生成的默认 app/Post.php 文件内容如下:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
protected $dates = ['published_at']; public function setTitleAttribute($value)
{
$this->attributes['title'] = $value; if (! $this->exists) {
$this->attributes['slug'] = str_slug($value);
}
}
}

2、使用测试数据填充文章表(2:30~5:00)

有了第一步操作,现在文章已经有了寄身之所,接下来我们不妨创建一些随机数据填充到数据表 posts 中。这里我们要用到 Laravel 5.1 的模型工厂功能。

添加如下代码到 database/factories 目录下的 ModelFactory.php 文件中:

$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->sentence(mt_rand(3, 10)),
'content' => join("\n\n", $faker->paragraphs(mt_rand(3, 6))),
'published_at' => $faker->dateTimeBetween('-1 month', '+3 days'),
];
});

然后修改 database/seeds 目录下的 DatabaseSeeder.php 内容如下:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model; class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run()
{
Model::unguard();
$this->call('PostTableSeeder');
} } class PostTableSeeder extends Seeder
{
public function run()
{
App\Post::truncate();
factory(App\Post::class, 20)->create();
}
}

最后,还是在 Homestead 虚拟机项目根目录下运行如下 Artisan 命令将随机数据插入数据库:

php artisan db:seed

该命令执行成功后,posts 表中会多出20行记录。

3、创建配置文件(5:00~5:30)

我们还需要为博客做一些配置,比如标题和每页显示文章数。时间不多了,让我们快速行动起来。

在 config 目录下创建一个新的配置文件 blog.php,编辑其内容如下:

<?php
return [
'title' => 'My Blog',
'posts_per_page' => 5
];

在 Laravel 5.1 中,可以轻松通过帮助函数 config() 访问这些配置项,例如,config('blog.title') 将会返回title 配置项的值。

此外,如果需要的话你还可以去 config/app.php 修改时区配置。

4、创建路由控制器(5:30~7:30)

接下来修改 app/Http/routes.php 文件如下:

<?php

get('/', function () {
return redirect('/blog');
}); get('blog', 'BlogController@index');
get('blog/{slug}', 'BlogController@showPost');

这样,如果访问 http://blog.app/ 的话,页面会重定向到 http://blog.app/blog,而访问 http://blog.app/blog时,会调用  BlogController 的 index 方法来处理业务逻辑并渲染页面。同理访问 http://blog.app/blog/POST-TITLE 时,会调用  BlogController 的 showPost 方法,同时会将 POST-TITLE 的值作为参数传递给 showPost 方法。

下面我们就来创建这个控制器 BlogController

首先,使用 Artisan 命令生成一个空的控制器:

php artisan make:controller BlogController --plain

注:--plain 命令用于创建一个空的控制器而不是标准的 RESTful 风格控制器。

一个新的 BlogController.php 文件已经生成到 app/Http/Controllers 目录下,编辑其内容如下:

<?php

namespace App\Http\Controllers;

use App\Post;
use Carbon\Carbon; class BlogController extends Controller
{
public function index()
{
$posts = Post::where('published_at', '<=', Carbon::now())
->orderBy('published_at', 'desc')
->paginate(config('blog.posts_per_page')); return view('blog.index', compact('posts'));
} public function showPost($slug)
{
$post = Post::whereSlug($slug)->firstOrFail();
return view('blog.post')->withPost($post);
}
}

在控制器中,我们使用 Eloquent ORM 与数据库进行交互,并使用辅助函数 view() 渲染视图

如果要查看应用中的所有路由,可以使用如下命令:

php artisan route:list

5、创建视图(7:30~10:00)

剩下的就是创建两个视图用来显示结果了:一个用于显示文章列表,一个用于显示文章详情。

在 resources/views 目录下创建一个新的目录 blog。然后在该目录下创建一个新的视图文件 index.blade.php。使用 .blade.php 后缀的目的在于告知 Laravel 该视图文件使用 Blade 模板。编辑 index.blade.php 文件内容如下:

<html>
<head>
<title>{{ config('blog.title') }}</title>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>{{ config('blog.title') }}</h1>
<h5>Page {{ $posts->currentPage() }} of {{ $posts->lastPage() }}</h5>
<hr>
<ul>
@foreach ($posts as $post)
<li>
<a href="/blog/{{ $post->slug }}">{{ $post->title }}</a>
<em>({{ $post->published_at }})</em>
<p>
{{ str_limit($post->content) }}
</p>
</li>
@endforeach
</ul>
<hr>
{!! $posts->render() !!}
</div>
</body>
</html>

十分钟博客的最后一步就是就是创建显示文章详情的视图。在 resources/views/blog 目录下新建视图文件post.blade.php,编辑其内容如下:

<html>
<head>
<title>{{ $post->title }}</title>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>{{ $post->title }}</h1>
<h5>{{ $post->published_at }}</h5>
<hr>
{!! nl2br(e($post->content)) !!}
<hr>
<button class="btn btn-primary" onclick="history.go(-1)">
« Back
</button>
</div>
</body>
</html>

好了,接下来我们可以去浏览器中进行测试了,访问 http://blog.app,页面显示如下:

文章详情页显示如下:

基于Laravel开发博客应用系列 —— 十分钟搭建博客系统的更多相关文章

  1. 基于Laravel开发博客应用系列 —— 构建博客后台管理系统

    一个完整的博客应用不能没有后台管理系统.所以在本节中我们将继续完善博客应用 —— 开发后台管理系统. 1.创建路由 在上一节十分钟创建博客项目中,已经设置过了 app/Http/routes.php, ...

  2. 十分钟搭建和使用ELK日志分析系统

    前言 为满足研发可视化查看测试环境日志的目的,准备采用EK+filebeat实现日志可视化(ElasticSearch+Kibana+Filebeat).题目为“十分钟搭建和使用ELK日志分析系统”听 ...

  3. 基于 Laravel 开发博客应用系列 —— 设置 Linux/Mac 本地开发环境

    1.不同 Linux 发行版本的区别 不同的 Linux 发行版本之间有一些细微区别,尤其是包管理器:CentOS 和 Fedora 使用 yum 作为包管理器,而Ubuntu 使用  apt,在 O ...

  4. 基于 Laravel 开发 ThinkSNS+ 中前端的抉择(webpack/Vue)踩坑日记【ThinkSNS+研发日记系列】

    在上一篇文章< ThinkSNS+基于Laravel master分支,从1到 0,再到0.1>,简单的介绍了 社群系统ThinkSNS+ ,这里分享在开发过程中,前端选择的心理活动. L ...

  5. 基于 Laravel 开发 ThinkSNS+ 中前端的抉择(webpack/Vue)踩坑日记

    在上一篇文章< ThinkSNS+基于Laravel master分支,从1到 0,再到0.1>,简单的介绍了 ThinkSNS+ ,这里分享在开发过程中,前端选择的心理活动. Larav ...

  6. [Pulsar系列] 10分钟学会Pulsar消息系统概念

    Apache Pulsar Pulsar是一个支持多租户的.高性能的服务与服务之间消息通讯的解决方案,最初由雅虎开发,现在由Apache软件基金会管理. Pulsar的主要特性如下: Pulsar实例 ...

  7. 十分钟搭建个人网站:Jekyll主题BoHu

    最近花了三天时间制作了我的第一个jekyll theme--BoHu.一款知乎风格的模板,使用jekyll模板引擎,十分钟就能搭建属于你自己的静态博客网站. 本主题的特征为: 知乎风格 分页导航使用的 ...

  8. WordPress多本小说主题–WNovel主题发布,十分钟搭建小说站! 现已更新至1.2版本

    本文属于<WNovel主题操作手册>文章系列,该系列共包括以下 8 部分: WNovel主题使用手册之–主题安装及更新教程 WNovel主题使用手册之–小说管理 WNovel主题使用手册之 ...

  9. 十分钟搭建微服务框架(SpringBoot +Dubbo+Docker+Jenkins源码)

    本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 这套微服务框架能干啥? 这套系统搭建完之后,那可就厉害了: 微服务架构 你的整个应用程 ...

随机推荐

  1. 深入分析Parquet列式存储格式

    Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0. 列式存储 列式存 ...

  2. pandas 实现rfm模型

    import pandas as pd import numpy as np df = pd.read_csv('./zue_164466.csv') df['ptdate'] = pd.to_dat ...

  3. Jekins - Hello world,Jekins + Maven + Git + Tomcat 的简单应用

    Java Web 工程 新建一个简单的 Java Web 工程,并提交至 GitHub,可参考 Eclipse 提交工程至 GitHub 下载 jekins.war 在 http://mirrors. ...

  4. [整理]SQL Server Reporting Services Charts

    http://msdn.microsoft.com/zh-cn/library/aa964128.aspx#mainSectionhttp://msdn.microsoft.com/en-us/lib ...

  5. Cloudera Manager Admin控制台启动不起来

    这几天都在搞大数据这一块,由于以前自己在弄hadoop等安装的时候特别的费劲,于是乎找到了广大程序员的福音——cloudera manager,但是第一步安装好了以后无法启动,再三思考+百度发现: 通 ...

  6. 05.UIDynamic

    CHENYILONG Blog 05.UIDynamic Fullscreen © chenyilong. Powered by Postach.io Blog

  7. windebug常用命令

    使用~查看所有线程 切换到一号线程:~1s 查看所有线程的托管堆栈  ~* e!clrstack 怎么查看,当前线程下,变量的信息? 对于托管代码而言,最核心的命令就是!do(dump object的 ...

  8. mysql5.7.10 源码编译安装记录 (centos6.4)【转】

    一.准备工作 1.1 卸载系统自带mysql 查看系统是否自带MySQL, 如果有就卸载了, 卸载方式有两种yum, rpm, 这里通过yum卸载 rpm -qa | grep mysql //查看系 ...

  9. IIS错误:在唯一密钥属性“fileExtension”设置为“.mp4”时,无法添加类型为“mimeMap”的重复集合项

    之前的IIS配置中,.mp4类型的文件默认无法访问,所以个人在IIS7.5的mime类型中增加了.mp4的类型的支持,但问题是需要每台机器中增加这些设置,不利于团队协作,于是,只好将这些修改体现在代码 ...

  10. 移动web特殊样式处理

    一.高清图片 二.一像素边框 还有一种解决办法: border-1px($color) position: relative &:after display: block position: ...