# laravel Helper
## 創建注意
創建的helper function
將函數名稱包裝在“if”語句中。這是為了防止我
們意外地重新聲明任何已註冊的同名助手。例如,假設我們正在使用一個已經有 秒到小
時() 函數註冊,這將阻止我們使用相同的名稱註冊我們自己的函數。為了解決這個問
題,我們可以簡單地更改我們自己函數的名稱以避免任何衝突。
## 判斷是不是空

## retry
嘗試次數

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轉換用

model的relation都是這樣轉換的
###### tags: `Laravel`