# 服務 —— 幫助函數
## 1、簡介
Laravel自帶了一系列PHP幫助函數,很多被框架自身使用,然而,如果你覺得方便的話也可以在應用中隨心所欲的使用它們。
## 2、?數組函數
### array_add()
`array_add`函數添加給定鍵值對到數組,如果給定鍵不存在的話:
~~~
$array = array_add(['name' => 'Desk'], 'price', 100);
// ['name' => 'Desk', 'price' => 100]
~~~
### array_divide()
`array_divide`函數返回兩個數組,一個包含原數組的所有鍵,另外一個包含原數組的所有值:
~~~
list($keys, $values) = array_divide(['name' => 'Desk']);
// $keys: ['name']
// $values: ['Desk']
~~~
### array_dot()
`array_dot`函數使用”.“號將將多維數組轉化為一維數組:
~~~
$array = array_dot(['foo' => ['bar' => 'baz']]);
// ['foo.bar' => 'baz'];
~~~
### array_except()
`array_except`方法從數組中移除給定鍵值對:
~~~
$array = ['name' => 'Desk', 'price' => 100];
$array = array_except($array, ['price']);
// ['name' => 'Desk']
~~~
### array_first()
`array_first`方法返回通過測試數組的第一個元素:
~~~
$array = [100, 200, 300];
$value = array_first($array, function ($key, $value) {
return $value >= 150;});
// 200
~~~
默認值可以作為第三個參數傳遞給該方法,如果沒有值通過測試的話返回默認值:
~~~
$value = array_first($array, $callback, $default);
~~~
### array_flatten()
`array_flatten`方法將多維數組轉化為一維數組:
~~~
$array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']];
$array = array_flatten($array);
// ['Joe', 'PHP', 'Ruby'];
~~~
### array_forget()
`array_forget`方法使用”.“號從嵌套數組中移除給定鍵值對:
~~~
$array = ['products' => ['desk' => ['price' => 100]]];
array_forget($array, 'products.desk');
// ['products' => []]
~~~
### array_get()
`array_get`方法使用”.“號從嵌套數組中獲取值:
~~~
$array = ['products' => ['desk' => ['price' => 100]]];
$value = array_get($array, 'products.desk');
// ['price' => 100]
~~~
`array_get`函數還接收一個默認值,如果指定鍵不存在的話則返回該默認值:
~~~
$value = array_get($array, 'names.john', 'default');
~~~
### array_only()
`array_only`方法只從給定數組中返回指定鍵值對:
~~~
$array = ['name' => 'Desk', 'price' => 100, 'orders' => 10];
$array = array_only($array, ['name', 'price']);
// ['name' => 'Desk', 'price' => 100]
~~~
### array_pluck()
`array_pluck`方法從數組中返回給定鍵對應的鍵值對列表:
~~~
$array = [
['developer' => ['name' => 'Taylor']],
['developer' => ['name' => 'Abigail']]];
$array = array_pluck($array, 'developer.name');
// ['Taylor', 'Abigail'];
~~~
### array_pull()
`array_pull`方法從數組中返回并移除鍵值對:
~~~
$array = ['name' => 'Desk', 'price' => 100];
$name = array_pull($array, 'name');
// $name: Desk
// $array: ['price' => 100]
~~~
### array_set()
`array_set`方法在嵌套數組中使用”.“號設置值:
~~~
$array = ['products' => ['desk' => ['price' => 100]]];
array_set($array, 'products.desk.price', 200);
// ['products' => ['desk' => ['price' => 200]]]
~~~
### array_sort()
`array_sort`方法通過給定閉包的結果對數組進行排序:
~~~
$array = [
['name' => 'Desk'],
['name' => 'Chair'],
];
$array = array_values(array_sort($array, function ($value) {
return $value['name'];
}));
/*
[
['name' => 'Chair'],
['name' => 'Desk'],
]
*/
~~~
### array_sort_recursive()
`array_sort_recursive`函數使用`sort`函數對數組進行遞歸排序:
~~~
$array = [
[
'Roman',
'Taylor',
'Li',
],
[
'PHP',
'Ruby',
'JavaScript',
],
];
$array = array_sort_recursive($array);
/*
[
[
'Li',
'Roman',
'Taylor',
],
[
'JavaScript',
'PHP',
'Ruby',
]
];
*/
~~~
### array_where()
`array_where`函數使用給定閉包對數組進行排序:
~~~
$array = [100, '200', 300, '400', 500];
$array = array_where($array, function ($key, $value) {
return is_string($value);
});
// [1 => 200, 3 => 400]
~~~
### head()
`head`函數只是簡單返回給定數組的第一個元素:
~~~
$array = [100, 200, 300];
$first = head($array);
// 100
~~~
### last()
`last`函數返回給定數組的最后一個元素:
~~~
$array = [100, 200, 300];
$last = last($array);
// 300
~~~
## 3、路徑函數
### app_path()
`app_path`函數返回app目錄的絕對路徑:
~~~
$path = app_path();
~~~
你還可以使用`app_path`函數為相對于`app`目錄的給定文件生成絕對路徑:
~~~
$path = app_path('Http/Controllers/Controller.php');
~~~
### base_path()
`base_path`函數返回項目根目錄的絕對路徑:
~~~
$path = base_path();
~~~
你還可以使用`base_path`函數為相對于應用目錄的給定文件生成絕對路徑:
~~~
$path = base_path('vendor/bin');
~~~
### config_path()
`config_path`函數返回應用配置目錄的絕對路徑:
~~~
$path = config_path();
~~~
### database_path()
`database_path`函數返回應用數據庫目錄的絕對路徑:
~~~
$path = database_path();
~~~
### public_path()
`public_path`函數返回`public`目錄的絕對路徑:
~~~
$path = public_path();
~~~
### storage_path()
`storage_path`函數返回`storage`目錄的絕對路徑:
~~~
$path = storage_path();
~~~
還可以使用`storage_path`函數生成相對于`storage`目錄的給定文件的絕對路徑:
~~~
$path = storage_path('app/file.txt');
~~~
## 4、字符串函數
### camel_case()
`camel_case`函數將給定字符串轉化為按駝峰式命名規則的字符串:
~~~
$camel = camel_case('foo_bar');
// fooBar
~~~
### class_basename()
`class_basename`返回給定類移除命名空間后的類名:
~~~
$class = class_basename('Foo\Bar\Baz');
// Baz
~~~
### e()
`e`函數在給定字符串上運行`htmlentities`:
~~~
echo e('<html>foo</html>');
// <html>foo</html>
~~~
### ends_with()
`ends_with`函數判斷給定字符串是否以給定值結尾:
~~~
$value = ends_with('This is my name', 'name');
// true
~~~
### snake_case()
`snake_case`函數將給定字符串轉化為下劃線分隔的字符串:
~~~
$snake = snake_case('fooBar');
// foo_bar
~~~
### str_limit()
`str_limit`函數限制輸出字符串的數目,該方法接收一個字符串作為第一個參數以及該字符串最大輸出字符數作為第二個參數:
~~~
$value = str_limit('The PHP framework for web artisans.', 7);
// The PHP...
~~~
### starts_with()
`starts_with`函數判斷給定字符串是否以給定值開頭:
~~~
$value = starts_with('This is my name', 'This');
// true
~~~
### str_contains()
`str_contains`函數判斷給定字符串是否包含給定值:
~~~
$value = str_contains('This is my name', 'my');
// true
~~~
### str_finish()
`str_finish`函數添加字符到字符串結尾:
~~~
$string = str_finish('this/string', '/');
// this/string/
~~~
### str_is()
`str_is`函數判斷給定字符串是否與給定模式匹配,星號可用于表示通配符:
~~~
$value = str_is('foo*', 'foobar');
// true
$value = str_is('baz*', 'foobar');
// false
~~~
### str_plural()
`str_plural`函數將字符串轉化為復數形式,該函數當前只支持英文:
~~~
$plural = str_plural('car');
// cars
$plural = str_plural('child');
// children
~~~
### str_random()
`str_random`函數通過指定長度生成隨機字符串:
~~~
$string = str_random(40);
~~~
### str_singular()
`str_singular`函數將字符串轉化為單數形式,該函數目前只支持英文:
~~~
$singular = str_singular('cars');
// car
~~~
### str_slug()
`str_slug`函數將給定字符串生成URL友好的格式:
~~~
$title = str_slug("Laravel 5 Framework", "-");
// laravel-5-framework
~~~
### studly_case()
`studly_case`函數將給定字符串轉化為單詞開頭字母大寫的格式:
~~~
$value = studly_case('foo_bar');
// FooBar
~~~
### trans()
`trans`函數使用本地文件翻譯給定語言行:
~~~
echo trans('validation.required'):
~~~
### trans_choice()
trans_choice函數翻譯帶拐點的給定語言行:
~~~
$value = trans_choice('foo.bar', $count);
~~~
## 5、URL函數
### action()
**action**函數為給定[控制器](http://laravelacademy.org/post/60.html)動作生成URL,你不需要傳遞完整的命名空間到該控制器,傳遞相對于命名空間App\Http\Controllers的類名即可:
~~~
$url = action('HomeController@getIndex');
~~~
如果該方法接收路由參數,你可以將其作為第二個參數傳遞進來:
~~~
$url = action('UserController@profile', ['id' => 1]);
~~~
### asset()
使用當前請求的scheme(HTTP或HTTPS)為前端資源生成一個URL:
~~~
$url = asset('img/photo.jpg');
~~~
### secure_asset()
使用HTTPS為前端資源生成一個URL:
~~~
echo secure_asset('foo/bar.zip', $title, $attributes = []);
~~~
### route()
`route`函數為給定[命名路由](http://laravelacademy.org/post/53.html#ipt_kb_toc_53_5)生成一個URL:
~~~
$url = route('routeName');
~~~
如果該路由接收參數,你可以將其作為第二個參數傳遞進來:
~~~
$url = route('routeName', ['id' => 1]);
~~~
### url()
`url`函數為給定路徑生成絕對路徑:
~~~
echo url('user/profile');
echo url('user/profile', [1]);
~~~
## 6、其它函數
### auth()
`auth`函數返回一個認證器實例,為方便起見你可以用其取代`Auth`門面:
~~~
$user = auth()->user();
~~~
### back()
`back`函數生成重定向響應到用戶前一個位置:
~~~
return back();
~~~
### bcrypt()
`bcrypt`函數使用Bcrypt對給定值進行[哈希](http://laravelacademy.org/post/203.html),你可以用其替代`Hash`門面:
~~~
$password = bcrypt('my-secret-password');
~~~
### config()
`config`函數獲取配置變量的值,配置值可以通過使用”.”號訪問,包含文件名以及你想要訪問的選項。如果配置選項不存在的話默認值將會被指定并返回:
~~~
$value = config('app.timezone');$value = config('app.timezone', $default);
~~~
幫助函數`config`還可以用于在運行時通過傳遞鍵值對數組設置配置變量值:
~~~
config(['app.debug' => true]);
~~~
### csrf_field()
`csrf_field`函數生成一個包含CSRF令牌值的HTML隱藏域,例如,使用[Blade語法](http://laravelacademy.org/post/79.html):
~~~
{!! csrf_field() !!}
~~~
### csrf_token()
`csrf_token`函數獲取當前CSRF令牌的值:
~~~
$token = csrf_token();
~~~
### dd()
`dd`函數輸出給定變量值并終止腳本執行:
~~~
dd($value);
~~~
### elixir()
`elixir`函數獲取帶版本號的[Elixir](http://laravelacademy.org/post/187.html)文件路徑:
~~~
elixir($file);
~~~
### env()
`env`函數獲取環境變量值或返回默認值:
~~~
$env = env('APP_ENV');
// Return a default value if the variable doesn't exist...
$env = env('APP_ENV', 'production');
~~~
### event()
`event`函數分發給定[事件](http://laravelacademy.org/post/198.html)到對應監聽器:
~~~
event(new UserRegistered($user));
~~~
### factory()
`factory`函數為給定類、名稱和數量創建模型工廠構建器,可用于測試或[數據填充](http://laravelacademy.org/post/133.html#ipt_kb_toc_133_2):
~~~
$user = factory('App\User')->make();
~~~
### method_field()
`method_field`函數生成包含HTTP請求方法的HTML隱藏域,例如:
~~~
<form method="POST">
{!! method_field('delete') !!}</form>
~~~
### old()
`old`函數獲取一次性存放在session中的值:
~~~
$value = old('value');
~~~
### redirect()
`redirect`函數返回重定向器實例進行[重定向](http://laravelacademy.org/post/70.html#ipt_kb_toc_70_7):
~~~
return redirect('/home');
~~~
### response()
`response`函數創建一個[響應](http://laravelacademy.org/post/70.html)實例或者獲取響應工廠實例:
~~~
return response('Hello World', 200, $headers);return response()->json(['foo' => 'bar'], 200, $headers)
~~~
### value()
`value`函數返回給定的值,然而,如果你傳遞一個閉包到該函數,該閉包將會被執行并返回執行結果:
~~~
$value = value(function() { return 'bar'; });
~~~
### view()
`view`函數獲取一個[視圖](http://laravelacademy.org/post/76.html)實例:
~~~
return view('auth.login');
~~~
### with()
`with`函數返回給定的值,該函數在方法鏈中特別有用,別的地方就沒什么用了:
~~~
$value = with(new Foo)->work();
~~~
- 前言
- 序言
- 序言 ―― 發行版本說明
- 序言 ―― 升級指南
- 序言 ―― 貢獻代碼
- 開始
- 開始 ―― 安裝及配置
- 開始 ―― Laravel Homestead
- 基礎
- 基礎 ―― HTTP路由
- 基礎 ―― HTTP 中間件
- 基礎 ―― HTTP 控制器
- 基礎 ―― HTTP 請求
- 基礎 ―― HTTP 響應
- 基礎 ―― 視圖
- 基礎 ―― Blade模板
- 架構
- 架構 ―― 一次請求的生命周期
- 架構 ―― 應用目錄結構
- 架構 ―― 服務提供者
- 架構 ―― 服務容器
- 架構 ―― 契約
- 架構 ―― 門面
- 數據庫
- 數據庫 ―― 起步
- 數據庫 ―― 查詢構建器
- 數據庫 ―― 遷移
- 數據庫 ―― 填充數據
- Eloquent ORM
- Eloquent ORM ―― 起步
- Eloquent ORM ―― 關聯關系
- Eloquent ORM ―― 集合
- Eloquent ORM ―― 調整器
- Eloquent ORM ―― 序列化
- 服務
- 服務 ―― 用戶認證
- 服務 ―― Artisan 控制臺
- 服務 ―― Laravel Cashier(交易)
- 服務 ―― 緩存
- 服務 ―― 集合
- 服務 ―― Laravel Elixir
- 服務 ―― 加密
- 服務 ―― 錯誤&日志
- 服務 ―― 事件
- 服務 ―― 文件系統/云存儲
- 服務 ―― 哈希
- 服務 ―― 幫助函數
- 服務 ―― 本地化
- 服務 ―― 郵件
- 服務 ―― 包開發
- 服務 ―― 分頁
- 服務 ―― 隊列
- 服務 ―― Redis
- 服務 ―― Session
- 服務 ―― Envoy 任務運行器(SSH任務)
- 服務 ―― 任務調度
- 服務 ―― 測試
- 服務 ―― 驗證