[Laravel] 表單寫入和 CSRF 預防

好啦終於要寫入資料到資料庫了
開勳

新建一個畫面叫做 post/create
這個頁面作為新增表單的頁面

routes/web.php 內新建 一個路由
Route::get('/posts/create', 'PostsController@create');

導向先前建立的PostsController中create方法
public function create(){    return view('posts.create');}

然後顯示views/posts 的 create.blade.php 畫面
畫面中要包含一個 form 表單並且設定 method="post" action="/posts"

這邊有個技巧
複習一下怎麼建立 Controller,然後再看這行
php artisan make:controller {controller_name} -r
我們只需要在最後面加一個 -r 代表 resource
也可以使用全名 --resource
注意!這邊槓槓數量不是打錯!沒有打錯!


使用這個方法會建立 RESTful 的 CRUD 控制器
會看到我們的 Controller 裡面已經有了很多預設的 function
這些就是用來作 CRUD 的!

現在看起來可以發送了,等等!
form 按下去之後,發送到 post 之後 controller 怎麼接收呢?
我們回到 routes/web.php 加入一行
Route::post('/posts', 'PostsController@store');

意思是接收到 post 方法來傳送到posts的資料
並把它導向PostController 的 store function
回顧一下之前的Route設定,都是使用::get,因為是網址改變
那就是 get 方法,這問題你去問剛接觸的新手也答的出來

接下來比較刺激喔!安全帶繫上直接看 store 做的事情
public function store()
{
    $post = new Post;
    $post->title = request('title');
    $post->body = request('body');
    $post->save();
    return redirect('/post');
}


看起來很簡單,他使用了很久以前我們建立的 Model 叫做 Post
我們 new 了一份出來,期待可以用來連接資料庫

執行下去,就爆了!
因為我們檔案最上方使用的 namespace 叫做 App\Http\Controllers
而我們的 Post model 在 App\Post
如果直接new 他會去找尋 namespace 下的 App\Post
變成 App\Http\Controllers\App\Post,就找不到對應的class
所以我們要在檔案最上方 namespace 下一行加入
use App\Post;

宣告我們要引入這隻檔案的命名空間
然後就可以了呢
至於底下 $post 那些就不多贅述,就是把傳來的資料 request[]
對應到資料庫欄位,save() 就...存進資料庫
送完表單資後把他們重新導向到 /post頁面,大概就是這樣

你開心地送出表單,就跟和喜歡的女生告白一樣
然後就被拒絕了,就跟和喜歡的女生告白一樣

因為 Laravel 預設是保護網站遠離 CSRF 攻擊
解決方法可以看官方文件
就只是在 form 表單內第一行加入
{{ csrf_field() }}

如此就會自己產生 token 進行驗證然後寫入
到這邊我們已經可以寫入資料庫啦



留言