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');
}