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