一步一步用laravel开发回风博客系统-05-内容Seed和展现

原作者网站:http://laravelcoding.com/blog?tag=L5+Beauty
可以参考中文站点:http://laravelacademy.org/resources/blog

我是基于5.2的,而且有些东西我觉得有必要有的没必要,所以思路是跟着以上两个参考着搞,具体还是有区别的,我最终代码放在了Github:https://github.com/wedojava/hfblog.dev

由于正在补英语,所以有些我能看懂的就没从原作者那里翻译。

上一节,我们已经完成了 Markdown 相关的一些准备工作。本节,我们通过 artisan 添加内容表和数据,并展现他们,当然了,刚开始的界面要简陋些。

创建表迁移文件

php artisan make:model --migration Post

该命令会做两件事情:

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

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

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

Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->string('subtitle');
$table->text('content_raw');
$table->text('content_html');
$table->string('page_image');
$table->string('meta_description');
$table->boolean('is_draft');
$table->string('layout')->default('blog.layouts.post');
$table->timestamps();
$table->timestamp('published_at')->index();
});

字段说明:

  • title:文章标题
  • subtitle:文章副标题
  • content_raw:文章原文,Markdown格式文本
  • content_html:使用 Markdown 编辑内容但同时保存 HTML 版本
  • page_image:文章缩略图(封面图)
  • meta_description:文章备注说明
  • is_draft:该文章是否被“删除”
  • layout:使用的布局
  • published_at:文章正式发布时间

运行迁移

迁移已经创建并编辑好了,接下来我们登录到 Homestead 虚拟机中运行该迁移:

php artisan migrate

现在数据库部分已经完成了!

填充数据

接下来我们不妨创建一些随机数据填充到数据表 posts 中。这里我们要用到 Laravel 5.1 的模型工厂功能。

1、添加如下代码到 database/factories/ModelFactory.php 文件中:

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

注意到实际的数据表中还有很多字段没有填,这个先不管,我们先填写主要的,至于 content_html,我们需要写一些方法到 Post 模型中。

/**
* Set the HTML content automatically when the raw content is set
*
* @param string $value
*/
public function setContentRawAttribute($value)
{
$markdown = new Markdowner();
$this->attributes['content_raw'] = $value;
$this->attributes['content_html'] = $markdown->toHTML($value);
}

setContentRawAttribute 是怎么回事呢?请看相关文档:Laravel官方文档Laravel学院的文档

2、添加PostTableSeeder类

在网站根目录下运行:

php artisan make:seeder PostsTableSeeder

修改新建的PostsTableSeeder.php为:

<?php

use Illuminate\Database\Seeder;

class PostsTableSeeder extends Seeder
{

/**
* Run the database seeds.
*
* @return void
*/

public function run()
{

App\Post::truncate();
factory(App\Post::class, 20)->create();
}
}

truncate()?

If you wish to truncate the entire table, which will remove all rows and reset the auto-incrementing ID to zero, you may use the truncate method.

修改 database/seeds/DatabaseSeeder.phprun()方法:

public function run()
{
Model::unguard();

// $this->call(UserTableSeeder::class);
$this->call('PostsTableSeeder');

Model::reguard();
}

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

php artisan db:seed

此时去数据库看看,Posts表应该被插入里20条随机数据。

创建配置文件

我们还需要为博客做一些配置,比如标题和每页显示文章数。
config 目录下创建一个新的配置文件 blog.php,编辑其内容如下:

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

在 Laravel 中,可以轻松通过帮助函数 config() 访问这些配置项,例如,config('blog.title') 将会返回 title 配置项的值。
此外,如果需要的话你还可以去 config/app.php 修改时区配置。

创建路由和控制器

添加路由

接下来向 app/Http/routes.php 中添加两条路由:

Route::get('blog', 'BlogController@index');
Route::get('blog/{id}', 'BlogController@showPost');

创建控制器

php artisan make:controller BlogController

编辑内容为:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Http\Requests;
use App\Post;
use Carbon\Carbon;
use Illuminate\Http\Request;

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($id)
{

$post = Post::whereId($id)->firstOrFail();
return view('blog.post')->withPost($post);
}
}

创建视图

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

1、视图一:显示文章列表

resources/views/blog/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->id }}">{{ $post->title }}</a>
<em>({{ $post->published_at }})</em>
<p>
{{ str_limit($post->content) }}
</p>
</li>
@endforeach
</ul>
<hr>
{!! $posts->render() !!}
</div>
</body>
</html>

2、视图二:显示文章详情

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_raw)) !!}
<hr>
<button class="btn btn-primary" onclick="history.go(-1)">
« Back
</button>
</div>
</body>
</html>

OK,现在可以正常显示内容了。