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