今天來新增一個,用 POST
方法來貼文的路由、以及讓使用者新增貼文的表單。
4g
。HTTP 定義了多種 request 的方法,一般用來顯示的頁面會用 GET
,也是我們目前為止使用的。
POST
通常用在新增資料,使用者填完表單後送出通常就會用 Post 方法 [1]。
// tests/Feature/PostText.php
public function testInsertPostByPostRoute()
{
$text = "It's a new post.";
$this->post('/post',
['post_text' => $text ]);
$this->assertDatabaseHas('posts', ['post_text' => $text ]);
$response = $this->get('/post');
$response->assertSee($text);
}
// routes/web.php
Route::post('/post', 'PostController@insertPost');
( $ git checkout 4g
)
有注意到我們使用了,上一篇的同一個控制器嗎?
在 PostController
的 insertPost
中,$request->input()
會取得輸入的值,不需要區分是來自 GET 還是 POST 方法。
對於網頁介面的測試,從 5.4 開始有些變化,在 Laravel:消失的 visit() 函式 提到過關於 visit()
。
被移除的測試功能,還包含了其他許多函式,原本能夠對網頁的頁面進行操作 [2],例如:
public function testNewUserRegistration()
{
$this->visit('/register')
->type('Taylor', 'name')
->check('terms')
->press('Register')
->seePageIs('/dashboard');
}
Laravel 把對頁面的測試,移到 Laravel Dusk 獨立了出來。
這部分我們接著再來繼續研究,先讓我們來試試表單。
// routes/web.php
Route::get('/post/form', function () {
return view('post_form');
});
<!-- resources/views/post_form.blade.php -->
<form method="post" action="/post">
@csrf
<input type="text" size="50" name="post_text">
<input type="submit" value="送出貼文">
</form>
注意到表單中有一行 @csrf
,代表這個表單會受到 CSRF 的保護。
點選送出貼文後,會發送 POST 請求到 /post
的 POST 方法路由,並存到資料庫中。
POST
代表 HTTP POST 方法
,Post
則代表 貼文
或 Post Model
。