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