# laravel Helper ## 創建注意 創建的helper function 將函數名稱包裝在“if”語句中。這是為了防止我 們意外地重新聲明任何已註冊的同名助手。例如,假設我們正在使用一個已經有 秒到小 時() 函數註冊,這將阻止我們使用相同的名稱註冊我們自己的函數。為了解決這個問 題,我們可以簡單地更改我們自己函數的名稱以避免任何衝突。 ## 判斷是不是空 ![](https://i.imgur.com/sSFx4Vw.png) ## retry 嘗試次數 ![](https://i.imgur.com/aZCQ70R.png) https://www.youtube.com/watch?v=aqIMeRc1qKY ## laravel tap() https://ithelp.ithome.com.tw/articles/10210115 ``` https://chebin.tech/2020/04/10/Laravel-tap/ public function generateUseAndReturnThing($input) { $thing = $this->thingFromInput($input); $this->doActionToThing($thing); return $thing; } ``` 如果用tap()方式來寫,可以變成: ``` public function generateUseAndReturnThing($input) { return tap($this->thingFromInput($input), function ($thing) { $this->doActionToThing($thing); }); } ``` 使用tap()的好處就是不需要定義一些暫存的變數,程式碼看起來也會比較簡潔。 model update ``` user->update([ 'name' => $name, 'age' => $age, ]); return $user; ``` ``` 用tap()寫會變成: return tap($user, function ($user) { $user->update([ 'name' => $name, 'age' => $age, ]); }); ``` 感覺也沒有比較漂亮,不過在Laravel 5.4之後就可以寫成: ``` return tap($user)->update([ 'name' => $name, 'age' => $age, ]); ``` ### HigherOrderTapProxy https://ithelp.ithome.com.tw/articles/10210115 雖然是這樣,但每次要寫一堆 callable 就很煩,因此出現了另一個選擇:HigherOrderTapProxy,來看看它的原始碼: // 前面只是建構的時候把 value 存到 target 而已,所以省略 ``` public function __call($method, $parameters) { $this->target->{$method}(...$parameters); return $this->target; } ``` 這很像 proxy pattern,唯一不同的地方在於,它固定會回傳 self。以 分析 Log 的例子來說,原本程式碼與改寫後的程式碼如下: ``` tap($this->createEmergencyLogger(), function ($logger) use ($e) { $logger->emergency('Unable to create configured logger. Using emergency logger.', [ 'exception' => $e, ]); }); tap($this->createEmergencyLogger()) ->emergency('Unable to create configured logger. Using emergency logger.', [ 'exception' => $e, ]); ``` ## data_get 如果你第一個參數是null不會爆 後面牽套的找不到也不會爆 非常非常好用 ## array系列 **Arr::get** 函数使用「.」符号从深度嵌套的数组中根据指定键检索值 ``` use Illuminate\Support\Arr; $array = ['products' => ['desk' => ['price' => 100]]]; $price = Arr::get($array, 'products.desk.price'); // 100 ``` **Arr::only** 函数只返回给定数组中指定的键值对: ``` use Illuminate\Support\Arr; $array = ['name' => 'Desk', 'price' => 100, 'orders' => 10]; $slice = Arr::only($array, ['name', 'price']); // ['name' => 'Desk', 'price' => 100] ``` ## Arr::get vs data::get https://stackoverflow.com/questions/55185531/arrget-vs-data-get-in-laravel-5-7 1. 通配符匹配 如果您需要在索引中使用通配符,則必須使用,data_get因為Arr::get不支持通配符。 例子: ``` Arr::get($my_arr, '*.lower'); // null data_get($my_arr, '*.lower'); // ["aa", "bbb"] ``` 2. 變量類型 Arr::get簡單地假設您的變量是一個數組。因此,如果使用對象,則必須使用data_get. 但是,如果您確定您的變量是一個數組並且您不需要通配符,您應該繼續Arr::get避免從data_get評估中進行不必要的檢查,以查看您的變量是一個對像還是一個數組。 ## arr::wrap https://learnku.com/laravel/t/20554 (array)對於可跌代的不能用 這個比較好 ## filled 有沒有填充 ## str::plural migete跟model轉換用 ![](https://i.imgur.com/vZISvoJ.png) model的relation都是這樣轉換的 ###### tags: `Laravel`