Laravel 基础操作

数据迁移(创建表结构)

根目录下运行命令(创建迁移文件):

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所以很容易上手。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章