定义控制器
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');
}
}
增加视图层
数据库
项目的根目录下有个.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;
至此,我们添加博客完成!但是还没完结!