今天起开始搭建博客,把之前学的东西运用下。
1 创建 配置项目
1.1 创建项目
composer create-project laravel/laravel blog 5.1.1
1.2 配置数据库
在.env文件中配置你的数据库
DB_HOST=127.0.0.1 DB_DATABASE=blog DB_USERNAME=root DB_PASSWORD=
1.3 创建一个配置文件
在config文件夹中创建一个blog.php(配置文件)
<?php return [ 'title' => "Larger K's Blog", 'posts_pre_page' => 5, ];
2 准备数据
2.1 创建Post模型和迁移文件
php artisan make:model Post -m
2.2 编写迁移文件/设置表结构
class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('slug')->unique(); // 用于 SEO $table->string('title'); // 标题 $table->text('content'); // 内容 $table->timestamp('published_at'); // 发布时间 $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('posts'); } }
然后migrate就行了。
2.3 设置Post模型
class Post extends Model { // 指定白名单 protected $fillable = ['slug', 'title', 'content', 'published_at']; // 添加published_at到时间 protected $dates = ['published_at']; /** * @param $value * 在设置Title字段时 设置slug属性。 */ public function setTitleAttribute($value) { $this->attributes['title'] = $value; if (! $this->exists){ $this->attributes['slug'] = str_slug($value); } } }
2.4 编写ModelFactory
/** * Post */ $factory->define(AppPost::class, function (FakerGenerator $faker) { return [ 'title' => $faker->sentence(mt_rand(4, 8)), 'content' => join(" ", $faker->paragraphs(mt_rand(3, 6))), 'published_at' => $faker->dateTimeBetween('-1 month'), ]; });
2.5 创建/编写seeder
php artisan make:seeder PostSeeder
class PostSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // truncate方法是清除自增ID,通常我们清除整张表后ID是不会清零的,如果你加上这个方法 之前所有数据被清空 并且ID会清零。 AppPost::truncate(); factory(AppPost::class, 20)->create(); } }
php artisan db:seed
3 编写路由和控制器
3.1 路由编写
Route::get('/', function () { // 重定向到 /blog 路由 return redirect('/blog'); }); Route::get('/blog', 'BlogController@index'); Route::get('/blog/{slug}', 'BlogController@showPost');
3.2 创建/编写控制器
class BlogController extends Controller { public function index() { /** * 过滤 published_at 必须小于现在的时间 * 按 published_at 降序排序 * 分页 */ $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', compact('post')); } }
4 编写前端
4.1 index
在 resources/views 中创建 post目录 并创建index.blade.php
<!DOCTYPE html> <html> <head> <title>{{ config('blog.title') }}</title> <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> </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> {!! $posts->render() !!} </div> </body> </html>
4.2 post
<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>