国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Laravel 5.4 入門系列 6. 文章的創(chuàng)建

levius / 1955人閱讀

摘要:基本功能創(chuàng)建文章的第一步是用戶發(fā)請求,然后返回創(chuàng)建文章的頁面。實際上,會報錯添加保護雖然我們完成了基本功能,但是提交請求的時候還是會報錯,其實這是防止攻擊。假如違反了規(guī)則,錯誤信息會自動被保存在閃存的中,即只對下一次請求生效。

基本功能

創(chuàng)建文章的第一步是用戶發(fā)請求,然后返回創(chuàng)建文章的頁面。

路由:處理用戶「創(chuàng)建文章」的請求

/routes/web.php
Route::get("/posts/create","PostsController@create");

控制器: 返回文章編輯視圖

/app/Http/Controllers/PostsController.php
public function create()
{
    return view("posts.create");
}

視圖: 使用 Bootstrap 組件來創(chuàng)建文章編輯頁面

/resources/views/posts/create.blade.php
@extends("layouts.master")

@section("content")
    

創(chuàng)建文章


@endsection

action 方法根據(jù)控制器來生成對應的路由,也可以用之前學過的 url 方法:

生成的 url 如下:


用戶提交之后,需要在路由中處理用戶提交的數(shù)據(jù)的請求:

/routes/web.php
Route::post("/posts","PostsController@store");

最后是保存文章實現(xiàn),我們使用 request() 方法獲取請求字段,保存完之后跳轉到博客首頁:

use AppPost;
public function store()
{
    $post = new Post();
    $post->title = request("title");
    $post->body = request("body");
    $post->save();
    
    return redirect("posts");
}

現(xiàn)在,訪問 posts/create,創(chuàng)建文章后點擊提交,查看下效果。實際上,會報錯:

TokenMismatchException in VerifyCsrfToken.php line 68

添加 CSRF 保護

雖然我們完成了基本功能,但是提交請求的時候還是會報錯,其實這是防止 CSRF 攻擊。

舉一個簡單的例子,你登錄一個投票網(wǎng)站,通過發(fā)送該請求向編號為 25 的人投票:

http://example.com/vote/25

CSRF 如何進行攻擊呢,顧名思義,CSRF 是 Cross-site request forgery 的縮寫,即跨站請求偽造,因此需要具備兩個條件:

跨站。首先,我登錄了該投票網(wǎng)站,網(wǎng)站保存了我的登錄信息,然后我又登錄了另外一個網(wǎng)站;

偽造請求。在另外一個網(wǎng)站的界面中,可能包含了類似 這樣的 HTML 代碼。由于投票網(wǎng)站無法區(qū)分你在哪里發(fā)送的請求,因此,就等于你向 30 號選手進行了投票;

解決方式也很簡單:

登錄 A 網(wǎng)站的時候,生成一條 token

提交請求的時候,該 token 也跟著提交

兩者進行驗證即可

第一步,Laravel 已經(jīng)幫我們實現(xiàn)了:

/vendor/laravel/framework/src/Illuminate/Session/Store.php
public function start()
{
    $this->loadSession();

    if (! $this->has("_token")) {
        $this->regenerateToken();
    }

    return $this->started = true;
}

第二步,Laravel 也幫我們封裝好了,直接使用 csrf_field() 函數(shù)即可,我們在文章編輯的表單中加入即可:

/resources/views/posts/create.blade.php

創(chuàng)建文章


{{ csrf_field() }}

可以看看該函數(shù)長什么樣:

function csrf_field()
{
    return new HtmlString("");
}

因此,我們也可以寫成:

最后一步,Laravel 通過中間件來進行自動檢驗:

public function handle($request, Closure $next)
{
    if (
        $this->isReading($request) || 
        $this->runningUnitTests() || 
        $this->inExceptArray($request) ||
        $this->tokensMatch($request)
    ) {
        return $this->addCookieToResponse($request, $next($request));
    }

    throw new TokenMismatchException;
}

簡單解讀下該中間件的處理流程:

判斷請求類型,如果是 GETHEADOPTIONS 等不會更改資源的請求就通過;

如果處于測試環(huán)境下就通過;

$except 數(shù)組內添加的 url 默認通過;

tokens 匹配也通過;

通過之后,就會添加名為 XSRF-TOKEN 的cookie;如果沒通過,就拋出異常,也就是我們上一節(jié)顯示的錯誤信息了。

批量創(chuàng)建文章

剛才我們采用是 save() 方法來保存文章,實際上,也可以使用 create() 方法,該方法允許一次性插入多條數(shù)據(jù),因此必須指定允許批量插入的字段:

/app/Post.php
class Post extends Model
{
    protected $fillable = [
        "title",
        "body",
    ];
}

store() 方法可以寫成:

/app/Http/Controllers/PostsController.php
public function store(Request $request)
{
    Post::create([
       "title" => request("title"),
       "body"  => request("body")
   ]);

    return redirect("posts");
}

或者傳入數(shù)組給 request():

/app/Http/Controllers/PostsController.php
public function store(Request $request)
{
    Post::create(request(["title","body"]));

    return redirect("posts");
}
添加字段驗證

接下來進一步完善創(chuàng)建文章的功能,即字段驗證。可以直接使用 validate 方法:

/app/Http/Controllers/PostsController.php
public function store(Request $request)
{
    $this->validate(request(), [
        "title" => "required|unique:posts|max:255",
        "body" => "required|min:5",
    ]);

    Post::create(request(["title", "body"]));

    return redirect("posts");
}

我們?yōu)?title 添加了非空、唯一性以及最大字符的驗證規(guī)則,對 body 字段添加了非空和最小字符的規(guī)則。

假如違反了規(guī)則,錯誤信息 $errors 會自動被保存在閃存的 Session 中,即只對下一次請求生效。并且,我們不需要將其返回給視圖,Laravel 幫我們做了處理,我們所有的視圖都可以獲取到 $errors 變量,可以令其顯示出來:

/resources/views/layouts/master.blade.php
@include("layouts.errors"); 
@include("layouts.footer")

具體錯誤消息:

/resources/views/layouts/errors.blade.php
@if (count($errors))
    
@endif

Forms · Bootstrap

CSRF (Cross-site request forgery) attack example and prevention in PHP - Stack Overflow

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22701.html

相關文章

  • Laravel 5.4 入門系列 8. 文章評論

    摘要:編輯遷移文件我們?yōu)楸砀裉砑恿送怄I,同時生定義了約束,該約束允許刪除父表文章的時候,自動刪除關聯(lián)的子表評論。關聯(lián)中文文檔的輔助函數(shù)列表中文文檔 本節(jié)將學習 Eloquent Relations,表與表之間存在著多種關系,舉例如下: 一對一:文章與作者 一對多:文章與評論 多對多:標簽與文章 文章與評論的一對多關系 一對多關系,主要理解兩點: 如何實現(xiàn)一對多關系 實現(xiàn)了之后能給開發(fā)帶...

    IntMain 評論0 收藏0
  • Laravel 5.4 入門系列 9. 注冊與登錄,用戶關聯(lián)

    摘要:本節(jié)將實現(xiàn)文章評論與用戶關聯(lián)的功能。關系定義首先修改與表,增加字段增加全部回滾并重新執(zhí)行遷移添加用戶表與文章表評論表的一對多關系添加文章評論表與用戶表的多對一關系同時,評論表的字段增加。同時,我們還自定義了返回的錯誤信息。 本節(jié)將實現(xiàn)文章、評論與用戶關聯(lián)的功能。 關系定義 首先修改 posts 與 comments 表,增加 user_id 字段 /database/migratio...

    smallStone 評論0 收藏0
  • Laravel 5.4 入門系列 10.文章歸檔

    摘要:將上述的一系列查詢進行封裝模型到了這一步,我們基本上實現(xiàn)了文章歸檔的功能。但是有一個問題,文章歸檔實際上包括在通用視圖中,這就意味著,網(wǎng)站的所有請求都需要返回,否則就會報錯。數(shù)據(jù)庫之數(shù)據(jù)庫請求構建器中文文檔的視圖功能中文文檔 首先,要實現(xiàn)的是按照日期來統(tǒng)計文章,原始的 SQL 如下: select year(created_at) year, monthname(c...

    Nekron 評論0 收藏0
  • Laravel 5.4 入門系列 3. 任務列表顯示

    摘要:熟悉了路由與視圖的基本操作之后,我們來讓視圖顯示一個任務列表吧。創(chuàng)建遷移現(xiàn)在,我們就可以創(chuàng)建一個用來生成任務表的遷移了。 熟悉了路由與視圖的基本操作之后,我們來讓視圖顯示一個任務列表吧。主要知識點: 數(shù)據(jù)遷移 查詢構造器 數(shù)據(jù)庫 創(chuàng)建數(shù)據(jù)庫 首先創(chuàng)建一個數(shù)據(jù)庫: $ mysql -uroot -p mysql> create database laratasks; 數(shù)據(jù)庫配置 La...

    SunZhaopeng 評論0 收藏0
  • Laravel 5.4 入門系列 7. 文章顯示

    摘要:為的輔助方法,用于截取字符串的前個字符,然后返回前個字符加的格式。顯示某篇文章顯示某篇文章的比較簡單,路由注意要放在下面,假如這樣那么,我們訪問的時候,會被當成是的查詢參數(shù)。 文章的顯示功能比較簡單,分為兩部分: 文章列表 具體的某篇文章 顯示文章列表 路由之前已經(jīng)定義好: Route::get(/posts,PostsController@index); 控制器: public ...

    kuangcaibao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<