PHPのフレームワークLaravelでPOSTを使い値を送信する際の注意点について学んだのでメモ。
POSTを使うなんてプログラミングを学び始めの頃、見よう見まねでできたのに、何今頃つまずいているんだと凹みながら色々調べていたら、Laravelでは少し勝手が違うようだった。
まず、以下のコードを書きを実行したら、「419のHTTPステータスエラー」が出た。
ビュー
sample.blade.php
<h1>タイトル</h1>
<p class="name">ようこそ!{{$msg}}さん</p>
<form method="POST" action="/sample">
名前を入力してください<br>
<input type="text" name="msg">
<input type="submit">
</form>
ルーティング
web.php
Route::get('/sample', 'SampleController@test');
Route::post('/sample', 'SampleController@test');
コントローラ
SampleController.php
class SampleController extends Controller
{
public function test(Request $request){
$data['msg'] = $request->msg;
return view('sample.sample', $data);
//
}
原因はCSRFトークン:
原因はCSRFトークンでした。
Laravelでは、クロスサイトリクエストフォージェリ対策として、CSRFトークンを使用することができます。
Laravelではミドルウェアにデフォルトで
kernel.php
\App\Http\Middleware\VerifyCsrfToken::class
という記載があります。
kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
なのでCSRF対策の仕組みを実際に使う必要があります。
修正
ビューに@csrfを追記。
sample.blade.php
<h1>タイトル</h1>
<p class="name">ようこそ!{{$msg}}さん</p>
<form method="POST" action="/sample">
@csrf
名前を入力してください<br>
<input type="text" name="msg">
<input type="submit">
</form>
もしくは、ミドルウェアで無効化(コメントアウト)。
kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
// \App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],