如何在Laravel中创建自定义辅助函数

603
我想创建一些辅助函数来避免在Laravel视图之间重复编写代码。例如:

view.blade.php

<p>Foo Formated text: {{ fooFormatText($text) }}</p>

它们基本上是文本格式化函数。我应该如何定义全局可用的辅助函数,例如fooFormatText()

23个回答

12

这是我创建的一个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”下创建目录FacadesProviders
它将创建以下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"中添加你的方法。

这是我在添加了一个Helper函数后,"./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”(如果您在函数调用中添加了'true'作为第二个参数,则输出“class =“active””)。
我使用它来强调菜单中的活动项目。
以下是我的脚本源代码。希望这对您有用,请告诉我如果您有任何问题。
#!/bin/bash

display_syntax(){
    echo ""
    echo "  The Syntax is like this:"
    echo "  ========================"
    echo "      "$(basename $0)" -f <facade_name> -n '<namespace_prefix>'"
    echo ""
    echo "  Example:"
    echo "  ========"
    echo "      "$(basename $0) -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="$1"
            case $key in
            -n|--namespace_prefix)
            namespace_prefix_in="$2"
            echo ""
            shift # past argument
            ;;
            -f|--facade)
            facade_name_in="$2"
            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\1/g')
    facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u\1/')
    facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower($0)}')


#   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 ""

9

创建自定义助手目录

  • 首先在应用程序目录中创建Helpers目录

创建助手类定义

  • 创建一个简单的辅助函数,用于连接两个字符串

  • /app/Helpers/MyFuncs.php路径下创建一个新文件 MyFuncs.php,并添加以下代码:

    <?php
    
    namespace App\Helpers; // 在App命名空间下定义Helpers命名空间。
    
    class MyFuncs { // 定义辅助类MyFuncs。
    
        // 定义一个静态函数,接受两个字符串参数,并返回它们的连接字符串
        public static function full_name($first_name,$last_name) {
            return $first_name . ', '. $last_name;   
        }
    }
    

服务提供者用于自动加载类。我们需要定义一个服务提供者,它将加载/app/Helpers目录中的所有帮助类。

运行以下Artisan命令:

php artisan make:provider HelperServiceProvider

文件将被创建在/app/Providers/HelperServiceProvider.php。打开/app/Providers/HelperServiceProvider.php并添加以下代码:

<?php 

namespace App\Providers; // defines the namespace provider 

use Illuminate\Support\ServiceProvider; // imports the ServiceProvider class namespace
// defines a class HelperServiceProvider that extends the ServiceProvider class
class HelperServiceProvider extends ServiceProvider {

   /**
    * Bootstrap the application services.
    *
    * @return void
    */
   public function boot()
   {
      //
   }

   /**
    * Register the application services.
    *
    * @return void
    */
   public function register()
   {    // loops through all the files in /app/Helpers directory and loads them.
        foreach (glob(app_path().'/Helpers/*.php') as $filename){
            require_once($filename);
        }
   }
}

现在我们需要注册HelperServiceProvider并为我们的帮助程序创建别名。

打开/config/app.php文件

找到提供程序数组变量

添加以下行

App\Providers\HelperServiceProvider::class,

找到别名数组变量

添加以下行

'MyFuncs' => App\Helpers\MyFuncs::class,

使用我们的自定义助手保存更改。

我们将创建一个路由,调用我们的自定义助手函数,打开/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

8

**

  • Status Helper

** create new helper

<?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'));
        }
}

7
在app/Helper/目录下创建Helpers.php文件。
namespace App\Helper
class Helpers
{


}

在Composer中添加并更新内容
 "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
            "database","app/Helper/Helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        },
         "files": ["app/Helper/Helpers.php"]
    },

在控制器中使用

use App\Helper\Helpers

在视图中使用 更改config->app.php文件

   'aliases' => [
    ...
    'Helpers'   => 'App\Helper\Helpers'
    ],

呼叫视图

<?php echo Helpers::function_name();  ?>

谢谢,您介意再详细解释一下吗? - Felipe Valdes
2
如果类有命名空间,那么在 composer.json 文件中添加文件是没用的,因为 psr-4 自动加载会起到作用。 - Arcesilas
@abhishekkumar - 有关 Lumen 8.0,您有什么建议吗?先谢谢了。 - Kamlesh
我尝试了同样的解决方案来解决Lumen 8的问题,但是出现了错误:“致命错误:无法声明类MasterFunctionsHelper,因为名称已在/Applications/MAMP/htdocs/laravelprojects/project_api/app/Helpers/MasterFunctionsHelper.php的第3行中使用”。 - Kamlesh
@Kamlesh 命名空间问题,这个链接会对你有所帮助 https://dev59.com/2lkS5IYBdhLWcg3wFiwM#40406578 - abhishek kumar

7
首先,在App\Http目录下创建helpers.php文件。 然后,在composer.json中添加以下代码。
"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Http/helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },

请运行以下命令。
composer dump-autoload

现在你可以在helpers.php文件中定义自定义函数。

5

编写自定义帮助程序的最佳实践为:

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"
    ]
},

提示:如果文件未加载,请尝试运行 composer dump-autoload


4
我用的另一种方法是: 1)在 app\FolderName\fileName.php 中创建一个文件,并在其中添加以下代码:
<?php
namespace App\library
{
 class hrapplication{
  public static function libData(){
   return "Data";
  }
 }
}
?>

2)在我们的刀版上完成这些操作之后

 $FmyFunctions = new \App\FolderName\classsName;
  echo $is_ok = ($FmyFunctions->libData());

就是这样,它运行良好。


2

我知道回答这个问题已经很晚了,但是这个问题每天都会发生在所有初级开发者身上,所以为了简单明了,请按照以下步骤操作:

** 将你的辅助函数分组到类中(为了在blade中使用这些函数,只需将它们设置为静态函数),并将所有类放置在Laravel配置文件夹app.php的别名中。

'aliases' => [
  "YourClassName" => App\Support\YourClassName,
]

现在,您可以在所有的刀片和控制器上都使用您的静态函数。

这与@Kenneth Sunday的答案有何不同? - Vipertecpro
这只是一个简短的答案,就是这样! - Astro

1
在目录bootstrap\autoload.php中。
require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add

添加此文件。
app\Helpers\function.php

0
在这里有一些很棒的答案,但我认为这是最简单的方法。 在Laravel 5.4(以及可能更早的版本)中,您可以在方便的位置创建一个类,例如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会自动解析具体的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接