iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 20
0

今天來新增一個,用 POST 方法來貼文的路由、以及讓使用者新增貼文的表單。

  • 關於 如何使用範例程式碼,請參考 TDD 實戰 D1
    • 本篇版本包含:4g

POST 方法的路由

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 )

有注意到我們使用了,上一篇的同一個控制器嗎?

PostControllerinsertPost 中,$request->input() 會取得輸入的值,不需要區分是來自 GET 還是 POST 方法。

表單

Laravel 5.3

對於網頁介面的測試,從 5.4 開始有些變化,在 Laravel:消失的 visit() 函式 提到過關於 visit()

被移除的測試功能,還包含了其他許多函式,原本能夠對網頁的頁面進行操作 [2],例如:

public function testNewUserRegistration()
{
    $this->visit('/register')
         ->type('Taylor', 'name')
         ->check('terms')
         ->press('Register')
         ->seePageIs('/dashboard');
}

Laravel 5.4 以後

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_form

點選送出貼文後,會發送 POST 請求到 /post 的 POST 方法路由,並存到資料庫中。


附註

  1. 本文中,全大寫 POST 代表 HTTP POST 方法Post 則代表 貼文Post Model
  2. Laravel 5.4 已移除文件 Application Testing - Interacting With Forms

上一篇
TDD 實戰 D5:Laravel 新增貼文路由
下一篇
TDD 實戰 D7:Laravel 會員登入與註冊
系列文
如何一步步實踐TDD (測試驅動開發)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言