Laravel使用記錄(六)

9. 表單

表單是和用戶交互必不可少的工具,例如我們常見的註冊,登錄,留言板等等,但是在Laravel中使用表單並非一帆風順,可謂是一波三折,下面我們就來看下Laravel中使用表單會遇到哪些問題吧。

表單HTML

<form method="post" action="{{url('login')}}">
	username:<input type="text" name="username"/>
    password:<input type="password" name="password"/>
    <input type="submit" value="submit">
</form>
9.1 Sorry, the page you are looking for could not be found

HTTP狀態碼:404
這是因爲你沒有定義login對應的路由,這種情況應該很少發生,或者能很快意識到

9.2 No message

當你點擊提交的時候,可能會遇到以下問題

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
No message

HTTP狀態碼:405
這個問題可以一時半會意識不到哪裏出了問題,因爲即便是錯誤提示也不是那麼直白,其實是你雖然定義了login的路由,但是你定義的不是post(一般習慣性定義爲get),所以出現了上述問題。

Route::post('login', 'IndexController@login');
9.3 The page has expired due to inactivity. Please refresh and try again.

HTTP狀態碼:419
是不是一時半會沒迷瞪過來是怎麼回事。其實這是Laravel的僞造跨站請求保護,CSRF。它會檢測定義在routes/web.php中所有的POST請求的路由,如果沒有令牌字段,會阻止你繼續訪問。如何解決?
方法一:
在routes/web.php外定義路由,這樣就不會過web的中間件檢測,也就不會阻止你訪問了。
方法二:
將URI添加到VerifyCsrfToken中間件的$except中,文件路徑爲app/Http/Middleware/VerifyCsrfToken.php。

<?php
namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    protected $except = [
        'login',
    ];
}

方法三:
添加 {{ csrf_field() }},它會添加一個隱藏的CSRF令牌字段,以便CSRF保護中間件可以驗證該請求。

<form method="post" action="{{url('login')}}">
	username:<input type="text" name="username"/>
    password:<input type="password" name="password"/>
    {{ csrf_field() }}
    <input type="submit" value="submit">
</form>

推薦使用方法三,畢竟該功能是爲了防止跨站請求僞造的攻擊,如果實在無法主動添加,再採取上兩種方式。

接下來就沒什麼問題了,就是接收數據然後處理對應邏輯。

use Illuminate\Http\Request;
public function login(Request $request)
{
    $username = $request->input('username');
    $password = $request->input('password');
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章