上一篇聊到了建立表單,也可以列舉出所有文章了,剩下的就是建立表單囉!
今天我們來聊聊怎麼用網頁的方式,來建立文章!
前面我們用 resources/views/posts/index.blade.php
建立了列出所有文章的路徑。
與這個方式類似,我們建立 resources/views/posts/create.blade.php
,建立新增文章的路徑
新增文章
成功的話,我們連接 http://127.0.0.1/posts/create 應該就會看到「新增文章」四個字
接著,我們建立輸入文章內容的表單,改寫 create.blade.php
如下
新增文章
<form action="{{ route('posts.store') }}" method="POST">
@csrf
<label>內容:
<textarea name="content"></textarea>
</label><br>
<input type="submit" value="送出文章">
</form>
然後我們在 app/Http/Controllers/PostController
裡面,改寫 store()
public function store(Request $request)
{
var_dump($request->input());
}
成功的話,應該可以看到類似這樣的回傳:
array(2) { ["_token"]=> string(40) "tb4GJa8UWOiyN27opznR0yXOsUP34yAckcafj0qX" ["content"]=> string(3) "asd" }
看到這裡,相信聰明的讀者應該想通了,為什麼雖然針對資料只有五個動作,但是卻建立了七個路徑。其中兩個路徑是用來填寫新增和修改的表單用的!
所以 create()
放的是新增用的表單,store()
放的是新增表單的行為。
edit()
放的是修改用的表單,update()
放的是修改表單的行為。
取得這個資料後,我們就可以很快的應用前面所學的技巧來新增資料囉,改寫 store()
public function store(Request $request)
{
$post = new Post;
$post->content = $request->input('content');
$post->subject_id = 0;
$post->save();
return redirect(route('posts.index'));
}
成功囉!現在我們就可以透過表單建立文章,並且建立完成之後還會自動導向到列表所有文章的頁面了!
不過,細心的讀者可能還會有個疑問:之前表單內的 @csrf
是什麼,然後 $request->input()
為什麼會有["_token"]=> string(40) "tb4GJa8UWOiyN27opznR0yXOsUP34yAckcafj0qX"
這串文字?
這,就要從什麼是 CSRF 開始說起囉!
CSRF,或者說 Cross-site request forgery,也就是跨站請求偽造,是一種網站的攻擊方式。
這種攻擊方式,是明明不是用戶自己的輸入,但是其他人偽造成該用戶的身份,假裝是該用戶進行發出請求。
要避免這種攻擊,其中一種方式就是在表單內多加一個 token。這個 token 是攻擊者無法取得的。這樣的話,即使攻擊者可以偽造成該用戶的身份,但是因為他無法取得這個 token,那麼他的請求就無法通過。
這個 token 在 laravel 的表單內,預設就必須要存在。透過 @csrf
這個樣板,我們可以在網頁內自動加上
<input type="hidden" name="_token" value="tb4GJa8UWOiyN27opznR0yXOsUP34yAckcafj0qX">
這個欄位。
這個欄位的數值,根據 .env
的 APP_KEY
會有所不同。當你修改你的 APP_KEY
,這個欄位的數值也會跟著改變。
我們可以透過執行
$ php artisan key:generate
來做到這件事情。
所以,攻擊者要能跨站攻擊,就必須先得到這串文字。
總結一下今天我們聊到了什麼。
今天我們建立了新增文章的頁面,接收資料的路徑,還學到了 CSRF 這個攻擊方式,以及 Laravel 如何避免該攻擊。
希望大家覺得今天的內容滿意,我們明天見!