摘要:不難發(fā)現(xiàn),的還默認(rèn)為我們生成一個(gè)的表單,這個(gè)是默認(rèn)對(duì)表單提交的一點(diǎn)安全支持。在表單提交的時(shí)候,會(huì)自動(dòng)檢查這個(gè)是否與保存在中的一致,如果不一致,那就直接跳轉(zhuǎn)回遠(yuǎn)頁(yè)面,不允許我們提交數(shù)據(jù)。
免費(fèi)視頻教程地址 https://laravist.com/series/laravel-5-basic原文來(lái)自:https://jellybool.com/post/programming-with-laravel-5-laravel-forms-input
在開始之前,我們把界面先美化一點(diǎn)點(diǎn)先:
首先到https://github.com/JellyBool/blog-css-js得到靜態(tài)文件,然后分別修改下面三個(gè)文件:
1. app.blade.php 2. articles/index.blade.php 3. articles/show.blade.php
下面的視圖代碼的修改部分,如果你偷懶,你可以使用ctrl+c大法。
在app.blade.php中:將原來(lái)@yield("content")的代碼替換成下面的代碼:
@yield("content")
就是在外面多加了個(gè)div和一個(gè)section。
再引入這兩個(gè)css文件:
一個(gè)是bootstrap,一個(gè)是自定義的。
在articles/index.blade.php文件中,我們將每個(gè)$article放在標(biāo)簽中:
@foreach($articles as $article)@endforeach {{ $article->title }}
{{ $article->intro }}更多
然后最后就是修改articles/show.blade.php視圖文件了:
@section("content")@endsection {{ $article->title }}
{{ $article->content }}
最后看看效果:
教程的最后,基本上就可以完成一個(gè)跟本人的blog一樣的小產(chǎn)品。
OK,稍微美化完過(guò)后,我們就可以進(jìn)入我們的主題了:在Laravel中使用Forms表單。
前奏既然我們需要?jiǎng)?chuàng)建一篇文章,我們首先還是需要將這個(gè)創(chuàng)建文章的頁(yè)面展示出來(lái)吧,就像SF的文章撰寫頁(yè)面一樣:http://segmentfault.com/write
所以我們需要將上一篇的內(nèi)容走一遍:
注冊(cè)路由,在routes.php中增加:
Route::get("article/create","ArticleController@create");
我們指定article/create來(lái)加載ArticleController的create()方法,然后我們?cè)?b>ArticleController創(chuàng)建之:
public function create() { return view("articles.create"); }
這個(gè)create()方法直接加載我們的create.blade.php,所以我們創(chuàng)建這個(gè)視圖文件,來(lái)到之前的views/articles/這個(gè)文件夾中,新建create.blade.php,寫上這些測(cè)試內(nèi)容:
@extends("app") @section("content")撰寫新文章
@endsection
瀏覽器訪問試試http://blog.dev/article/create:
一切正確加載之后,我們就開始著手我們的Forms使用了,因?yàn)閯?chuàng)建文章的時(shí)候就是需要表單的提交,我們才可以將內(nèi)容接收到,或者說(shuō)幾乎每一個(gè)web應(yīng)用都離不開表單,哪怕是一個(gè)注冊(cè),登錄頁(yè)面,也都是需要表單的存在,只要你需要收集用戶的信息或者希望有一些UGC,也離不開表單。所以我們開始使用Laravel的Forms表單吧。
使用illuminate/html這里我們使用一個(gè)官方的Package:https://github.com/illuminate/html
我們通過(guò)composer來(lái)安裝之:
composer require illuminate/html
靜待一會(huì),安裝成功之后,我們們?cè)趺锤嬖VLaravel,這個(gè)Package已經(jīng)安裝了?或者說(shuō)我們?cè)趺磳⑦@個(gè)Package跟Laravel的整個(gè)體系結(jié)合起來(lái)呢?
通過(guò)提供Service Provider和指定Facade!這樣就可以很完美地與Laravel結(jié)合了。
為什么直接叫Service Provider和Facade?因?yàn)槲抑涝趺捶g這兩個(gè)才貼切,意會(huì)一下
在這里順便多說(shuō)一點(diǎn):在PHP的很多composer的package中,都會(huì)有各個(gè)框架的不同版本,比如說(shuō)HtmlPurifier這個(gè)過(guò)濾html和預(yù)防xss的package,就有這個(gè)Laravel的版本:
https://github.com/mewebstudio/Purifier ,或多或少,一些很好的package都會(huì)有Laravel的版本。
那么說(shuō)回Service Provider和Facade,剛開始可能對(duì)Service Provider的概念可能很迷惑,不過(guò)你現(xiàn)在完全不必要擔(dān)心,盡管打開config/app.php這個(gè)文件看一看:
"providers" => [ IlluminateFoundationProvidersArtisanServiceProvider::class, IlluminateAuthAuthServiceProvider::class, IlluminateBroadcastingBroadcastServiceProvider::class, //... ]
你會(huì)看到providers這個(gè)數(shù)組里面會(huì)有一堆Laravel預(yù)置的Service Provider,比如我們經(jīng)常使用到得Auth,Controller等,都可以在這里找到。如果你再往下拉,你還會(huì)看到一個(gè)這樣的aliases數(shù)組:
"aliases" => [ "App" => IlluminateSupportFacadesApp::class, "Artisan" => IlluminateSupportFacadesArtisan::class, "Auth" => IlluminateSupportFacadesAuth::class, //... ]
aliases其實(shí)就是快捷方式了,一旦在這里指定了快捷方式,我們就可以在Laravel中全局使用,比如我在代碼中使用Auth,其實(shí)背后我就是在用IlluminateSupportFacadesAuth::class,然后再深入,我們其實(shí)是在用providers中的IlluminateAuthAuthServiceProvider::class這個(gè)。
趁上面寫這些的時(shí)候illuminate/html已經(jīng)下載好了:
那么,按照上面方式,我們來(lái)配置一下我們的illuminate/html,在config/app.php中的providers添加我們的Service Provider:
IlluminateHtmlHtmlServiceProvider::class,
配置完大概長(zhǎng)這樣:
OK,Service Provider添加好了之后,我們來(lái)添加我們的Facade,也就是在aliases這個(gè)數(shù)值后面添加:
"Form" => IlluminateHtmlFormFacade::class,
配置完之后看看圖片長(zhǎng)這樣:
使用Forms這兩個(gè)配置好了之后,我們就可以在在我們的create.blade.php這個(gè)視圖中使用它了:
@section("content")撰寫新文章
{!! Form::open() !!} {!! Form::close() !!} @endsection
我們加入了兩行{!! Form::open() !!}和{!! Form::close() !!},至于{!!類似的符號(hào),請(qǐng)類比如blade的{{,不用太糾結(jié)這個(gè)。我們?cè)賮?lái)訪問http://blog.dev/article/create試試:
咋一看,貌似沒有什么變化,但是你要查看頁(yè)面源碼或者使用開發(fā)者工具檢查元素的時(shí)候,就可以發(fā)現(xiàn)這個(gè)form元素已經(jīng)創(chuàng)建出來(lái)了。
不難發(fā)現(xiàn),Laravel的Form還默認(rèn)為我們生成一個(gè)hidden的表單(name="_token"),這個(gè)是Laravel默認(rèn)對(duì)表單提交的一點(diǎn)安全支持。在表單提交的時(shí)候,Laravel會(huì)自動(dòng)檢查這個(gè)_token是否與保存在session中的_token一致,如果不一致,那就直接跳轉(zhuǎn)回遠(yuǎn)頁(yè)面,不允許我們提交數(shù)據(jù)。
既然Form可以正常使用了,我們就可以創(chuàng)建我們需要的表單了:
{!! Form::open() !!}{!! Form::label("title","標(biāo)題:") !!} {!! Form::text("title",null,["class"=>"form-control"]) !!}{!! Form::label("content","正文:") !!} {!! Form::textarea("content",null,["class"=>"form-control"]) !!}{!! Form::submit("發(fā)表文章",["class"=>"btn btn-success form-control"]) !!}{!! Form::close() !!}
我們?cè)?b>{!! Form::open() !!}加入一點(diǎn)東西,先來(lái)看看我們的效果:
下面詳細(xì)解釋一下:
{!! Form::text("title",null,["class"=>"form-control"]) !!}
拿這個(gè)來(lái)開刀吧:
Form::text 表示,還要一堆比如 等你可以參照著寫。
"title" 表示 name="title"
null 表示 value=""
"class"=>"form-control" 表示class="form-control",這里可以指定id,placeholder等一系列你想指定的屬性
然而在Form::open()沒有指定提交路徑的情況之下,默認(rèn)是提交到本頁(yè)面,這樣對(duì)于我們的清晰分工是不太好的,因?yàn)檫@個(gè)頁(yè)面就是用來(lái)加載視圖的,而對(duì)于我們表單提交的內(nèi)容,我們希望用另外的方法來(lái)處理,所以我們來(lái)寫一寫吧。
首先在Form::open()指定表單提交的url,直接在加入url:
{!! Form::open(["url"=>"article/store"]) !!}
我們指定表單post提交到article/store這個(gè)地址,然后在routes.php注冊(cè)這個(gè)路由地址:
Route::post("article/store","ArticleController@store");
這里注意我們使用了Route::post而不是Route::get,這是用來(lái)接收post的路由。然后順利成章,在ArticleController中創(chuàng)建store()方法:
public function store() { $input = Request::all(); return $input; }
在這個(gè)方法中,我們引入Laravel自帶的Request并使用Request::all(),來(lái)獲取所有的用戶提交的過(guò)來(lái)的內(nèi)容(這里指的是:_token,name很content),如果你想獲取具體某一個(gè)表單輸入的內(nèi)容,可以使用Request::get(),比如Request::get("title"),然后直接return來(lái)看看用戶到底輸入了什么內(nèi)容,我們來(lái)試試:
實(shí)現(xiàn)創(chuàng)建新文章OK,成功拿到用戶的提交的內(nèi)容之后,我們需要將這些保存到數(shù)據(jù)庫(kù),怎么實(shí)現(xiàn)呢?在第四篇中,我們提到的Eloquent的create()方法現(xiàn)在就可以派上用場(chǎng)了,于是我們可以寫成這樣:
Article::create($input);
Laravel會(huì)自動(dòng)過(guò)濾_token這個(gè)提交內(nèi)容。
但是創(chuàng)建完一篇文章之后,我們并不是想return $input,而是想重新跳轉(zhuǎn)到某個(gè)頁(yè)面中,比如我們的首頁(yè),因?yàn)榘l(fā)表完文章,我們需要看到它是否成功出線在文章列表中,所以我們最后寫一下:
public function store() { $input = Request::all(); Article::create($input); return redirect("/"); }
我們直接使用Laravel的redirect()函數(shù)進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)到首頁(yè)。這個(gè)時(shí)候,短短的三行代碼就可以將我們的邏輯實(shí)現(xiàn)了,那么我們來(lái)試試:
貌似成功了?但是我們覺得這個(gè)排序有點(diǎn)問題,最新創(chuàng)建的文章當(dāng)然是在最上面的了,所以我們到ArticleController的index()方法中稍微修改一下:
public function index() { $articles = Article::latest()->get(); return view("articles.index",compact("articles")); }
將原來(lái)的all()換成了latest()->get(),刷新,
我們發(fā)現(xiàn),最新的文章intro竟然空白,我們到數(shù)據(jù)庫(kù)看看:
我們發(fā)現(xiàn),剛剛創(chuàng)建的文章的intro為空值,而published_at為0000-00-00 00:00:00,這不是我們想要的,為什么會(huì)這樣呢?因?yàn)槲覀冊(cè)谔峤贿^(guò)來(lái)的時(shí)候,并沒有這兩個(gè)數(shù)據(jù)啊,為了解決這個(gè)問題,首先我們可以很暴力得將這兩個(gè)數(shù)據(jù)在使用Article::create($input)之前配置好,比如:
public function store() { $input = Request::all(); //下面增加兩行,順便看看Request::get的使用 $input["intro"] = mb_substr(Request::get("content"),0,64); $input["published_at"] = Carbon::now(); Article::create($input); return redirect("/"); }
intro字段就直接取content字段的頭64個(gè),然后published_at就默認(rèn)為創(chuàng)建的時(shí)間。目前開起來(lái)代碼有點(diǎn)暴力,但是不失為一種解決方案,我們后續(xù)會(huì)使代碼much cleaner。我們?cè)賮?lái)試試:
bang,成功了,我們?cè)诳纯磾?shù)據(jù)庫(kù):
到這里,我們創(chuàng)建一篇文章的基本流程就完成了,但是這里還有一個(gè)問題,如果你嘗試在文章創(chuàng)建的頁(yè)面什么都不填,直接提交數(shù)據(jù),你看看會(huì)發(fā)生什么,如果不確定,你可以看看你的數(shù)據(jù)庫(kù),到底發(fā)生了什么。
下一節(jié)鑒于最后的問題和牽涉到表單的內(nèi)容,下一節(jié)貌似很順理成章就應(yīng)該說(shuō)說(shuō)表單驗(yàn)證了,在Laravel中就是Request Validation。
最后,
Happy Hacking
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21109.html
摘要:原文來(lái)自免費(fèi)視頻教程地址期間受到很多私事影響,終于還是要好好寫寫的教程了。我們來(lái)實(shí)現(xiàn)這個(gè)功能顯示文章詳情通過(guò)文章展示來(lái)快速體驗(yàn)上面的流程注冊(cè)路由來(lái)到中,我們?cè)黾右粋€(gè)路由上面的路由指定我們需要加載中的方法。 原文來(lái)自: https://jellybool.com/post/programming-with-laravel-5-model-controller-view-basic-wor...
摘要:原文地址安裝首先通過(guò)來(lái)安裝這個(gè)包編輯項(xiàng)目的文件在部分加入接下來(lái)從命令行更新接下來(lái)添加到的數(shù)組最后添加兩個(gè)類鏈接到的數(shù)組創(chuàng)建表單打開表單默認(rèn)是方法你可以隨意指定其他接收方法表單僅僅支持和方法和方法將會(huì)使用一個(gè)隱藏域添加到表單中來(lái)欺騙實(shí)現(xiàn)你可 原文地址: Laravel Collective Forms & HTML 安裝 首先通過(guò) composer 來(lái)安裝這個(gè) 包, 編輯項(xiàng)目的 comp...
摘要:而且很明顯地,我們可以看到,一旦輸入框在失去焦點(diǎn)的時(shí)候,如果里面沒有輸入任何內(nèi)容,每個(gè)輸入框就會(huì)有相應(yīng)的錯(cuò)誤提示,用戶體驗(yàn)很不錯(cuò)。 原文來(lái)自: https://jellybool.com/post/programming-with-yii2-exploring-mvc-forms-a... 上一篇文章我們簡(jiǎn)單地實(shí)現(xiàn)了Yii2框架安裝和Hello World,而在這一篇文章當(dāng)中...
摘要:幾乎在每一個(gè)應(yīng)用當(dāng)中都會(huì)有表單,而有表單基本就離不開表單驗(yàn)證。在中,其實(shí)可以說(shuō)是有兩種方式來(lái)進(jìn)行表單驗(yàn)證使用和使用。然后,上面的驗(yàn)證規(guī)則是對(duì)于和兩個(gè)字段,我們需要用戶為其填充內(nèi)容,不能為空。 原文來(lái)自:https://laravist.com/article/15 免費(fèi)視頻教程地址 https://laravist.com/series/laravel-5-basic Laravis...
摘要:來(lái)看看具體的步驟注冊(cè)路由在中,注冊(cè)我們的編輯頁(yè)面的路由這個(gè)路由接受一個(gè)參數(shù),意為文章的,我們會(huì)需要根據(jù)這個(gè)來(lái)查詢我們要修改的文章。然后渲染視圖,并將查詢到的和傳給視圖。下面我打算再開一個(gè)系列說(shuō)說(shuō)的新特性 原文來(lái)自https://laravist.com/article/20 免費(fèi)視頻教程地址 https://laravist.com/series/laravel-5-basic La...
閱讀 3967·2021-09-22 10:02
閱讀 3383·2019-08-30 15:52
閱讀 3073·2019-08-30 12:51
閱讀 771·2019-08-30 11:08
閱讀 2075·2019-08-29 15:18
閱讀 3119·2019-08-29 12:13
閱讀 3608·2019-08-29 11:29
閱讀 1886·2019-08-29 11:13