Laravel 爲咱們提供了許多內置的幫助函數,你能夠在應用程序中的任何位置調用它。它們使你能夠方便地處理數組和對象,路徑,字符串,URL和其餘類型的工做流。php
儘管在 Laravel 核心中定義了許多幫助函數,但你能夠在 Laravel 中定義本身的幫助函數以免重複相同的代碼。它確保你的應用程序有更好的可維護性。html
咱們來看看如何建立本身的定製 Laravel 幫助函數laravel
Laravel 中有許多內置的幫助程序可供你的應用程序使用。它們根據它們提供的功能類型進行分組。這是一個完整的內置 Laravel 幫助文件。git
在這個組中,助手提供了處理數組和對象的能力。 該組包含用於添加兩個數組的輔助函數,將多維數組摺疊成單個數組,返回數組的第一個元素,檢查數組中是否存在給定的項目或項目,並執行許多其餘類型的操做。github
這組helper返回Laravel應用程序中不一樣目錄的絕對路徑,例如 app,config,public,resource,storage和你的應用程序的基本路徑。web
該組中的助手使用字符串操做。 你能夠將字符串轉換爲駱駝大小寫,找到該類的基本名稱,運行 htmlspecialchars
,將文本轉換爲kebab大小寫,將文本轉換爲大小寫,並執行許多其餘類型的字符串操做。json
助手的URLs組與生成URL一塊兒工做。你能夠爲控制器操做生成URL,命名爲route,以及指定路徑的徹底限定URL。數組
這類幫助程序包含處理頁面狀態,服務容器,認證,緩存等功能。緩存
在本節中,咱們將經過建立Laravel幫助程序文件,該文件能夠在Laravel應用程序中全局使用。 你能夠組織你的幫助程序文件的位置,可是,我更願意將個人Laravel項目幫助程序文件保存在 app/Helpers/Helper.php
中。 在本教程中,咱們將在我想要的位置建立一個幫助文件。bash
你能夠將你的幫助程序文件放在你的Laravel應用程序的任何位置,將它放在你的應用程序目錄下是標準的。
讓咱們在app下建立一個 Helpers
目錄並建立一個 Helper.php
文件。這些是該文件的如下內容。
<?php if (!function_exists('human_file_size')) { /** * Returns a human readable file size * * @param integer $bytes * Bytes contains the size of the bytes to convert * * @param integer $decimals * Number of decimal places to be returned * * @return string a string in human readable format * * */ function human_file_size($bytes, $decimals = 2) { $sz = 'BKMGTPE'; $factor = (int)floor((strlen($bytes) - 1) / 3); return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . $sz[$factor]; } } if (!function_exists('in_arrayi')) { /** * Checks if a value exists in an array in a case-insensitive manner * * @param mixed $needle * The searched value * * @param $haystack * The array * * @param bool $strict [optional] * If set to true type of needle will also be matched * * @return bool true if needle is found in the array, * false otherwise */ function in_arrayi($needle, $haystack, $strict = false) { return in_array(strtolower($needle), array_map('strtolower', $haystack), $strict); } }
若是你正在使用一個類而且它的方法是你的助手,你能夠用命名空間聲明來啓動這個文件。
namespace App\Helpers;
若是你不使用命名空間聲明,則這些函數將變爲全局可用,你甚至能夠在不指定名稱空間的狀況下使用它們。 全部Laravel內置的幫助函數都是在沒有命名空間的狀況下定義的。 此外,助手類也將在全局範圍內提供。 所以,若是你想在不指定命名空間的狀況下使用助手,只需刪除這一行。
定義這些函數時有一些注意事項。全部的Laravel助手文件函數都會被檢查以免函數定義衝突。
if (!function_exists('human_file_size')) { function human_file_size($bytes, $decimals = 2) { // ... } }
若是跳過此檢查,則每次從新定義具備相同定義的函數時都會發生衝突。你可使用這個檢查,或者你也能夠用你的函數名稱做爲前綴來避免衝突。
如今,就咱們的幫助文件而言,就是這樣。讓咱們看看如何在Laravel應用程序中使用助手文件。
讓咱們看看如何使用全部這些方法。
第一個很是簡單直接。 只需轉到位於Laravel項目中的 composer.json
文件,你將看到自動加載 key。 Composer 有一個key files
(你想自動加載的文件路徑數組),你能夠在自動 `autoload 中使用它。 如:
"autoload": { "files": [ "app/Helpers/Helper.php" ], "classmap": [ "database/seeds", "database/factories" ], "psr-4": { "App\\": "app/" } },
更改composer.json文件並向文件數組添加新路徑後,須要從新生成自動加載文件。只需從Laravel項目目錄中的終端運行此命令便可。
composer dump-autoload
如今,你的幫助程序文件將自動加載到你的Laravel項目中。
讓咱們來看看如何使用服務提供者來自動加載助手文件。轉至應用程序根目錄中的命令行並運行如下命令以建立新的服務提供者。
php artisan make:provider HelperServiceProvider
將會提示運行結果
Provider created successfully.
一旦服務提供者成功建立,打開該文件。在註冊方法中添加你的助手文件。
public function register() { $file = app_path('Helpers/Helper.php'); if (file_exists($file)) { require_once($file); } }
在註冊方法中,咱們包含了咱們的依賴關係。 在大型項目中,你可能在目錄中有多個幫助程序文件,而且你想要所有這些文件。 你能夠更改註冊方法,以下所示,你的服務提供商將加載Helpers目錄中的全部文件。
public function register() { foreach (glob(app_path() . '/Helpers/*.php') as $file) { require_once($file); } }
它將須要 app/Helpers
目錄中的全部文件。
如今咱們的服務提供者已經完成,咱們須要註冊咱們的服務提供者,因此,Laravel會在引導期間加載它。 爲此,請轉至 config/app.php
並在結尾處的 providers
數組中添加如下行。
App\Providers\HelperServiceProvider::class,
若是你的幫助文件涉及到一個擁有這些幫助方法的類,而且你已經指定了命名空間,那麼你能夠經過定義一個別名來絕不費力地使用它們。 您能夠經過在 config/app.php
文件中的別名數組末尾添加如下內容輕鬆完成此操做。
'Helper' => App\Helpers\Helper::class,
經過將這添加到別名數組中,你將可以使用Helper關鍵字調用助手。這就是爲服務提供者建立你的幫手。
你也可使用第三方package: Laravel helpers package。你能夠經過在控制檯中從你的應用程序的根目錄運行此命令來經過編寫器安裝它。
composer require browner12/helpers
在 config/app.php
中的 providers
數組中添加如下行
browner12\helpers\HelperServiceProvider::class,
若是你正在使用Laravel的自動包發現功能,則能夠跳過此步驟。 完成必要的步驟以後,你可使用此命令建立助手文件。
php artisan make:helper Helper
它將在 App\Helpers
中建立一個 Helper.php
文件,你能夠輕鬆添加全部幫助程序功能。
如今咱們的函數在Helper文件中定義,沒有定義名稱空間,咱們能夠很容易地使用它們。 只需在 routes/web.php
中找到你的路由文件,並將此功能用於首頁。 例如,這是完整的 routes/web.php
文件:
<?php Route::get('/', function () { return human_file_size(1024*1024); });
它將簡單地返回做爲參數傳遞的字節數的可讀大小。你能夠從任何地方控制器或視圖調用這些函數。
歡迎留言討論。
更多PHP相關,請前往 PHPCasts