如何在 Laravel 中创建自定义辅助函数
How to create custom helper functions in Laravel
我想创建辅助函数以避免在 Laravel 中的视图之间重复代码。例如:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
它们基本上是文本格式化函数。我应该如何定义全局可用的辅助函数,例如 fooFormatText()
?
在您的应用程序文件夹中创建一个 helpers.php
文件并使用 composer 加载它:
"autoload": {
"classmap": [
...
],
"psr-4": {
"App\": "app/"
},
"files": [
"app/helpers.php" // <---- ADD THIS
]
},
将其添加到您的 composer.json
文件后,运行 以下命令:
composer dump-autoload
如果您不喜欢将 helpers.php
文件保存在 app
目录中(因为它不是 PSR-4 命名空间 class 文件),您可以执行 laravel.com
网站确实:存储 helpers.php
in the bootstrap directory。请记住在您的 composer.json
文件中设置它:
"files": [
"bootstrap/helpers.php"
]
我最初的想法也是作曲家自动加载,但对我来说感觉不是很 Laravel 5ish。 L5 大量使用服务提供商,它们是引导您的应用程序的东西。
首先,我在 app
目录中创建了一个名为 Helpers
的文件夹。然后在 Helpers
文件夹中,我为要添加的功能添加了文件。拥有一个包含多个文件的文件夹可以避免一个大文件变得太长且难以管理。
接下来我通过 运行 artisan 命令创建了一个 HelperServiceProvider.php
:
artisan make:provider HelperServiceProvider
在 register
方法中我添加了这个片段
public function register()
{
foreach (glob(app_path().'/Helpers/*.php') as $filename){
require_once($filename);
}
}
最后在你的 config/app.php
的 providers 数组中注册服务提供者
'providers' => [
'App\Providers\HelperServiceProvider',
]
现在您 Helpers
目录中的所有文件都已加载,可以使用了。
更新 2016-02-22
这里有很多不错的选择,但如果我的回答对你有用,我继续制作了一个包,以这种方式包含助手。您可以使用该包来获取灵感,也可以随意使用 Composer 下载它。它有一些我经常使用的内置助手(但默认情况下它们都是不活动的),并允许您使用简单的 Artisan 生成器制作自己的自定义助手。它还解决了一位响应者使用映射器的建议,并允许您明确定义要加载的自定义助手,或者默认情况下,自动加载助手目录中的所有 PHP 文件。非常感谢反馈和 PR!
composer require browner12/helpers
Github: browner12/helpers
这是 JeffreyWay
在 Laracasts Discussion 中的建议。
- 在您的
app/Http
目录中,创建一个 helpers.php
文件并添加您的函数。
- 在
composer.json
内,在 autoload
块中,添加 "files": ["app/Http/helpers.php"]
.
- 运行
composer dump-autoload
.
这是我的 HelpersProvider.php 文件:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider
{
protected $helpers = [
// Add your helpers in here
];
/**
* Bootstrap the application services.
*/
public function boot()
{
//
}
/**
* Register the application services.
*/
public function register()
{
foreach ($this->helpers as $helper) {
$helper_path = app_path().'/Helpers/'.$helper.'.php';
if (\File::isFile($helper_path)) {
require_once $helper_path;
}
}
}
}
您应该在app
文件夹下创建一个名为Helpers
的文件夹,然后在其中创建名为whatever.php
的文件并在$helpers 数组中添加字符串whatever
。
完成!
编辑
我不再使用这个选项,我目前正在使用 composer 来加载像 helpers 这样的静态文件。
您可以直接添加助手:
...
"autoload": {
"files": [
"app/helpers/my_helper.php",
...
]
},
...
这是我创建的 bash shell 脚本,可以非常快速地制作 Laravel 5 外观。
运行 这个在你的 Laravel 5 安装目录里。
这样称呼它:
make_facade.sh -f <facade_name> -n '<namespace_prefix>'
示例:
make_facade.sh -f helper -n 'App\MyApp'
如果您 运行 该示例,它将在 'your_laravel_installation_dir/app/MyApp'.
下创建目录 Facades
和 Providers
它将创建以下 3 个文件并将它们输出到屏幕:
./app/MyApp/Facades/Helper.php
./app/MyApp/Facades/HelperFacade.php
./app/MyApp/Providers/HelperServiceProvider.php
完成后,会显示类似如下的信息:
===========================
Finished
===========================
Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',
因此请更新 'config/app.php'
中的提供商和别名列表
运行 composer -o dumpautoload
“./app/MyApp/Facades/Helper.php”原本是这样的:
<?php
namespace App\MyApp\Facades;
class Helper
{
//
}
现在只需在“./app/MyApp/Facades/Helper.php”中添加您的方法即可。
下面是“./app/MyApp/Facades/Helper.php”添加辅助函数后的样子。
<?php
namespace App\MyApp\Facades;
use Request;
class Helper
{
public function isActive($pattern = null, $include_class = false)
{
return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
}
}
This is how it would be called:
===============================
{!! Helper::isActive('help', true) !!}
此函数需要一个模式并且可以接受可选的第二个布尔参数。
如果当前 URL 匹配传递给它的模式,它将输出 'active' (或者 'class="active"' 如果你添加 'true' 作为函数的第二个参数打电话)。
我用它来突出显示活动的菜单。
下面是我的脚本的源代码。我希望你觉得它有用,如果你有任何问题,请告诉我。
#!/bin/bash
display_syntax(){
echo ""
echo " The Syntax is like this:"
echo " ========================"
echo " "$(basename [=16=])" -f <facade_name> -n '<namespace_prefix>'"
echo ""
echo " Example:"
echo " ========"
echo " "$(basename [=16=]) -f test -n "'App\MyAppDirectory'"
echo ""
}
if [ $# -ne 4 ]
then
echo ""
display_syntax
exit
else
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
while [[ $# > 0 ]]
do
key=""
case $key in
-n|--namespace_prefix)
namespace_prefix_in=""
echo ""
shift # past argument
;;
-f|--facade)
facade_name_in=""
shift # past argument
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
fi
echo Facade Name = ${facade_name_in}
echo Namespace Prefix = $(echo ${namespace_prefix_in} | sed -e 's#\#\\#')
echo ""
}
function display_start_banner(){
echo '**********************************************************'
echo '* STARTING LARAVEL MAKE FACADE SCRIPT'
echo '**********************************************************'
}
# Init the Vars that I can in the beginning
function init_and_export_vars(){
echo
echo "INIT and EXPORT VARS"
echo "===================="
# Substitution Tokens:
#
# Tokens:
# {namespace_prefix}
# {namespace_prefix_lowerfirstchar}
# {facade_name_upcase}
# {facade_name_lowercase}
#
namespace_prefix=$(echo ${namespace_prefix_in} | sed -e 's#\#\\#')
namespace_prefix_lowerfirstchar=$(echo ${namespace_prefix_in} | sed -e 's#\#/#g' -e 's/^\(.\)/\l/g')
facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u/')
facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower([=16=])}')
# Filename: {facade_name_upcase}.php - SOURCE TEMPLATE
source_template='<?php
namespace {namespace_prefix}\Facades;
class {facade_name_upcase}
{
//
}
'
# Filename: {facade_name_upcase}ServiceProvider.php - SERVICE PROVIDER TEMPLATE
serviceProvider_template='<?php
namespace {namespace_prefix}\Providers;
use Illuminate\Support\ServiceProvider;
use App;
class {facade_name_upcase}ServiceProvider extends ServiceProvider {
public function boot()
{
//
}
public function register()
{
App::bind("{facade_name_lowercase}", function()
{
return new \{namespace_prefix}\Facades\{facade_name_upcase};
});
}
}
'
# {facade_name_upcase}Facade.php - FACADE TEMPLATE
facade_template='<?php
namespace {namespace_prefix}\Facades;
use Illuminate\Support\Facades\Facade;
class {facade_name_upcase}Facade extends Facade {
protected static function getFacadeAccessor() { return "{facade_name_lowercase}"; }
}
'
}
function checkDirectoryExists(){
if [ ! -d ${namespace_prefix_lowerfirstchar} ]
then
echo ""
echo "Can't find the namespace: "${namespace_prefix_in}
echo ""
echo "*** NOTE:"
echo " Make sure the namspace directory exists and"
echo " you use quotes around the namespace_prefix."
echo ""
display_syntax
exit
fi
}
function makeDirectories(){
echo "Make Directories"
echo "================"
mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
}
function createSourceTemplate(){
source_template=$(echo "${source_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create Source Template:"
echo "======================="
echo "${source_template}"
echo ""
echo "${source_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}.php
}
function createServiceProviderTemplate(){
serviceProvider_template=$(echo "${serviceProvider_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create ServiceProvider Template:"
echo "================================"
echo "${serviceProvider_template}"
echo ""
echo "${serviceProvider_template}" > ./${namespace_prefix_lowerfirstchar}/Providers/${facade_name_upcase}ServiceProvider.php
}
function createFacadeTemplate(){
facade_template=$(echo "${facade_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create Facade Template:"
echo "======================="
echo "${facade_template}"
echo ""
echo "${facade_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}Facade.php
}
function serviceProviderPrompt(){
echo "Providers: ${namespace_prefix_in}\Providers\${facade_name_upcase}ServiceProvider,"
}
function aliasPrompt(){
echo "Alias: '"${facade_name_upcase}"' => '"${namespace_prefix_in}"\Facades\${facade_name_upcase}Facade',"
}
#
# END FUNCTION DECLARATIONS
#
###########################
## START RUNNING SCRIPT ##
###########################
display_start_banner
init_and_export_vars
makeDirectories
checkDirectoryExists
echo ""
createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo " Finished TEST"
echo "==========================="
echo ""
echo "Add these lines to config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""
Laravel 5 中的自定义 类,简单的方法
此答案适用于 一般 自定义 classes Laravel。有关更具体的 Blade 答案,请参阅 .
第 1 步: 创建您的助手(或其他自定义 class)文件并为其提供匹配的命名空间。写下你的 class 和方法:
<?php // Code within app\Helpers\Helper.php
namespace App\Helpers;
class Helper
{
public static function shout(string $string)
{
return strtoupper($string);
}
}
步骤 2: 创建别名:
<?php // Code within config/app.php
'aliases' => [
...
'Helper' => App\Helpers\Helper::class,
...
第三步: 运行 composer dump-autoload
在项目根目录下
第 4 步: 在您的 Blade 模板中使用它:
<!-- Code within resources/views/template.blade.php -->
{!! Helper::shout('this is how to use autoloading correctly!!') !!}
加分项: 在您的 Laravel 应用中的任何位置使用此 class:
<?php // Code within app/Http/Controllers/SomeController.php
namespace App\Http\Controllers;
use Helper;
class SomeController extends Controller
{
public function __construct()
{
Helper::shout('now i\'m using my helper class in a controller!!');
}
...
来源:http://www.php-fig.org/psr/psr-4/
为什么有效:https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
自动加载的来源:
http://php.net/manual/en/language.oop5.autoload.php
筛选了关于 SO 和 Google 的各种答案后,我仍然找不到最佳方法。大多数答案都建议我们离开应用程序并依靠第 3 方工具 Composer 来完成这项工作,但我不相信耦合到一个工具只是为了包含一个文件是明智的。
came the closest to how I think it should be approached, but (at least in 5.1), the service provider step is unnecessary. 突出了 PSR-4
的使用,这让我们更近了一步。这是我在视图中对助手的最终实现:
首先,在您的应用程序目录中的任意位置创建一个带有命名空间的帮助文件:
namespace App\Helpers;
class BobFinder
{
static function bob()
{
return '<strong>Bob?! Is that you?!</strong>';
}
}
接下来,在 aliases
数组中为 config\app.php
中的 class 添加别名:
'aliases' => [
// Other aliases
'BobFinder' => App\Helpers\BobFinder::class
]
这就是您需要做的全部。 PSR-4
和别名应该将助手暴露给您的视图,因此在您的视图中,如果您键入:
{!! BobFinder::bob() !!}
它应该输出:
<strong>Bob?! Is that you?!</strong>
对于我的 Laravel 项目中的自定义助手库,我在我的 Laravel/App
目录和库目录中创建了一个名为 Libraries
的文件夹,我为不同的文件创建了各种文件辅助库。
创建我的帮助文件后,我只需将所有这些文件包含在我的 composer.json 文件中,如下所示
...
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Libraries/commonFunctions.php"
],
"psr-4": {
"App\": "app/"
}
},
...
并执行
composer dump-autoload
Laravel 5
中的自定义 Blade 指令
是的,还有另一种方法!
步骤 1: 注册自定义 Blade 指令:
<?php // code in app/Providers/AppServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Blade; // <-- This is important! Without it you'll get an exception.
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// Make a custom blade directive:
Blade::directive('shout', function ($string) {
return trim(strtoupper($string), '(\'\')');
});
// And another one for good measure:
Blade::directive('customLink', function () {
return '<a href="#">Custom Link</a>';
});
}
...
步骤 2: 使用自定义 Blade 指令:
<!-- // code in resources/views/view.blade.php -->
@shout('this is my custom blade directive!!')
<br />
@customLink
输出:
这是我的习惯 BLADE 指令!!
Custom Link
来源:https://laravel.com/docs/5.1/blade#extending-blade
补充阅读:https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
如果您想了解如何最好地制作可以在任何地方使用的自定义类,请参阅Custom Classes in Laravel 5, the Easy Way
我使用的另一种方式是:
1) 在 app\FolderName\fileName.php 中创建了一个文件,并在其中包含了这段代码,即
<?php
namespace App\library
{
class hrapplication{
public static function libData(){
return "Data";
}
}
}
?>
2) 然后在我们的 blade
$FmyFunctions = new \App\FolderName\classsName;
echo $is_ok = ($FmyFunctions->libData());
就是这样。并且有效
在 Laravel 5.3 及更高版本中,Laravel 团队将所有程序文件 (routes.php
) 移出了 app/
目录,整个 app/
文件夹 psr-4
自动加载。接受的答案在这种情况下会起作用,但我觉得不合适。
所以我所做的是在项目的根目录下创建了一个 helpers/
目录,并将帮助程序文件放入其中,在我的 composer.json
文件中,我这样做了:
...
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\": "app/"
},
"files": [
"helpers/ui_helpers.php"
]
},
...
这样我的 app/
目录仍然是一个 psr-4 自动加载的目录,并且助手组织得更好一些。
在目录 bootstrap\autoload.php
require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add
添加这个文件
app\Helpers\function.php
编写自定义助手的最佳实践是
1) 在项目根目录的app
目录中,创建一个名为Helpers 的文件夹(只是为了分隔和组织代码)。
2) 在文件夹内写入 psr-4 文件或普通 php 文件
如果PHP文件是psr-4格式那么会自动加载,否则在项目根目录composer.json里面添加下面一行
在autoload
键中,新建一个名为files
的键,用于在自动加载时加载文件,在files
对象中添加从app目录开始的路径。 ,这里是一个例子。
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\": "app/"
},
"files": [
"app/Helpers/customHelpers.php"
]
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
PS : 如果文件没有加载,请尝试 运行 composer dump-autoload
。
由于 OP 要求最佳实践,我认为我们仍然缺少一些好的建议。
单个 helpers.php 文件远不是一个好习惯。首先,因为你混合了很多不同类型的功能,所以你违反了良好的编码原则。此外,这 可能 不仅会损害代码文档,还会损害代码指标,例如 圈复杂度 、 可维护性指数 和 霍尔斯特德体积 。功能越多越差。
使用 phpDocumentor, but using Sami it won't render procedural files. Laravel API documentation is such a case - there's no helper functions documentation: https://laravel.com/api/5.4
之类的工具,代码文档就可以了
可以使用 PhpMetrics. Using PhpMetrics version 1.x to analyze Laravel 5.4 framework code will give you very bad CC/MI/HV metrics for both src/Illuminate/Foundation/helpers.php and src/Illuminate/Support/helpers.php 文件等工具分析代码指标。
多个上下文帮助文件(例如 string_helpers.php、array_helpers.php 等)将当然可以改进那些不好的指标,从而使代码更容易维护。根据使用的代码文档生成器,这就足够了。
它可以通过使用 helper classes 和静态方法来进一步改进,这样它们就可以使用命名空间进行上下文化。就像 Laravel 已经对 Illuminate\Support\Str
and Illuminate\Support\Arr
classes 所做的一样。这改进了代码 metrics/organization 和文档。 Class 可以使用别名使它们更易于使用。
使用 classes 构建可以更好地组织代码和文档,但另一方面,我们最终会失去那些简短易记的全局函数。我们可以通过为那些静态 classes 方法创建函数别名来进一步改进该方法。这可以手动或动态完成。
Laravel 通过在映射到静态 classes 方法的程序帮助程序文件中声明函数,在内部使用第一种方法。这可能不是理想的事情,因为您需要重新声明所有内容 (docblocks/arguments)。
我个人使用动态方法 HelperServiceProvider
class 在执行时间内创建这些函数:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider
{
/**
* The helper mappings for the application.
*
* @var array
*/
protected $helpers = [
'uppercase' => 'App\Support\Helpers\StringHelper::uppercase',
'lowercase' => 'App\Support\Helpers\StringHelper::lowercase',
];
/**
* Bootstrap the application helpers.
*
* @return void
*/
public function boot()
{
foreach ($this->helpers as $alias => $method) {
if (!function_exists($alias)) {
eval("function {$alias}(...$args) { return {$method}(...$args); }");
}
}
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
可以说这是过度设计,但我不这么认为。它工作得很好,与预期相反,至少在使用 PHP 7.x.
时,它不会花费相关的执行时间
这里有一些很好的答案,但我认为这是最简单的。
在 Laravel 5.4(也可能是更早的版本)中,您可以在方便的地方创建一个 class,例如 App/Libraries/Helper.php
class Helper() {
public function uppercasePara($str) {
return '<p>' .strtoupper($str). '<p>;
}
}
然后你可以像这样在你的 Blade 模板中简单地调用它:
@inject('helper', \App\Libraries\Helper)
{{ $helper->drawTimeSelector() }}
如果你不想使用 @inject 那么只需将 'uppercasePara' 函数设为静态并将调用嵌入到你的 Blade 模板中,如下所示:
{{ \App\Libraries\Helper::drawTimeSelector() }}
不需要别名。 Laravel 自动解析具体 class。
创建自定义助手目录:
首先在app目录下创建Helpers目录。
创建 hlper class 定义:
现在让我们创建一个简单的辅助函数来连接两个字符串。在/app/Helpers/MyFuncs.php中新建一个文件MyFuncs.php 添加如下代码
<?php
namespace App\Helpers;
class MyFuncs {
public static function full_name($first_name,$last_name) {
return $first_name . ', '. $last_name;
}
}
命名空间App\Helpers;在 App 命名空间下定义 Helpers 命名空间。
class MyFuncs {…} 定义助手 class MyFuncs。
public 静态函数 full_name($first_name,$last_name) {...} 定义了一个静态函数,它接受两个字符串参数和 returns 一个连接的字符串
帮手服务提供class
服务提供商用于自动加载 classes。我们需要定义一个服务提供者,它将在 /app/Helpers 目录中加载我们所有的助手 classes。
运行 以下 artisan 命令:
php artisan make:provider HelperServiceProvider
文件将在 /app/Providers/HelperServiceProvider.php
中创建
Open /app/Providers/HelperServiceProvider.php
添加以下代码:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
foreach (glob(app_path().'/Helpers/*.php') as $filename){
require_once($filename);
}
}
}
这里,
namespace App\Providers; defines the namespace provider
use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
public function boot(){…} bootstraps the application service
public function register(){…} is the function that loads the helpers
foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.
我们现在需要注册 HelperServiceProvider 并为我们的助手创建一个别名。
打开/config/app.php
文件
定位供应商数组变量
添加以下行
App\Providers\HelperServiceProvider::class,
找到别名数组变量
添加以下行
'MyFuncs' => App\Helpers\MyFuncs::class,
保存更改
使用我们的自定义助手
我们将创建一个路由来调用我们的自定义辅助函数 Open /app/routes。php
添加以下路由定义
Route::get('/func', function () {
return MyFuncs::full_name("John","Doe");
});
这里,
return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class
首先在 App\Http 目录中创建 helpers.php。
然后在composer.json
里面添加如下代码
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Http/helpers.php"
],
"psr-4": {
"App\": "app/"
}
},
下一步运行下面的命令
composer dump-autoload
现在您可以在 helpers.php 文件中定义您的自定义函数。
在 app/Helper/Helpers 中创建 Helpers.php。php
namespace App\Helper
class Helpers
{
}
添加作曲家和作曲家更新
"autoload": {
"classmap": [
"database/seeds",
"database/factories",
"database","app/Helper/Helpers.php"
],
"psr-4": {
"App\": "app/"
},
"files": ["app/Helper/Helpers.php"]
},
在控制器中使用
use App\Helper\Helpers
在视图中使用
配置更改->app.php 文件
'aliases' => [
...
'Helpers' => 'App\Helper\Helpers'
],
通话可见
<?php echo Helpers::function_name(); ?>
您实际上可以在别名下添加到 config/app.php
文件,而不是包含您的自定义助手 class。
应该是这样的。
'aliases' => [
...
...
'Helper' => App\Http\Services\Helper::class,
]
然后到您的控制器,包括使用方法 'use Helper' 的 Helper,这样您就可以简单地在您的 Helper class.
上调用一些方法
eg. Helper::some_function();
或者在资源视图中您可以直接调用助手 class。
eg. {{Helper::foo()}}
但这仍然是要遵循的开发人员编码风格方法。我们可能有不同的解决问题的方法,我只是想把我也有的分享给初学者。
**
- 状态助手
**
创建新助手
<?php
namespace App\Helpers;
use Illuminate\Database\Eloquent\Collection;
class StatusHelper
{
protected static $_status = [
1=> [
'value' => 1,
'displayName' => 'Active',
],
2 => [
'value' => 2,
'displayName' => 'Inactive',
],
3 => [
'value' => 3,
'displayName' => 'Delete',
],
];
public static function getStatusesList()
{
$status = (new Collection(self::$_status))->pluck('displayName', 'value')->toArray();
return $status;
}
}
用于控制器和任何视图文件
use App\Helpers\StatusHelper;
class ExampleController extends Controller
{
public function index()
{
$statusList = StatusHelper::getStatusesList();
return view('example.index', compact('statusList'));
}
}
在 App/Helpers/
中创建新文件 examplehelper.php
然后在 composer.json
文件中添加
"autoload": { "classmap": [ "database"], "psr-4": { "App\": "app/" },
"files": ["helpers/examplehelper.php" ]},
我知道现在回答这个问题已经很晚了,但是,这个问题每天都在所有初级开发人员身上发生,所以对于直接步骤,请执行以下操作:
** 将您的辅助函数分组到 类 中(要使用 blade 中的函数,只需将它们设为静态即可)并将所有 类 放入配置 Laravel文件夹 app.php 别名
'aliases' => [
"YourClassName" => App\Support\YourClassName,
]
现在您也可以在 blade 和控制器上使用所有静态函数。
我想创建辅助函数以避免在 Laravel 中的视图之间重复代码。例如:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
它们基本上是文本格式化函数。我应该如何定义全局可用的辅助函数,例如 fooFormatText()
?
在您的应用程序文件夹中创建一个 helpers.php
文件并使用 composer 加载它:
"autoload": {
"classmap": [
...
],
"psr-4": {
"App\": "app/"
},
"files": [
"app/helpers.php" // <---- ADD THIS
]
},
将其添加到您的 composer.json
文件后,运行 以下命令:
composer dump-autoload
如果您不喜欢将 helpers.php
文件保存在 app
目录中(因为它不是 PSR-4 命名空间 class 文件),您可以执行 laravel.com
网站确实:存储 helpers.php
in the bootstrap directory。请记住在您的 composer.json
文件中设置它:
"files": [
"bootstrap/helpers.php"
]
我最初的想法也是作曲家自动加载,但对我来说感觉不是很 Laravel 5ish。 L5 大量使用服务提供商,它们是引导您的应用程序的东西。
首先,我在 app
目录中创建了一个名为 Helpers
的文件夹。然后在 Helpers
文件夹中,我为要添加的功能添加了文件。拥有一个包含多个文件的文件夹可以避免一个大文件变得太长且难以管理。
接下来我通过 运行 artisan 命令创建了一个 HelperServiceProvider.php
:
artisan make:provider HelperServiceProvider
在 register
方法中我添加了这个片段
public function register()
{
foreach (glob(app_path().'/Helpers/*.php') as $filename){
require_once($filename);
}
}
最后在你的 config/app.php
的 providers 数组中注册服务提供者
'providers' => [
'App\Providers\HelperServiceProvider',
]
现在您 Helpers
目录中的所有文件都已加载,可以使用了。
更新 2016-02-22
这里有很多不错的选择,但如果我的回答对你有用,我继续制作了一个包,以这种方式包含助手。您可以使用该包来获取灵感,也可以随意使用 Composer 下载它。它有一些我经常使用的内置助手(但默认情况下它们都是不活动的),并允许您使用简单的 Artisan 生成器制作自己的自定义助手。它还解决了一位响应者使用映射器的建议,并允许您明确定义要加载的自定义助手,或者默认情况下,自动加载助手目录中的所有 PHP 文件。非常感谢反馈和 PR!
composer require browner12/helpers
Github: browner12/helpers
这是 JeffreyWay
在 Laracasts Discussion 中的建议。
- 在您的
app/Http
目录中,创建一个helpers.php
文件并添加您的函数。 - 在
composer.json
内,在autoload
块中,添加"files": ["app/Http/helpers.php"]
. - 运行
composer dump-autoload
.
这是我的 HelpersProvider.php 文件:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider
{
protected $helpers = [
// Add your helpers in here
];
/**
* Bootstrap the application services.
*/
public function boot()
{
//
}
/**
* Register the application services.
*/
public function register()
{
foreach ($this->helpers as $helper) {
$helper_path = app_path().'/Helpers/'.$helper.'.php';
if (\File::isFile($helper_path)) {
require_once $helper_path;
}
}
}
}
您应该在app
文件夹下创建一个名为Helpers
的文件夹,然后在其中创建名为whatever.php
的文件并在$helpers 数组中添加字符串whatever
。
完成!
编辑
我不再使用这个选项,我目前正在使用 composer 来加载像 helpers 这样的静态文件。
您可以直接添加助手:
...
"autoload": {
"files": [
"app/helpers/my_helper.php",
...
]
},
...
这是我创建的 bash shell 脚本,可以非常快速地制作 Laravel 5 外观。
运行 这个在你的 Laravel 5 安装目录里。
这样称呼它:
make_facade.sh -f <facade_name> -n '<namespace_prefix>'
示例:
make_facade.sh -f helper -n 'App\MyApp'
如果您 运行 该示例,它将在 'your_laravel_installation_dir/app/MyApp'.
下创建目录Facades
和 Providers
它将创建以下 3 个文件并将它们输出到屏幕:
./app/MyApp/Facades/Helper.php
./app/MyApp/Facades/HelperFacade.php
./app/MyApp/Providers/HelperServiceProvider.php
完成后,会显示类似如下的信息:
===========================
Finished
===========================
Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',
因此请更新 'config/app.php'
中的提供商和别名列表运行 composer -o dumpautoload
“./app/MyApp/Facades/Helper.php”原本是这样的:
<?php
namespace App\MyApp\Facades;
class Helper
{
//
}
现在只需在“./app/MyApp/Facades/Helper.php”中添加您的方法即可。
下面是“./app/MyApp/Facades/Helper.php”添加辅助函数后的样子。
<?php
namespace App\MyApp\Facades;
use Request;
class Helper
{
public function isActive($pattern = null, $include_class = false)
{
return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
}
}
This is how it would be called:
===============================
{!! Helper::isActive('help', true) !!}
此函数需要一个模式并且可以接受可选的第二个布尔参数。
如果当前 URL 匹配传递给它的模式,它将输出 'active' (或者 'class="active"' 如果你添加 'true' 作为函数的第二个参数打电话)。
我用它来突出显示活动的菜单。
下面是我的脚本的源代码。我希望你觉得它有用,如果你有任何问题,请告诉我。
#!/bin/bash
display_syntax(){
echo ""
echo " The Syntax is like this:"
echo " ========================"
echo " "$(basename [=16=])" -f <facade_name> -n '<namespace_prefix>'"
echo ""
echo " Example:"
echo " ========"
echo " "$(basename [=16=]) -f test -n "'App\MyAppDirectory'"
echo ""
}
if [ $# -ne 4 ]
then
echo ""
display_syntax
exit
else
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
while [[ $# > 0 ]]
do
key=""
case $key in
-n|--namespace_prefix)
namespace_prefix_in=""
echo ""
shift # past argument
;;
-f|--facade)
facade_name_in=""
shift # past argument
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
fi
echo Facade Name = ${facade_name_in}
echo Namespace Prefix = $(echo ${namespace_prefix_in} | sed -e 's#\#\\#')
echo ""
}
function display_start_banner(){
echo '**********************************************************'
echo '* STARTING LARAVEL MAKE FACADE SCRIPT'
echo '**********************************************************'
}
# Init the Vars that I can in the beginning
function init_and_export_vars(){
echo
echo "INIT and EXPORT VARS"
echo "===================="
# Substitution Tokens:
#
# Tokens:
# {namespace_prefix}
# {namespace_prefix_lowerfirstchar}
# {facade_name_upcase}
# {facade_name_lowercase}
#
namespace_prefix=$(echo ${namespace_prefix_in} | sed -e 's#\#\\#')
namespace_prefix_lowerfirstchar=$(echo ${namespace_prefix_in} | sed -e 's#\#/#g' -e 's/^\(.\)/\l/g')
facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u/')
facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower([=16=])}')
# Filename: {facade_name_upcase}.php - SOURCE TEMPLATE
source_template='<?php
namespace {namespace_prefix}\Facades;
class {facade_name_upcase}
{
//
}
'
# Filename: {facade_name_upcase}ServiceProvider.php - SERVICE PROVIDER TEMPLATE
serviceProvider_template='<?php
namespace {namespace_prefix}\Providers;
use Illuminate\Support\ServiceProvider;
use App;
class {facade_name_upcase}ServiceProvider extends ServiceProvider {
public function boot()
{
//
}
public function register()
{
App::bind("{facade_name_lowercase}", function()
{
return new \{namespace_prefix}\Facades\{facade_name_upcase};
});
}
}
'
# {facade_name_upcase}Facade.php - FACADE TEMPLATE
facade_template='<?php
namespace {namespace_prefix}\Facades;
use Illuminate\Support\Facades\Facade;
class {facade_name_upcase}Facade extends Facade {
protected static function getFacadeAccessor() { return "{facade_name_lowercase}"; }
}
'
}
function checkDirectoryExists(){
if [ ! -d ${namespace_prefix_lowerfirstchar} ]
then
echo ""
echo "Can't find the namespace: "${namespace_prefix_in}
echo ""
echo "*** NOTE:"
echo " Make sure the namspace directory exists and"
echo " you use quotes around the namespace_prefix."
echo ""
display_syntax
exit
fi
}
function makeDirectories(){
echo "Make Directories"
echo "================"
mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
}
function createSourceTemplate(){
source_template=$(echo "${source_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create Source Template:"
echo "======================="
echo "${source_template}"
echo ""
echo "${source_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}.php
}
function createServiceProviderTemplate(){
serviceProvider_template=$(echo "${serviceProvider_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create ServiceProvider Template:"
echo "================================"
echo "${serviceProvider_template}"
echo ""
echo "${serviceProvider_template}" > ./${namespace_prefix_lowerfirstchar}/Providers/${facade_name_upcase}ServiceProvider.php
}
function createFacadeTemplate(){
facade_template=$(echo "${facade_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create Facade Template:"
echo "======================="
echo "${facade_template}"
echo ""
echo "${facade_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}Facade.php
}
function serviceProviderPrompt(){
echo "Providers: ${namespace_prefix_in}\Providers\${facade_name_upcase}ServiceProvider,"
}
function aliasPrompt(){
echo "Alias: '"${facade_name_upcase}"' => '"${namespace_prefix_in}"\Facades\${facade_name_upcase}Facade',"
}
#
# END FUNCTION DECLARATIONS
#
###########################
## START RUNNING SCRIPT ##
###########################
display_start_banner
init_and_export_vars
makeDirectories
checkDirectoryExists
echo ""
createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo " Finished TEST"
echo "==========================="
echo ""
echo "Add these lines to config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""
Laravel 5 中的自定义 类,简单的方法
此答案适用于 一般 自定义 classes Laravel。有关更具体的 Blade 答案,请参阅
第 1 步: 创建您的助手(或其他自定义 class)文件并为其提供匹配的命名空间。写下你的 class 和方法:
<?php // Code within app\Helpers\Helper.php
namespace App\Helpers;
class Helper
{
public static function shout(string $string)
{
return strtoupper($string);
}
}
步骤 2: 创建别名:
<?php // Code within config/app.php
'aliases' => [
...
'Helper' => App\Helpers\Helper::class,
...
第三步: 运行 composer dump-autoload
在项目根目录下
第 4 步: 在您的 Blade 模板中使用它:
<!-- Code within resources/views/template.blade.php -->
{!! Helper::shout('this is how to use autoloading correctly!!') !!}
加分项: 在您的 Laravel 应用中的任何位置使用此 class:
<?php // Code within app/Http/Controllers/SomeController.php
namespace App\Http\Controllers;
use Helper;
class SomeController extends Controller
{
public function __construct()
{
Helper::shout('now i\'m using my helper class in a controller!!');
}
...
来源:http://www.php-fig.org/psr/psr-4/
为什么有效:https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
自动加载的来源: http://php.net/manual/en/language.oop5.autoload.php
筛选了关于 SO 和 Google 的各种答案后,我仍然找不到最佳方法。大多数答案都建议我们离开应用程序并依靠第 3 方工具 Composer 来完成这项工作,但我不相信耦合到一个工具只是为了包含一个文件是明智的。
PSR-4
的使用,这让我们更近了一步。这是我在视图中对助手的最终实现:
首先,在您的应用程序目录中的任意位置创建一个带有命名空间的帮助文件:
namespace App\Helpers;
class BobFinder
{
static function bob()
{
return '<strong>Bob?! Is that you?!</strong>';
}
}
接下来,在 aliases
数组中为 config\app.php
中的 class 添加别名:
'aliases' => [
// Other aliases
'BobFinder' => App\Helpers\BobFinder::class
]
这就是您需要做的全部。 PSR-4
和别名应该将助手暴露给您的视图,因此在您的视图中,如果您键入:
{!! BobFinder::bob() !!}
它应该输出:
<strong>Bob?! Is that you?!</strong>
对于我的 Laravel 项目中的自定义助手库,我在我的 Laravel/App
目录和库目录中创建了一个名为 Libraries
的文件夹,我为不同的文件创建了各种文件辅助库。
创建我的帮助文件后,我只需将所有这些文件包含在我的 composer.json 文件中,如下所示
...
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Libraries/commonFunctions.php"
],
"psr-4": {
"App\": "app/"
}
},
...
并执行
composer dump-autoload
Laravel 5
中的自定义 Blade 指令是的,还有另一种方法!
步骤 1: 注册自定义 Blade 指令:
<?php // code in app/Providers/AppServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Blade; // <-- This is important! Without it you'll get an exception.
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// Make a custom blade directive:
Blade::directive('shout', function ($string) {
return trim(strtoupper($string), '(\'\')');
});
// And another one for good measure:
Blade::directive('customLink', function () {
return '<a href="#">Custom Link</a>';
});
}
...
步骤 2: 使用自定义 Blade 指令:
<!-- // code in resources/views/view.blade.php -->
@shout('this is my custom blade directive!!')
<br />
@customLink
输出:
这是我的习惯 BLADE 指令!!
Custom Link
来源:https://laravel.com/docs/5.1/blade#extending-blade
补充阅读:https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
如果您想了解如何最好地制作可以在任何地方使用的自定义类,请参阅Custom Classes in Laravel 5, the Easy Way
我使用的另一种方式是: 1) 在 app\FolderName\fileName.php 中创建了一个文件,并在其中包含了这段代码,即
<?php
namespace App\library
{
class hrapplication{
public static function libData(){
return "Data";
}
}
}
?>
2) 然后在我们的 blade
$FmyFunctions = new \App\FolderName\classsName;
echo $is_ok = ($FmyFunctions->libData());
就是这样。并且有效
在 Laravel 5.3 及更高版本中,Laravel 团队将所有程序文件 (routes.php
) 移出了 app/
目录,整个 app/
文件夹 psr-4
自动加载。接受的答案在这种情况下会起作用,但我觉得不合适。
所以我所做的是在项目的根目录下创建了一个 helpers/
目录,并将帮助程序文件放入其中,在我的 composer.json
文件中,我这样做了:
...
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\": "app/"
},
"files": [
"helpers/ui_helpers.php"
]
},
...
这样我的 app/
目录仍然是一个 psr-4 自动加载的目录,并且助手组织得更好一些。
在目录 bootstrap\autoload.php
require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add
添加这个文件
app\Helpers\function.php
编写自定义助手的最佳实践是
1) 在项目根目录的app
目录中,创建一个名为Helpers 的文件夹(只是为了分隔和组织代码)。
2) 在文件夹内写入 psr-4 文件或普通 php 文件
如果PHP文件是psr-4格式那么会自动加载,否则在项目根目录composer.json里面添加下面一行
在autoload
键中,新建一个名为files
的键,用于在自动加载时加载文件,在files
对象中添加从app目录开始的路径。 ,这里是一个例子。
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\": "app/"
},
"files": [
"app/Helpers/customHelpers.php"
]
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
PS : 如果文件没有加载,请尝试 运行 composer dump-autoload
。
由于 OP 要求最佳实践,我认为我们仍然缺少一些好的建议。
单个 helpers.php 文件远不是一个好习惯。首先,因为你混合了很多不同类型的功能,所以你违反了良好的编码原则。此外,这 可能 不仅会损害代码文档,还会损害代码指标,例如 圈复杂度 、 可维护性指数 和 霍尔斯特德体积 。功能越多越差。
使用 phpDocumentor, but using Sami it won't render procedural files. Laravel API documentation is such a case - there's no helper functions documentation: https://laravel.com/api/5.4
之类的工具,代码文档就可以了可以使用 PhpMetrics. Using PhpMetrics version 1.x to analyze Laravel 5.4 framework code will give you very bad CC/MI/HV metrics for both src/Illuminate/Foundation/helpers.php and src/Illuminate/Support/helpers.php 文件等工具分析代码指标。
多个上下文帮助文件(例如 string_helpers.php、array_helpers.php 等)将当然可以改进那些不好的指标,从而使代码更容易维护。根据使用的代码文档生成器,这就足够了。
它可以通过使用 helper classes 和静态方法来进一步改进,这样它们就可以使用命名空间进行上下文化。就像 Laravel 已经对 Illuminate\Support\Str
and Illuminate\Support\Arr
classes 所做的一样。这改进了代码 metrics/organization 和文档。 Class 可以使用别名使它们更易于使用。
使用 classes 构建可以更好地组织代码和文档,但另一方面,我们最终会失去那些简短易记的全局函数。我们可以通过为那些静态 classes 方法创建函数别名来进一步改进该方法。这可以手动或动态完成。
Laravel 通过在映射到静态 classes 方法的程序帮助程序文件中声明函数,在内部使用第一种方法。这可能不是理想的事情,因为您需要重新声明所有内容 (docblocks/arguments)。
我个人使用动态方法 HelperServiceProvider
class 在执行时间内创建这些函数:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider
{
/**
* The helper mappings for the application.
*
* @var array
*/
protected $helpers = [
'uppercase' => 'App\Support\Helpers\StringHelper::uppercase',
'lowercase' => 'App\Support\Helpers\StringHelper::lowercase',
];
/**
* Bootstrap the application helpers.
*
* @return void
*/
public function boot()
{
foreach ($this->helpers as $alias => $method) {
if (!function_exists($alias)) {
eval("function {$alias}(...$args) { return {$method}(...$args); }");
}
}
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
可以说这是过度设计,但我不这么认为。它工作得很好,与预期相反,至少在使用 PHP 7.x.
时,它不会花费相关的执行时间这里有一些很好的答案,但我认为这是最简单的。 在 Laravel 5.4(也可能是更早的版本)中,您可以在方便的地方创建一个 class,例如 App/Libraries/Helper.php
class Helper() {
public function uppercasePara($str) {
return '<p>' .strtoupper($str). '<p>;
}
}
然后你可以像这样在你的 Blade 模板中简单地调用它:
@inject('helper', \App\Libraries\Helper)
{{ $helper->drawTimeSelector() }}
如果你不想使用 @inject 那么只需将 'uppercasePara' 函数设为静态并将调用嵌入到你的 Blade 模板中,如下所示:
{{ \App\Libraries\Helper::drawTimeSelector() }}
不需要别名。 Laravel 自动解析具体 class。
创建自定义助手目录: 首先在app目录下创建Helpers目录。 创建 hlper class 定义: 现在让我们创建一个简单的辅助函数来连接两个字符串。在/app/Helpers/MyFuncs.php中新建一个文件MyFuncs.php 添加如下代码
<?php
namespace App\Helpers;
class MyFuncs {
public static function full_name($first_name,$last_name) {
return $first_name . ', '. $last_name;
}
}
命名空间App\Helpers;在 App 命名空间下定义 Helpers 命名空间。 class MyFuncs {…} 定义助手 class MyFuncs。 public 静态函数 full_name($first_name,$last_name) {...} 定义了一个静态函数,它接受两个字符串参数和 returns 一个连接的字符串
帮手服务提供class
服务提供商用于自动加载 classes。我们需要定义一个服务提供者,它将在 /app/Helpers 目录中加载我们所有的助手 classes。
运行 以下 artisan 命令:
php artisan make:provider HelperServiceProvider
文件将在 /app/Providers/HelperServiceProvider.php
Open /app/Providers/HelperServiceProvider.php
添加以下代码:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
foreach (glob(app_path().'/Helpers/*.php') as $filename){
require_once($filename);
}
}
}
这里,
namespace App\Providers; defines the namespace provider
use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
public function boot(){…} bootstraps the application service
public function register(){…} is the function that loads the helpers
foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.
我们现在需要注册 HelperServiceProvider 并为我们的助手创建一个别名。
打开/config/app.php
文件
定位供应商数组变量
添加以下行
App\Providers\HelperServiceProvider::class,
找到别名数组变量
添加以下行
'MyFuncs' => App\Helpers\MyFuncs::class,
保存更改 使用我们的自定义助手
我们将创建一个路由来调用我们的自定义辅助函数 Open /app/routes。php
添加以下路由定义
Route::get('/func', function () {
return MyFuncs::full_name("John","Doe");
});
这里,
return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class
首先在 App\Http 目录中创建 helpers.php。 然后在composer.json
里面添加如下代码"autoload": {
"classmap": [
"database"
],
"files": [
"app/Http/helpers.php"
],
"psr-4": {
"App\": "app/"
}
},
下一步运行下面的命令
composer dump-autoload
现在您可以在 helpers.php 文件中定义您的自定义函数。
在 app/Helper/Helpers 中创建 Helpers.php。php
namespace App\Helper
class Helpers
{
}
添加作曲家和作曲家更新
"autoload": {
"classmap": [
"database/seeds",
"database/factories",
"database","app/Helper/Helpers.php"
],
"psr-4": {
"App\": "app/"
},
"files": ["app/Helper/Helpers.php"]
},
在控制器中使用
use App\Helper\Helpers
在视图中使用 配置更改->app.php 文件
'aliases' => [
...
'Helpers' => 'App\Helper\Helpers'
],
通话可见
<?php echo Helpers::function_name(); ?>
您实际上可以在别名下添加到 config/app.php
文件,而不是包含您的自定义助手 class。
应该是这样的。
'aliases' => [
...
...
'Helper' => App\Http\Services\Helper::class,
]
然后到您的控制器,包括使用方法 'use Helper' 的 Helper,这样您就可以简单地在您的 Helper class.
上调用一些方法eg. Helper::some_function();
或者在资源视图中您可以直接调用助手 class。
eg. {{Helper::foo()}}
但这仍然是要遵循的开发人员编码风格方法。我们可能有不同的解决问题的方法,我只是想把我也有的分享给初学者。
**
- 状态助手
** 创建新助手
<?php
namespace App\Helpers;
use Illuminate\Database\Eloquent\Collection;
class StatusHelper
{
protected static $_status = [
1=> [
'value' => 1,
'displayName' => 'Active',
],
2 => [
'value' => 2,
'displayName' => 'Inactive',
],
3 => [
'value' => 3,
'displayName' => 'Delete',
],
];
public static function getStatusesList()
{
$status = (new Collection(self::$_status))->pluck('displayName', 'value')->toArray();
return $status;
}
}
用于控制器和任何视图文件
use App\Helpers\StatusHelper;
class ExampleController extends Controller
{
public function index()
{
$statusList = StatusHelper::getStatusesList();
return view('example.index', compact('statusList'));
}
}
在 App/Helpers/
中创建新文件 examplehelper.php
然后在 composer.json
文件中添加
"autoload": { "classmap": [ "database"], "psr-4": { "App\": "app/" },
"files": ["helpers/examplehelper.php" ]},
我知道现在回答这个问题已经很晚了,但是,这个问题每天都在所有初级开发人员身上发生,所以对于直接步骤,请执行以下操作:
** 将您的辅助函数分组到 类 中(要使用 blade 中的函数,只需将它们设为静态即可)并将所有 类 放入配置 Laravel文件夹 app.php 别名
'aliases' => [
"YourClassName" => App\Support\YourClassName,
]
现在您也可以在 blade 和控制器上使用所有静态函数。