数据迁移(创建表结构)
根目录下运行命令(创建迁移文件):
php artisan make:migration create_posts_table
生成文件于 /database/migrations/xxx_xxx_xx_create_posts_table.php,编辑:
// 设计表结构
public function up(){
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title', 100)->default("");
$table->text('content');
$table->integer('user_id')->default(0);
$table->timestamps();
});
}
public function down(){
Schema::dropIfExists('posts');
}
运行(开始生成):
php artisan migrate
数据填充(填充假数据)
使用模型工厂填充,首先创建 /database/factories/PostFactory.php,添加以下代码:
// Faker\Generator $faker 是一个开源的创建测试数据的工具类(数据填充)
$factory->define(App\Post::class, function (Faker\Generator $faker) {
return [
'title' => $faker->sentence(10),
'content' => $faker->paragraph(15),
];
});
tinker 执行命令:
$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.1.23 — cli) by Justin Hileman
>>> factory(App\Post::class, 50)->create();
# 插入 50 条测试数据
详情查看GitHub 库:https://github.com/fzaninotto/Faker;
查询(数据分页)
路由:
Route::get("posts","PostController@index");
控制器层,如 PostController.php
public function index(){
// 每页展示 10
$posts = Post::orderBy("created_at","desc")
->paginate(10);
return view("post/index",compact('posts'));
}
视图层,如 /resources/views/post/index.blade.php
@foreach ($posts as $post)
<div class="blog-post">
<h2 class="blog-post-title"><a href="/posts/{{$post->id}}" >{{$post->title}}</a></h2>
<p class="blog-post-meta">{{$post->created_at->toFormattedDateString()}}</p>
{{str_limit($post->content,255,"...")}}
</div>
@endforeach
{{$posts->links()}}
查询(模型参数)
路由:
Route::get("posts/{post}","PostController@show") ->where(["post" => "[0-9]+"]);
控制器层,如 PostController.php
// $post 为Post模型类
public function show(Post $post){
return view("post/show",compact('post'));
}
跳转链接:
<a href="/posts/{{$post->id}}" >{{$post->title}}</a>
视图层:
略
新增( CSRF)
打开表单页面时,需要记录一个值保存到 session,在提交之后判断所提交的值是否和刷新表单时创建的值一致。
路由:
// 表单页面 Route::get("posts/create",function(){ return view("post/create"); }); // 处理 Route::post("posts/","PostController@store");
视图层,/resources/views/post/create.blade.php
<form action="/posts" method="POST"> {{csrf_field()}} <div class="form-group"> <label>标题</label> <input name="title" type="text" class="form-control" placeholder="这里是标题"> </div> <div class="form-group"> <label>内容</label> <textarea id="content" style="height:400px;max-height:500px;" name="content" class="form-control" placeholder="这里是内容"></textarea> </div> <button type="submit" class="btn btn-default">提交</button> </form>
控制器保存:
父类 Controller 已经 use ValidatesRequests
(使用了Trait), 可以直接使用验证器类,一般 web 请求的错误会保存到 $errors 中,ajax 异步请求的错误会发送 JSON 响应。
public function store(Request $request){ $this->validate($request, [ 'title' => 'required|string|unique:posts|max:255|min:5', 'content' => 'required|string|min:5', ]); // 批量注入安全问题,laravel 默认不允许,可通过模型属性 fillable|guarded 打开 $post = Post::create($request->all()); return redirect("/posts"); }
表单验证:https://learnku.com/docs/laravel/5.4/validation/1234
修改
路由:
// 页面 Route::get("posts/{post}/edit",function (\App\Post $post) { return view("post/edit",compact("post")); }); // 逻辑 Route::put("posts/{post}","PostController@update");
视图:
<form action="/posts/{{$post->id}}" method="POST"> {{method_field("PUT")}} {{csrf_field()}} // ... </form>
控制器:
public function update(Request $request, Post $post) { // 验证 $this->validate($request, [ 'title' => 'required|string|unique:posts|max:255|min:5', 'content' => 'required|string|min:5', ]); // 处理 $post->title = $request->input('title'); $post->content = $request->input('content'); $post->save(); // 渲染 return redirect("/posts"); }
删除
路由:
Route::get("posts/{post}/delete","PostController@destroy");
操作:
public function destroy(Post $post) { // TODO::权限验证 $post->delete(); return redirect("/posts"); }
# 总结 #
增删改查走一遍就会涉及一些基础功能,如路由route、模板blade、模型model、控制器controller、数据迁移migrate、数据填充seeds、命令tinker、分页paging、验证器validate、csrf 等等。。。
很少使用laravel做开发所以经常不记得laravel优雅的写法,现在tp特别tp6的写法几乎完全模仿laravel所以很容易上手。