laravel博客项目实战.3--添加博客

251 阅读3分钟

定义控制器

php artisan make:controller Web\BlogController

修改里面的代码


<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class BlogController extends Controller
{
    //
    public function add()
    {
        return view('web.blog.add');
    }
}


增加视图层

在这里为大家推荐一款开源的富文本编辑器,他支持markdown语法。喜欢的小伙伴可以去尝试一下,前端我们还以开源的bootstrap为模板。

数据库

项目的根目录下有个.env文件

#数据库类型
DB_CONNECTION=mysql
#数据库的地址
DB_HOST=127.0.0.1
#数据连接的端口号
DB_PORT=3306
#数据库名称
DB_DATABASE=leeBlog_com
#数据库用户名
DB_USERNAME=leeBlog_com
#数据库密码
DB_PASSWORD=nEkcG38CD5GGteeG

PS: Linux下 以“.”开头的文件为隐藏文件,无法直接查看,执行 ls -a 可以看到

我们执行


php artisan make:model Models\Blog

生成我们的模型文件,文件的路径为

app/Models/Blog.php

laravel的模型对应着数据库中表名的复数形式,如图所示

那么我不这么走可以么?可以! 修改我们blog模型



<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    //重新定义我们的表名
    protected $table = 'blogs';
}

执行一下命令增加博客的分类模型

php artisan make:model Models\Category

表结构如下所示

依赖注入

我们约定,model负责映射表,Repository层负责查数据 我们建立BlogRepository,代码如下


namespace App\Repository\Web;


use App\Models\Blog;
use App\Models\Category;

class BlogRepository
{
    public function addBlog($data)
    {
        return Blog::create($data);
    }

    public function getBlogCategory()
    {
        return Category::all();
    }
}

修改BlogController,我们采用依赖注入的方式引入了BlogRepository ,代码如下

<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Repository\Web\BlogRepository;
use Illuminate\Http\Request;

class BlogController extends Controller
{
    private $blogRepository;
    public function __construct(BlogRepository $blogRepository)
    {
        $this->blogRepository = $blogRepository;
    }

    public function add()
    {
        $this->blogRepository->getBlogCategory();
        return view('web.blog.add');
    }
}

再次修改我们的BlogController

<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Repository\Web\BlogRepository;
use Illuminate\Http\Request;

class BlogController extends Controller
{
    private $blogRepository;

    public function __construct(BlogRepository $blogRepository)
    {
        $this->blogRepository = $blogRepository;
    }

    public function add()
    {
        $categoryList = $this->blogRepository->getBlogCategory();
        return view('web.blog.add', ['categoryList' => $categoryList]);
    }
}



下面这句话给我们的模板赋值

        return view('web.blog.add', ['categoryList' => $categoryList]);

我们在模板中,采用foreach循环输出博客分类


@foreach($categoryList as $category)
    <option value="{{$category->id}}">{{$category->category_name}}</option>
@endforeach

在laravel的blade模板引擎中{{}}解析变量,@foreac用于循环输出,用法和原生的foreach循环类似 最终效果如下图所示

至此,我们添加博客的页面完成。

添加博客

我们增加一条添加博客的路由,地址如下

Route::post('/blog/add.html', 'BlogController@doAdd');

我们输入内容,点击提交,纳尼?what?

少侠,莫急,听我说,修改form表单,增加 @csrf

<form method="post" action="/blog/add.html" class="mt-1">
    @csrf
    <div class="form-group row mt-2">
        <div class="col-sm-8">
            <input type="text" class="form-control" placeholder="输入标题" name="title" required>
        </div>
    </div>

    <div class="form-group row">
        <div id="editor" style="height: 800px">
            <textarea style="display:none;" name="content" required></textarea>
        </div>
    </div>

    <div class="form-group row">
        <label for="category" class="col-sm-2 col-form-label">类别</label>
        <div class="col-sm-10">
            <select class="form-control" id="category" name="category" required>
                <option value="">请选择分类</option>
                @foreach($categoryList as $category)
                    <option value="{{$category->id}}">{{$category->category_name}}</option>
                @endforeach
            </select>
        </div>
    </div>
    <div class="form-group row">
        <label for="description" class="col-sm-2 col-form-label">描述</label>
        <div class="col-sm-10">
                <textarea class="form-control" id="description" name="description" required
                          placeholder="输入描述方便seo"></textarea>
        </div>
    </div>
    <button type="submit" class="btn btn-dark text-white">提交</button>

</form>

查看网页源码,这个@csrf会在我们的表单下面生成一个隐藏域:

 <input type="hidden" name="_token" value="cENMqtyu2yWS1o49h2SdMuX13CwFcaQ3VWg2yiiv">

这点laravel想的很周到,防止了跨站攻击。

我们在controller层增加如下代码


    public function doAdd(Request $request)
    {
        $title = $request->get('title');
        $content = $request->get('content');
        $category = $request->get('category');
        $description = $request->get('description');
        $data = [];
        $data['title'] = $title;
        $data['content'] = $content;
        $data['category_id'] = $category;
        $data['description'] = $description;
        if ($this->blogRepository->addBlog($data)) {
            //成功
        } else {
            //失败
        }
    }

页面返回,哪里又出问题了

Add [title] to fillable property to allow mass assignment on [App\Models\Blog].

少侠!你忘了定义可填充字段,修改blog的model层

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    //重新定义我们的表名
    protected $table = 'blogs';
    protected $fillable = [
        'title',
        'content',
        'category_id',
        'user_id',
        'description',
    ];
}

再次提交,查看数据库

完美!

PS: laravel的model层默认为我们预设了两个字段,created_at和updated_at用于存放新增和更新的时间,小伙伴们不要忘了定义 禁用自动更新数据库时间,created_at和updated_at这两个字段就会被忽视

    public $timestamps = false;

至此,我们添加博客完成!但是还没完结!