559

我想创建辅助函数以避免在 Laravel 中的视图之间重复代码。例如:

view.blade.php

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

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

4

22 回答 22

708

在你的 app 文件夹中创建一个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 命名空间类文件),您可以执行laravel.com网站所做的操作:将文件存储helpers.php 在 bootstrap 目录中。请记住将其设置在您的composer.json文件中:

"files": [
    "bootstrap/helpers.php"
]
于 2015-02-03T02:27:52.190 回答
449

Laravel 5 中的自定义类,简单的方法

这个答案适用于 Laravel中的一般自定义类。有关更具体刀片的答案,请参阅Laravel 5 中的自定义刀片指令

第 1 步:创建您的 Helpers(或其他自定义类)文件并为其提供匹配的命名空间。编写你的类和方法:

<?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 应用程序中的任何地方使用这个类:

<?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

于 2015-09-24T23:46:52.257 回答
345

我最初的想法也是作曲家自动加载,但对我来说并没有感觉到 Laravel 5ish。L5 大量使用服务提供者,它们是引导你的应用程序的东西。

首先,我在我的app目录中创建了一个名为Helpers. 然后在Helpers文件夹中,我为我想要添加的功能添加了文件。拥有一个包含多个文件的文件夹可以让我们避免一个过长且难以管理的大文件。

接下来我HelperServiceProvider.php通过运行 artisan 命令创建了一个:

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

于 2015-02-06T06:55:51.110 回答
89

JeffreyWay这就是Laracasts Discussion中所建议的。

  1. 在您的app/Http目录中,创建一个helpers.php文件并添加您的函数。
  2. 在 内composer.json,在autoload块中,添加"files": ["app/Http/helpers.php"]
  3. 运行composer dump-autoload
于 2015-04-16T15:47:03.260 回答
66

筛选了关于 SO 和 Google 的各种答案后,我仍然找不到最佳方法。大多数答案建议我们离开应用程序并依靠 3rd 方工具 Composer 来完成这项工作,但我不相信仅仅为了包含文件而耦合到工具是明智的。

Andrew Brown 的回答最接近我认为应该接近的方式,但是(至少在 5.1 中),服务提供者步骤是不必要的。Heisian 的回答强调了PSR-4它的使用让我们更近了一步。这是我在视图中对助手的最终实现:

首先,在您的应用程序目录中的任何位置创建一个帮助文件,并使用命名空间:

namespace App\Helpers;

class BobFinder
{
    static function bob()
    {
        return '<strong>Bob?! Is that you?!</strong>';
    }
}

接下来,config\app.phpaliases数组中为您的类命名:

'aliases' => [
    // Other aliases
    'BobFinder' => App\Helpers\BobFinder::class
]

这应该就是您需要做的所有事情。PSR-4并且别名应该将助手公开给您的视图,因此在您的视图中,如果您键入:

{!! BobFinder::bob() !!}

它应该输出:

<strong>Bob?! Is that you?!</strong>
于 2015-11-18T09:32:55.583 回答
42

Laravel 5 中的自定义刀片指令

是的,还有另一种方法可以做到这一点!

第 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

输出:

这是我的自定义刀片指令!!
自定义链接


来源:https ://laravel.com/docs/5.1/blade#extending-blade

附加阅读:https ://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives


如果您想学习如何最好地制作可以在任何地方使用的自定义类,请参阅Laravel 5 中的自定义类,最简单的方法

于 2016-04-27T11:10:20.700 回答
29

这是我的 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;
            }
        }
    }
}

您应该在该文件夹下创建一个名为Helpersapp文件夹,然后在其中创建一个名为的文件whatever.php并将字符串添加whatever到 $helpers 数组中。

完毕!

编辑

我不再使用此选项,我目前正在使用 Composer 加载静态文件,如帮助程序。

您可以直接在以下位置添加助手:

...
"autoload": {
    "files": [
        "app/helpers/my_helper.php",
        ...
    ]
},
...
于 2015-07-29T14:17:45.757 回答
17

Libraries对于我的 Laravel 项目中的自定义帮助程序库,我在我的目录和库目录中创建了一个具有名称的文件夹Laravel/App,我为不同的帮助程序库创建了各种文件。

创建我的帮助文件后,我只需将所有这些文件包含在我的composer.json文件中,如下所示

...
"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Libraries/commonFunctions.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
...

并执行

composer dump-autoload
于 2016-03-20T13:34:32.890 回答
16

由于 OP 要求提供最佳实践,我认为我们在这里仍然缺少一些好的建议。

单个helpers.php文件远非一个好的做法。首先,因为您混合了许多不同类型的功能,因此您违反了良好的编码原则。此外,这不仅会损害代码文档,还会损害代码指标,例如Cyclomatic ComplexityMaintainability IndexHalstead Volume。你拥有的功能越多,情况就越糟糕。

使用phpDocumentor之类的工具可以编写代码文档,但使用Sami不会呈现程序文件。Laravel API 文档就是这种情况 - 没有辅助函数文档:https ://laravel.com/api/5.4

可以使用PhpMetrics等工具分析代码指标。使用 PhpMetrics 版本 1.x 分析 Laravel 5.4 框架代码会为src/Illuminate/Foundation/helpers.phpsrc/Illuminate/Support/helpers.php文件提供非常糟糕的 CC/MI/HV 指标。

多个上下文帮助文件(例如string_helpers.phparray_helpers.php等)肯定会改善这些不良指标,从而使代码更易于维护。根据使用的代码文档生成器,这已经足够了。

它可以通过使用带有静态方法的辅助类来进一步改进,以便可以使用命名空间对它们进行上下文化。就像 Laravel 已经对Illuminate\Support\StrIlluminate\Support\Arr类所做的一样。这改进了代码度量/组织和文档。类别名可用于使它们更易于使用。

使用类进行结构化可以使代码组织和文档更好,但另一方面,我们最终会失去那些简短易记的全局函数。我们可以通过为这些静态类方法创建函数别名来进一步改进该方法。这可以手动或动态完成。

Laravel 在内部使用第一种方法,通过在映射到静态类方法的过程帮助文件中声明函数。这可能不是理想的事情,因为您需要重新声明所有内容(文档块/参数)。我个人对在执行时创建这些函数
的类使用动态方法:HelperServiceProvider

<?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 时它不会花费相关的执行时间。

于 2017-06-01T17:33:36.273 回答
13

而不是包含您的自定义帮助程序类,您实际上可以config/app.php在别名下添加到您的文件中。

应该是这样的。

 'aliases' => [ 
    ...
    ...
    'Helper' => App\Http\Services\Helper::class,
 ]

然后到你的控制器,使用方法'use Helper'包含Helper,这样你就可以简单地调用你的Helper类上的一些方法。

eg. Helper::some_function();

或者在资源视图中,您可以直接调用 Helper 类。

eg. {{Helper::foo()}}

但这仍然是要遵循的开发人员编码风格方法。我们可能有不同的解决问题的方法,我只是想分享一下我对初学者也有的东西。

于 2017-11-30T18:20:22.203 回答
11

这是我创建的一个 bash shell 脚本,用于非常快速地制作 Laravel 5 外观。

在你的 Laravel 5 安装目录中运行它。

像这样称呼它:

make_facade.sh -f <facade_name> -n '<namespace_prefix>'

例子:

make_facade.sh -f helper -n 'App\MyApp'

Facades如果您运行该示例,它将Providers在“your_laravel_installation_dir/app/MyApp”下创建目录。

它将创建以下 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' 中的 Providers 和 Alias 列表

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 ""
于 2015-08-17T09:43:33.887 回答
8

创建自定义 helpers 目录: 首先在 app 目录下创建 Helpers 目录。 创建 hlper 类定义: 现在让我们创建一个简单的帮助函数,它将连接两个字符串。在 /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 命名空间。class MyFuncs {…} 定义了辅助类 MyFuncs。public static function full_name($first_name,$last_name) {…} 定义了一个静态函数,它接受两个字符串参数并返回一个串联的字符串

助手服务提供类

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

运行以下工匠命令:

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
于 2017-11-06T12:11:59.493 回答
7

首先在 App\Http 目录中创建 helpers.php。然后在 composer.json 中添加以下代码

"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Http/helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },

接下来运行以下命令

composer dump-autoload

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

于 2017-11-06T13:24:07.197 回答
6

在 app/Helper/Helpers.php 中创建 Helpers.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"]
    },

在控制器中使用

使用 App\Helper\Helpers

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

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

在视图中调用

<?php echo Helpers::function_name();  ?>
于 2017-11-29T18:54:43.930 回答
6

**

  • 状态助手

** 创建新的助手

<?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'));
        }
}
于 2018-10-27T06:51:44.557 回答
5

编写自定义助手的最佳实践是

1)在app项目根目录下,创建一个名为 Helpers 的文件夹(只是为了分离和结构化代码)。

2)在文件夹里面写psr-4文件或者普通php文件

如果 PHP 文件是 psr-4 格式,那么它将被自动加载,否则在项目根目录下的 composer.json 中添加以下行

autoloadkey里面,创建一个新的key,命名files为在自动加载时加载文件,在filesobject里面添加从app目录开始的路径,这里是一个例子。

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/Helpers/customHelpers.php"
    ]
},
"autoload-dev": {
    "classmap": [
        "tests/TestCase.php"
    ]
},

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

于 2017-04-19T10:06:22.663 回答
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());

而已。它有效

于 2017-02-02T06:39:04.527 回答
1

在目录 bootstrap\autoload.php

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add

添加这个文件

app\Helpers\function.php
于 2017-04-01T06:22:01.590 回答
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 会自动解析具体类。

于 2017-07-02T13:42:37.507 回答
0

在 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 自动加载的目录,并且帮助程序组织得更好一些。

于 2017-03-21T06:50:43.263 回答
0

我知道现在回答这个问题已经很晚了,但是,这个问题每天都发生在所有初级开发人员身上,所以对于直接的步骤,请执行以下操作:

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

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

现在,您也可以在刀片和控制器上使用所有静态功能。

于 2022-03-05T05:15:02.190 回答
-3

创建新文件examplehelper.phpApp/Helpers/ 然后添加composer.json文件

"autoload": { "classmap": [ "database"], "psr-4": { "App\\": "app/" },
"files": ["helpers/examplehelper.php" ]},
于 2021-08-31T10:58:28.753 回答