Laravel 5中针对自定义助手的最佳实践


471

我想创建辅助函数,以避免在Laravel 5的视图之间重复代码:

view.blade.php

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

它们基本上是文本格式化功能。我在哪里以及如何使用这些功能创建文件?

Answers:


594

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

85
菜鸟技巧:更改composer.json后使用此命令。作曲家dump-autoload
Allfarid MoralesGarcía2015年

11
@AllfaridMoralesGarcía或只是“一个有用的提示,因为答案并不清楚,您需要在此之后进行此操作”。
Matt McDonald

8
我赞成使用辅助函数来简化视图的编写,但是我讨厌在其他答案中引用了多少答案。不要误会我的意思,这是一个很好的答案,而且是正确的,我只是担心人们会滥用它,并开始重新编写大量编写拙劣,组织不良的功能PHP。
andrewtweber 2015年

39
我不明白这种方法。Composer应该是包含库的工具:没有它,Laravel可以很好地工作,而没有Laravel的Composer也可以。此建议告诉我们在应用程序内创建文件,离开我们的应用程序,转到Composer,告诉composer返回我们的应用程序并包括文件。Laravel清楚地处理了文件的包含,对吗?为什么我们要放弃Laravel的本机实现,并使用此外部工具为我们提供一个文件,从而将我们的应用程序更多地与Composer耦合?是懒惰,还是我错过了什么?
dKen

6
Laravel使用作曲家的自动加载器来知道将所有依赖的库和文件包括在哪里。这在bootstrap / autoload.php中引用。阅读该文件中的注释。方法是将对文件的引用添加到composer.json中,然后“转储自动加载”,这将重新生成组合器的自动加载器,以便Laravel可以找到它。使用Composer的“文件”集合是添加库或一次性函数文件的好方法,这些库或函数文件没有很好地包装在composer软件包中。可以为所有“通过我必须包括这个奇怪文件的方式”的情况提供一个位置很高兴。
菲利普·哈灵顿

370

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,
     ...

步骤3: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


35
需要明确的是,这个答案实际上并不涉及帮助程序,它们是全局命名空间的函数。相反,它鼓励将助手转换为类方法。通常这是最好的方法,但实际上并不能回答这里提出的问题,这就是为什么其他答案相比之下如此复杂。
Dan Hunsaker

1
功能助手意味着它也可以在Blade中使用。如何使此功能在Blade中可用?您无法在Blade中调用Helper :: prettyJason(parameters)。
MaXi32 '16

@ MaXi32,您可以在中的aliases数组下添加类app/config.php'Helper' => App\Helpers\Helper::class, 然后您就可以Helper::prettyJson();在Blade中调用它了。
heisian

@DanHunsaker编辑为直接回答问题,并且仍然是相同的简单方法。您也可以只编写自己的自定义刀片指令:stackoverflow.com/questions/28290332/…–
heisian

1
是的,我浏览了一下框架,找到了将帮助器放到哪里。再次,我完全同意,命名空间静态类的方法比大多数情况下(被要求或推荐)的方法更合适。事实是,助手并不是一开始就真正的Laravel Way,而是来自CodeIgniter 2.x的遗留物,至今仍未淘汰。因此,我对这种方法不能完全按照要求回答OP的讽更多是为了强调您没有得到帮助者而是更好的事实。
Dan Hunsaker

315

我最初的想法也是作曲家自动加载,但对我来说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文件加载到helper目录中。反馈和PR非常感谢!

composer require browner12/helpers

Github:Browner12 /助手


29
对于只需要添加一些功能的人来说,composer自动加载是完全可以的,但是对于我们这些可能具有很多辅助功能的人来说,多文件组织是必须的。该解决方案本质上是我在L4中所做的,除了我在文件中注册了start.php文件(虽然不好,但是暂时达到了目的)。您对加载多个文件还有其他建议吗?
安德鲁·布朗

7
如果您有多个文件,请将它们全部添加到您的composer.json文件中。在那里甚至添加5-10行比在这里拥有更多方法
约瑟夫·席尔伯

22
我认为这项技术有很多优点。它优雅而高效,因为您不必在每次创建帮助程序文件时都记得弄乱composer.json文件。
impeto

8
真的很好的解决方案。我唯一不同意的是添加文件的方式,我认为应该是一个映射器,在其中添加要加载的文件的名称。考虑错误!如果其中一个失败的文件中只有一个帮助程序,则应删除所有帮助程序,或者将站点破坏,直到解决为止。
Pablo Ezequiel Leone 2015年

3
您是否使用App \ Providers命名空间?我如何从控制器和视图中调用该助手。抱歉,菜鸟问题。
Cengkaruk 2015年

79

这是JeffreyWay本《Laracasts讨论》中所建议的。

  1. 在您的app/Http目录中,创建一个helpers.php文件并添加您的功能。
  2. composer.json,在该autoload块,添加"files": ["app/Http/helpers.php"]
  3. 运行composer dump-autoload

15
这些助手可能不只是HTTP。app/helpers.phpapp/Helpers/似乎是一个更好的地方。
sepehr 2015年

1
如果我们在共享服务器上并且没有选择使用该composer dump-autoload 怎么办?
user3201500 '02

@ user3201500,这是另一个问题,如果要遵循上述答案,则可能需要手动执行。或者,您可以从其他答案中选择。要手动反映该信息,composer dump-autoload您可以按照以下步骤操作:developed.be/2014/08/29/composer-dump-autoload-laravel
itsazzad

55

在SO和Google上筛选了各种答案之后,我仍然找不到最佳方法。大多数答案都建议我们离开应用程序,并依靠第三方工具Composer来完成这项工作,但是我不认为将工具与仅包含文件相结合是明智的。

安德鲁·布朗的答案与我认为应该采取的方法最接近,但是(至少在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>

感谢您发布此信息。正如@ Dan-Hunsaker在我的解决方案中指出的那样,我们仍然没有以全局命名的函数结尾,即能够简单地编写{!! bob() !!}。将做更多的搜索,看看是否有可能
heisian 2015年

1
我已经考虑了更多,尝试bob()真正实现全球化并不是一件明智的事情。命名空间是有原因的,我们不应该bob()在基本的PHP函数旁边调用。我将在您的代码中添加您的别名-谢谢!
heisian

1
我发现这是最好的
Jimmy Obonyo Abor 2015年

为什么在那儿extends Helper?对我来说似乎没有必要。
伯尼

@bernie @ user3201500对不起,团队,我有我自己的基本帮助程序类,我的所有帮助程序都继承自该类;的extends Helper的确是没有必要的。感谢您的注意。
dKen'x

31

自定义刀片指令在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中的自定义类》


应该将其标记为最佳答案,因为问题是“避免在某些视图之间重复代码”。关键字是VIEWS。:)
Aleksandrs

23

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

您应该Helpers在该app文件夹下创建一个名为的文件夹,然后创建一个名为whatever.phpinside 的文件,并将字符串添加whatever到$ he​​lpers数组内。

做完了!

编辑

我不再使用此选项,我目前正在使用composer加载诸如助手之类的静态文件。

您可以直接在以下位置添加帮助程序:

...
"autoload": {
    "files": [
        "app/helpers/my_helper.php",
        ...
    ]
},
...

除了性能之外,还有其他原因可以创建映射器,而不是glob()像Andrew Brown所写的那样加载目录中的所有文件吗?如果您希望能够指定要包括的文件,为什么不composer.json按照Joseph Silber的说明在中指定文件以自动加载?您为什么更喜欢这种解决方案?我并不是说这是一个不好的解决方案,我只是很好奇。
2015年

3
例如,如果映射文件中的一个帮助文件包含中断错误,则使用映射方法更容易有选择地启用/禁用帮助程序。也就是说,服务提供者中的映射文件与这样做没有太大区别,composer.json只有两点:第一,它将映射保留在应用程序内部,而不是元数据文件。第二,它不需要您composer dump-autoload每次更改要加载的文件列表时都重新运行。
Dan Hunsaker

不需要includerequire,Laravel已经内置了PSR-4自动加载功能:php-fig.org/psr/psr-4
heisian

1
使用PSR-4和作曲家将不允许您打开/关闭助手。
Pablo Ezequiel Leone

@PabloEzequielLeone,我将如何在控制器或刀片文件中使用它?如果您担心不每次都为所有控制器加载所有辅助对象,那么这似乎是最佳选择,但对Laravel的初学者(如我自己)不利。
VinGarcia

12

对于Laravel项目中的Custom Helper Libraries,我LibrariesLaravel/AppDirectory和Libraries目录中创建了一个名称为文件夹的文件夹,并为不同的helper库创建了各种文件。

创建了辅助文件后,我只需将所有这些文件包含在我的composer.json文件中,就像这样

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

并执行

composer dump-autoload

composer dump-autoload并且composer dumpautoload也适用INFACT composer du还将努力...
阿克沙伊Khale

10

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

单个helpers.php文件远不是一个好习惯。首先,因为您混合了许多不同种类的功能,所以您违反了良好的编码原则。此外,这不仅损害代码文档,还会损害诸如Cyclomatic ComplexityMaintenanceability IndexHalstead Volume的代码指标。您拥有的功能越多,情况就越糟。

代码文件将使用好的工具,如可phpDocumentor的,但使用萨米不会渲染程序文件。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\Strand Illuminate\Support\Arr类一样。这样可以改善代码指标/组织和文档编制。类别名可以使它们更易于使用。

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

Laravel在内部使用第一种方法,方法是在过程帮助器文件中声明映射到静态类方法的函数。这可能不是理想的选择,因为您需要重新声明所有内容(docblocks /参数)。
我个人将动态方法与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时,它不会花费相关的执行时间。


8

这是我创建的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 /应用程序/ 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”中的“提供程序和别名”列表

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'(如果您将'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 ""

8

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

应该是这样的。

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

然后使用“使用帮助器”方法将“帮助器”包含在控制器中,这样您就可以简单地在“帮助器”类上调用某些方法。

eg. Helper::some_function();

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

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

但这仍然是要遵循的开发人员编码风格方法。我们可能有不同的解决问题的方式,我只想向初学者分享我所拥有的。


4

创建自定义帮助程序目录: 首先在应用程序目录中创建帮助程序目录。 创建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; 在App名称空间下定义Helpers名称空间。类MyFuncs {…}定义了辅助类MyFuncs。公共静态函数full_name($ first_name,$ last_name){…}定义了一个静态函数,该函数接受两个字符串参数并返回一个串联的字符串

帮手服务上课

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

运行以下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档案

找到provider数组变量

添加以下行

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

4

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

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

接下来运行以下命令

composer dump-autoload

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


3

我使用的另一种方法是: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());

而已。它有效


3

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

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如果未加载文件,请尝试运行。


3

在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();  ?>

谢谢,您介意扩大您的解释范围吗?
费利佩·瓦尔德斯

2
如果该类具有名称空间,则添加文件composer.json是没有用的,因为psr-4自动加载将完成此工作。
Arcesilas

2

在目录bootstrap \ autoload.php中

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

添加此文件

app\Helpers\function.php

2

**

  • 状态助手

**建立新的帮手

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

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

希望这对某人有帮助。


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自动解决具体课程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.