天天看點

3分鐘短文:Laravel應用跟使用者打交道,就從拿到他們的資料開始!

引言

本來講完路由和控制器,應該接着講一講視圖的,但是鑒于視圖的功能實在太枯燥,況且是前端頁面,免不了寫一些js和css。而laravel是偏重後端的,是以為了給後端的開發同學緩沖的時間,我們跳過視圖,先來說說使用者資料的擷取和處理,這幾乎是任何應用必備之功能。

3分鐘短文:Laravel應用跟使用者打交道,就從拿到他們的資料開始!

使用者資料同時又是危險的!本文不會教你規避危險!

代碼時間

我們在講路由規劃的時候,說了如何使用url的位置參數綁定的方式進行導向,其實那也是一種擷取使用者輸入資料的方式,

隻不過,傳入的位置參數一般都人畜無害,公開通路,任你來來往往。

如果是單個使用者的私密資料,必然是不能直接url内嵌傳輸的。

laravel把使用者的輸入存儲在 Input 對象内,而從邏輯上看,使用者輸入應該歸屬于請求項的,是以 Request 也繼承了 Input 的方法和資料。

比如有下面的路由:

Route::post('form', function (Illuminate\Http\Request $request) {
    // $request->method()
});           

模拟的是一個表單位址,通過post方法傳送資料,然後使用 Request 方法。可供使用的擷取方法,我們一一道來。

先說說 $request->all(),這一個是列印所有的輸入資料,比如表單内可能有下面這些字段。HTML 内容你們将就看一下哈!

<form method="post" action="/post-route?utm=12345">
    {{ csrf_field() }}
    <input type="text" name="firstName">
    <input type="submit">
</form>           

為了調試資料,我們的路由這樣注冊:

Route::post('/post-route', function (Request $request) {
    var_dump($request->all());
});           

大家猜猜會輸出些什麼内容呢?

/**
* [
* '_token' => 'CSRF token here',
* 'firstName' => 'value',
* 'utm' => 12345
* ]
*/           

沒錯兒,就是看到的post表單的字段 firstName,還有 querystring 的查詢參數 utm,還有一個是用于 CSRF 防護的laravel内置函數,預設的表單字段就是 __token,是以大可不必費心。

但是有代碼潔癖的同學會覺得受不了,這個不是我的字段,我在代碼裡也用不到,我不想看到這個 __token,這個陌生的變量。可以,我們在請求參數内直接過濾掉就好了:

Route::post('/post-route', function (Request $request) {
    var_dump($request->except('_token'));
});           

其中,except() 方法就是用來過濾某些字段,不需要使用的。與之對應的就是 only() 方法,是指定哪些是用的字段。這樣用:

$request->only(['firstName', 'utm']);           

還有些時候邏輯判斷有些鍵是否存在,laravel提供了兩種方式判斷是否存在,一個是 has ,一個是 exists。有同學會疑問,為什麼有了 has還要 exists呢?因為他們的作用不同。

has方法不僅會判斷該鍵存在,如果該鍵的值是 空(比如 null,空字元串,false,0,空數組,空對象等等),也是判斷為false的。是以就有必要使用 exists 單純地判斷鍵的存在與否,大家用的時候一定要注意這個細微的差别。

用法很簡單,直接調用方法即可:

if ($request->has('utm')) {
    // Do some work
}           

如果對于輸入值鍵不存在,我們也可以為其設定一個預設值,這就是 input 方法的第二個參數,使用如下調用:

Route::post('/post-route', function (Request $request) {
    $userName = $request->input('name', 'anonymous');
});           

如果使用者沒有傳入 name 字段,那麼就用 anonymous 替代。

上面說的都是簡單的鍵值對,還有一種表單,傳入的字段可能會是數組,比如下面這個:

<form method="post" action="/post-route">
    {{ csrf_field() }}
    <input type="text" name="employees[0][firstName]">
    <input type="text" name="employees[0][lastName]">
    <input type="text" name="employees[1][firstName]">
    <input type="text" name="employees[1][lastName]">
    <input type="submit">
</form>           

laravel内擷取數組可以使用點式方式讀取,這是因為laravel解析的時候使用了助手類 Arr 的通用方法。比如擷取某個鍵:

$employeeZeroFirstName = $request->input('employees.0.firstName');           

明确地指定鍵名,并對應好層級即可。還可以使用星号比對某一層級所有的鍵:

$allLastNames = $request->input('employees.*.lastName');           

或者僅指定某個鍵,後面不管多少層級原樣傳回:

$employeeOne = $request->input('employees.1');           

具體用法讀者可以檢視源碼或文檔,深入研究一下Arr操作類的用法。

寫在最後

本文幾乎涵蓋了使用者輸入input方法的最為常用的一些方法,我們隻講了怎麼正常地擷取使用者資料,沒有講如何驗證資料有效性。因為前端驗證幾乎形同虛設,最後能寫到資料庫的資料,還是要應用程式把關。

那就是驗證器的工作了,驗證器,我們放到後續章節再詳細地講。

Happy coding :-)

我是 @程式員小助手 ,專注程式設計知識,圈子動态的IT領域原創作者