基本的開發功能差不多都講解完了,有關測試的部分也都說的差不多了。
今天我們來聊一個 Laravel 爭議頗多的設計:Helpers
為了協助開發,Laravel 提供了一系列的函式,將常常做的事情幫開發者做好了。
以下將這些協助的事情分成三類來概略的介紹
比方說我們前面介紹過的 decrypt()
和 encrypt()
就是 Laravel Helpers 全域函式的一個例子
除了這兩個例子以外,我們這邊再挑選三個例子做介紹。
dd()
dd()
是開發過程中最常用的函式之一,可以印出送入的參數,並且暫停程式。
我們可以用測試路徑看看這個函式的效果
Route::get('/test', function(){
dd('輸入一');
return '輸入二';
});
連接 http://127.0.0.1/test 我們就可以看到「輸入一」這個字串,但是不會看到「輸入二」
dump()
如果只是想看到輸入,但是不中斷整個程式的運作,我們可以改用 dump()
這個函式
Route::get('/test', function(){
dump('輸入一');
return '輸入二';
});
這樣的話,程式還是會將「輸入一」顯示出來,但是不會中斷,所以我們還是可以看到「輸入二」產生
route()
route()
可以用來將路由名稱轉換成網址
Route::get('/test', function(){
return route('posts.index');
});
之後連線到 http://127.0.0.1/test ,會顯示 http://127.0.0.1/posts
有關陣列操作,Laravel 也提供了不少協助的函式。
這邊選三個例子進行介紹:
Arr::get()
Arr::get()
可以透過
Route::get('/test', function(){
$array = ['products' => ['desk' => ['price' => 100]]];
dd(Arr::get($array, 'products.desk.price'));
});
連接 http://127.0.0.1/test 可以看到 100
有的讀者可能會感覺到,這個函式取值的方式,跟路由設定值的方式很相似。事實上這也是 Laravel 開發路由時會用到的函式之一。
Arr::first()
這個函式可以取出陣列第一個值,比較特殊的是,他可以接收一個回傳布林值的匿名函式,用來過濾不符合的值。
use Illuminate\Support\Arr;
Route::get('/test', function(){
$array = [100, 200, 300];
$first = Arr::first($array, function ($value, $key) {
return $value >= 150;
});
dd($first);
});
連接 http://127.0.0.1/test 可以看到 200
。
Arr::wrap()
這個函式基本上,就是把收到的東西包裝成陣列。
如果收到 null
,就回傳空陣列。
如果收到陣列,就不加以處理。
use Illuminate\Support\Arr;
Route::get('/test', function(){
$string = 'Laravel';
dd(Arr::wrap($string));
});
連接 http://127.0.0.1/test 可以看到
array:1 [▼
0 => "Laravel"
]
和字串相關的函式,相信有的讀者可能會想到,在處理語系時使用的 __()
和 trans()
就是個例子。
另外,和陣列類似,Laravel 還用了 Str
物件來協助字串處理。
下面一樣選三個例子進行介紹:
e()
e()
用來處理 HTML 編碼,可以處理純字串或者 view 物件等等。
可以用我們剛剛學過的 dd()
,在測試路徑上看看結果
Route::get('/test', function(){
$value = e('<html>foo</html>');
dd($value);
});
連接 http://127.0.0.1/test 可以看到 <html>foo</html>
。
Str::contains()
Str::contains()
這個函式用來比對兩個字串,看看前面的字串是否包含後面的字串。
use Illuminate\Support\Str;
Route::get('/test', function(){
$isContain = Str::contains('This is my name', 'my');
dd($isContain);
});
連接 http://127.0.0.1/test 可以看到 true
。
Str::plural()
這個函式可以讀取一個英文名詞,將其轉化成該名詞的複數型態
use Illuminate\Support\Str;
Route::get('/test', function(){
dd(Str::plural('post'));
});
連接 http://127.0.0.1/test 我們會看到 posts
可能有讀者發現了,這個函式就是用來協助 Laravel 在找 Eloquent Model 對應的資料表名稱時,所會使用到的函式之一。
以上就是所有的介紹。因為 Laravel Helpers 的功能實在太多,所以這邊只簡介部分的功能。
要看到全部的功能,可以到 https://laravel.com/docs/6.x/helpers 查閱。
有人喜歡的東西,自然就會有人討厭。有的人認為 Laravel 的這些 helpers 把工程師寵壞了,這樣的設計讓很多人甚至無法分清哪些是 PHP 原生的函式,哪些又是 Laravel 所提供的函式。甚至有人每次看到新人遇到不是 Laravel 的 PHP 專案,然後找不到 first()
之類的函式時,會有一種無奈的感覺。
不過筆者認為,工具方便性提高,確實可能導致使用者在開發過程中沒有掌握狀況就開發。不過與其抱怨工具太過方便,不如想辦法提升開發者對語言和框架的熟悉度與認知,知道哪些功能是語言本身提供的,哪些又是框架自帶的,框架自帶的功能又是怎麼實作。
這樣,才能同時兼顧開發速率跟工程師的知識面,既可以在有框架的環境下快速開發,又可以在沒有框架的狀況下減少開發遇到的問題。
小小總結今天所學到的東西。
今天我們學到 Laravel 提供的很多函式,特別是針對字串處理和陣列處理,提供了很多工具進行操作。
希望今天大家有收穫,我們明天見!