Laravel 5中定制助手的最佳实践

Cal*_*ira 426 php laravel laravel-5 laravel-helper

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

view.blade.php

<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*ber 545

helpers.php在app文件夹中创建一个文件并使用composer加载它:

"autoload": {
    "classmap": [
        ...
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/helpers.php" // <---- ADD THIS
    ]
},
Run Code Online (Sandbox Code Playgroud)

将其添加到您的composer.json文件后,运行以下命令:

composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢将helpers.php文件保存在app目录中(因为它不是PSR-4命名空间类文件),您可以执行laravel.com网站的操作:将其存储helpers.php 在引导程序目录中.记得在composer.json文件中设置它:

"files": [
    "bootstrap/helpers.php"
]
Run Code Online (Sandbox Code Playgroud)

  • 新手提示:更改composer.json后使用此命令.composer dump-autoload (77认同)
  • 我不明白这种方法.Composer应该是一个包含库的工具:如果没有它,Laravel可以很好地工作,而没有Laravel的Composer也可以.这个建议告诉我们在我们的应用程序中创建一个文件,离开我们的应用程序,转到Composer,告诉作曲家返回我们的应用程序并包含一个文件.Laravel明确处理文件的包含,对吧?为什么我们会放弃Laravel的原生实现并使用这个外部工具为我们包含一个文件,从而将我们的应用程序与Composer结合起来呢?是懒惰,还是我错过了什么? (37认同)
  • @AllfaridMoralesGarcía或者只是'一个有用的提示,因为答案并不清楚你之后需要这样做'. (10认同)
  • 我赞成帮助函数使写入视图更容易,但我讨厌在其他答案中引用了多少这个答案.不要误会我的意思,这是一个很好的答案和正确的,我只是担心人们会滥用它,并开始再次编写大量写得不好,组织不良的功能PHP. (8认同)
  • Laravel使用composer的自动加载器来知道在哪里包含它依赖的所有库和文件.这在bootstrap/autoload.php中引用.阅读该文件中的评论.方法是将对文件的引用添加到composer.json中,然后"dump autoload",它将重新生成作曲家的自动加载器,以便Laravel可以找到它.使用Composer的"文件"集合是添加库或一次性函数文件的好方法,这些文件并非整齐地包含在编写器包中.很高兴有一个地方为所有"顺便说一句,我必须包括这一个奇怪的文件"的情况. (5认同)
  • 谢谢@PhillipHarrington,在某种程度上有道理.我仍然认为,如果可以使用类文件和Composer中的一行或[Laravel中的一行](http://stackoverflow.com/a/33776272/366529)来解决这个问题,那么一个更易于维护,更少与其他人相比,更容易理解,特别是对于那些由于某种原因,[不喜欢作曲家]的人(http://stackoverflow.com/q/15940140/366529).也许这是个人偏好的事情,但由于某种原因它让我觉得很脏:( (2认同)
  • @MubasharAbbas您回答了自己的问题.将助手移动到`app /`之外的其他位置,然后指向作曲家. (2认同)

hei*_*ian 332

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

此答案适用于Laravel中的常规自定义类.有关特定于Blade的更多答案,请参阅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);
    }
}
Run Code Online (Sandbox Code Playgroud)

第2步:创建别名:

<?php // Code within config/app.php

    'aliases' => [
     ...
        'Helper' => App\Helpers\Helper::class,
     ...
Run Code Online (Sandbox Code Playgroud)

第3步:composer dump-autoload在项目根目录中运行

第4步:在您的Blade模板中使用它:

<!-- Code within resources/views/template.blade.php -->

{!! Helper::shout('this is how to use autoloading correctly!!') !!}
Run Code Online (Sandbox Code Playgroud)

额外信用:在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!!');
    }
    ...
Run Code Online (Sandbox Code Playgroud)

资料来源: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

  • 需要说明的是,这个答案实际上并不涉及辅助器,它是全局命名空间的函数.相反,它鼓励将助手转换为类方法.这通常是最好的方法,但实际上并没有回答这里提出的问题,这就是为什么其他答案相比之下如此复杂的原因. (29认同)
  • 是的,我对框架进行了一次挖掘,并找到了他们将帮助程序引入的位置。而且,我完全同意命名空间静态类的方法比大多数情况下请求或推荐的方法更适合。事实是,helper 一开始并不是真正的 Laravel 方式,而是 CodeIgniter 2.x 的遗留物,它仍然没有被淘汰。因此,我对这种方法的迂腐没有完全按照要求回答 OP,更多的是试图强调这样一个事实,即您没有得到帮助,而是更好的东西。 (2认同)
  • 对于 Laravel 8(我在这个版本上测试过),在 `composer dump-autoload` 之前,您需要运行: `php artisan config:cache` 来清除文件 config/app.php 的缓存。然后就可以了 (2认同)

And*_*own 301

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

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

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

artisan make:provider HelperServiceProvider
Run Code Online (Sandbox Code Playgroud)

register方法中我添加了这个片段

public function register()
{
    foreach (glob(app_path().'/Helpers/*.php') as $filename){
        require_once($filename);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后在您config/app.php的provider数组中注册服务提供者

'providers' => [
    'App\Providers\HelperServiceProvider',
]
Run Code Online (Sandbox Code Playgroud)

现在您的Helpers目录中的任何文件都已加载,可以使用了.

更新2016-02-22

这里有很多不错的选择,但如果我的答案对你有用,我就会继续这样做,包括帮助包.您可以使用该软件包获取灵感,也可以随意使用Composer下载它.它有一些我经常使用的内置帮助程序(但默认情况下都是非活动状态),并允许您使用简单的Artisan生成器创建自己的自定义帮助程序.它还解决了一个响应者使用映射器的建议,并允许您显式定义要加载的自定义帮助程序,或者默认情况下,自动加载帮助程序目录中的所有PHP文件.反馈和PR非常感谢!

composer require browner12/helpers
Run Code Online (Sandbox Code Playgroud)

Github:browner12 /助手

  • 对于只需要添加一些功能的人来说,作曲家自动加载非常好,但对于我们这些可能有很多辅助功能的人来说,多个文件组织是必须的.这个解决方案基本上就是我在L4中所做的,只不过我在`start.php`文件中注册了这些文件(这个文件不是很好,但是当时的目的是为了它的目的).你有另外一个加载多个文件的建议吗? (29认同)
  • 我认为这种技术有很多优点.它优雅而高效,因为每次创建帮助文件时都不必记得弄乱composer.json文件. (22认同)
  • 真的很好的解决方案.我唯一不同意的是你添加文件的方式,我认为应该是一个mapper,我们在其中添加我们想要加载的文件的名称.想想错误!如果其中一个文件中只有一个帮助程序失败,那么您应该删除所有这些文件,或者让网站损坏直到您解决它. (8认同)
  • 如果您有多个文件,请将它们全部添加到composer.json文件中.甚至添加5-10行也会让*way*比你在这里更有意义. (7认同)
  • 您是否使用App\Providers命名空间?我如何从控制器和视图调用该帮助器.对不起,没有问题. (3认同)
  • 我认为这是一个奇怪的实现.如果你需要将这些函数拆分成多个文件,那么我认为你正在创建太多的全局函数.每个方法创建一个文件是愚蠢的,因为每个文件都需要先发制人. (2认同)

its*_*zad 75

这就是被认为JeffreyWay在这个Laracasts讨论.

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

  • 帮助程序可能不是仅HTTP.`app/helpers.php`或`app/Helpers /`似乎是一个更好的地方. (13认同)
  • 如果我们在共享服务器上并且没有使用“composer dump-autoload”的选项怎么办? (2认同)

dKe*_*Ken 53

通过对SO和Google的各种答案进行筛选,我仍然找不到最佳方法.大多数答案都建议我们离开应用程序并依靠第三方工具Composer来完成这项工作,但我不相信只需要包含文件就可以使用工具.

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

首先,使用命名空间在apps目录中的任意位置创建一个帮助文件:

namespace App\Helpers;

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

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

'aliases' => [
    // Other aliases
    'BobFinder' => App\Helpers\BobFinder::class
]
Run Code Online (Sandbox Code Playgroud)

这应该就是你需要做的一切.PSR-4并且别名应该将助手暴露给您的视图,因此在您的视图中,如果您键入:

{!! BobFinder::bob() !!}
Run Code Online (Sandbox Code Playgroud)

它应该输出:

<strong>Bob?! Is that you?!</strong>
Run Code Online (Sandbox Code Playgroud)

  • 我想了很多,试图让 `bob()` 真正全球化并不是明智之举。命名空间的存在是有原因的,我们不应该在基本 PHP 函数旁边调用 `bob()`。我会将您的别名添加到我的代码中 - 谢谢! (2认同)

hei*_*ian 30

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>';
         });
     }
    ...
Run Code Online (Sandbox Code Playgroud)

第2步:使用您的自定义Blade指令:

<!-- // code in resources/views/view.blade.php -->

@shout('this is my custom blade directive!!')
<br />
@customLink
Run Code Online (Sandbox Code Playgroud)

输出:

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


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

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


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


Pab*_*one 21

这是我的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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您应该创建一个Helpers在该app文件夹下调用的文件夹,然后创建一个名为whatever.phpinside 的文件,并whatever在$ helpers数组中添加该字符串.

完成!

编辑

我不再使用此选项,我目前正在使用composer来加载像helper这样的静态文件.

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

...
"autoload": {
    "files": [
        "app/helpers/my_helper.php",
        ...
    ]
},
...
Run Code Online (Sandbox Code Playgroud)

  • 使用映射方法更容易选择性地启用/禁用帮助程序,例如,如果其中一个帮助程序文件包含破坏错误.也就是说,服务提供者中的映射文件与`composer.json`中的映射文件没有什么不同,除了两点 - 首先,它将映射保留在应用程序本身内,而不是元数据文件中; 第二,每次更改要加载的文件列表时,都不需要重新运行`composer dump-autoload`. (3认同)

Aks*_*ale 11

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

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

...
"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Libraries/commonFunctions.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
...
Run Code Online (Sandbox Code Playgroud)

并执行

composer dump-autoload
Run Code Online (Sandbox Code Playgroud)


Pau*_*tas 10

由于OP要求最佳实践,我认为我们仍然缺少一些好的建议.

单个helpers.php文件远非一个好习惯.首先是因为你混合了许多不同类型的函数,所以你反对良好的编码原则.此外,这不仅损害代码文档,还会损害Cyclomatic Complexity,Maintainability 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.php,array_helpers.php等)肯定会改善那些不良指标,从而使代码更容易保留.根据使用的代码文档生成器,这将是足够好的.

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

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

Laravel在内部使用第一种方法,在程序辅助文件中声明映射到静态类方法的函数.这可能不是理想的事情,因为你需要重新声明所有的东西(docblocks/arguments).
我个人使用动态方法,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()
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

可以说这是过度工程,但我不这么认为.它工作得很好,与预期的相反,至少在使用PHP 7.x时它不会花费相关的执行时间.


Ken*_*day 8

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

应该是这样的.

 'aliases' => [ 
    ...
    ...
    'Helper' => App\Http\Services\Helper::class,
 ]
Run Code Online (Sandbox Code Playgroud)

然后到你的Controller,使用方法'use Helper'包含Helper,这样你就可以简单地调用Helper类中的一些方法.

eg. Helper::some_function();
Run Code Online (Sandbox Code Playgroud)

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

eg. {{Helper::foo()}}
Run Code Online (Sandbox Code Playgroud)

但这仍然是开发人员编码风格的方法.我们可能有不同的解决问题的方法,我只想分享我对初学者的看法.


小智 8

**

  • 状态助手

** 创建新的助手

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用于控制器和任何视图文件

use App\Helpers\StatusHelper;

class ExampleController extends Controller
{
        public function index()
        {
            $statusList = StatusHelper::getStatusesList();

            return view('example.index', compact('statusList'));
        }
}
Run Code Online (Sandbox Code Playgroud)


abh*_*mar 7

在 app/Helper/Helpers.php 中创建 Helpers.php

namespace App\Helper
class Helpers
{


}
Run Code Online (Sandbox Code Playgroud)

添加作曲家和作曲家更新

 "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
            "database","app/Helper/Helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        },
         "files": ["app/Helper/Helpers.php"]
    },
Run Code Online (Sandbox Code Playgroud)

在控制器中使用

使用App\Helper\Helpers

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

   'aliases' => [
    ...
    'Helpers'   => 'App\Helper\Helpers'
    ],
Run Code Online (Sandbox Code Playgroud)

在视图中调用

<?php echo Helpers::function_name();  ?>
Run Code Online (Sandbox Code Playgroud)

  • 如果类是命名空间的,则在“composer.json”中添加文件是没有用的,因为 psr-4 自动加载将完成这项工作。 (2认同)

小智 6

这是我创建的一个bash shell脚本,可以非常快速地创建Laravel 5外观.

在Laravel 5安装目录中运行它.

像这样称呼它:

make_facade.sh -f <facade_name> -n '<namespace_prefix>'
Run Code Online (Sandbox Code Playgroud)

例:

make_facade.sh -f helper -n 'App\MyApp'
Run Code Online (Sandbox Code Playgroud)

如果你运行的例子,它会创建目录Facades,并Providers在"your_laravel_installation_dir /应用程序/ MyApp的".

它将创建以下3个文件,并将它们输出到屏幕:

./app/MyApp/Facades/Helper.php
./app/MyApp/Facades/HelperFacade.php
./app/MyApp/Providers/HelperServiceProvider.php
Run Code Online (Sandbox Code Playgroud)

完成后,它将显示类似于以下内容的消息:

===========================
    Finished
===========================

Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',
Run Code Online (Sandbox Code Playgroud)

所以更新'config/app.php'中的Providers和Alias列表

composer -o dumpautoload

"./app/MyApp/Facades/Helper.php"最初看起来像这样:

<?php

namespace App\MyApp\Facades;


class Helper
{
    //
}
Run Code Online (Sandbox Code Playgroud)

现在只需在"./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) !!}
Run Code Online (Sandbox Code Playgroud)

此函数需要一个模式,并且可以接受可选的第二个布尔参数.

如果当前URL与传递给它的模式匹配,它将输出'active'(或'class ="active"',如果你添加'true'作为函数调用的第二个参数).

我用它来突出显示活动的菜单.

以下是我的脚本的源代码.我希望你觉得它很有用,如果你有任何问题请告诉我.

#!/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 ""
Run Code Online (Sandbox Code Playgroud)


小智 6

创建自定义 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;   
    }
}
Run Code Online (Sandbox Code Playgroud)

命名空间 App\Helpers; 在 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
Run Code Online (Sandbox Code Playgroud)

添加以下代码:

<?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);
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

这里,

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.
Run Code Online (Sandbox Code Playgroud)

我们现在需要注册 HelperServiceProvider 并为我们的助手创建一个别名。

打开/config/app.php文件

找到提供者数组变量

添加以下行

App\Providers\HelperServiceProvider::class,
Run Code Online (Sandbox Code Playgroud)

找到别名数组变量

添加以下行

'MyFuncs' => App\Helpers\MyFuncs::class,
Run Code Online (Sandbox Code Playgroud)

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

我们将创建一个路由来调用我们的自定义辅助函数 Open /app/routes.php

添加以下路由定义

Route::get('/func', function () {
    return MyFuncs::full_name("John","Doe");
});
Run Code Online (Sandbox Code Playgroud)

这里,

return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class
Run Code Online (Sandbox Code Playgroud)


ujj*_*jal 6

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

"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Http/helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
Run Code Online (Sandbox Code Playgroud)

接下来运行以下命令

composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

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


Rei*_*Sam 5

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

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

2)在文件夹内写入psr-4文件或普通php文件

如果 PHP 文件采用 psr-4 格式,则会自动加载,否则在项目根目录下的composer.json 中添加以下行

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

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/Helpers/customHelpers.php"
    ]
},
"autoload-dev": {
    "classmap": [
        "tests/TestCase.php"
    ]
},
Run Code Online (Sandbox Code Playgroud)

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