如何在laravel 5中创建全局辅助函数?

49

如果我想为我正在进行的一些OAuth相关操作创建一个currentUser()函数,以便我可以在视图或控制器中使用它(类似于Rails中,在应用程序控制器中执行helper_method:current_user)。

我阅读的所有内容都指出要创建一个帮助程序文件夹并在其中添加该函数,然后您可以执行Helpers :: functionName 。这是正确的方式吗?

在Laravel中,创建可以在Blade模板和控制器中使用的辅助函数的“Laravel方式”是什么?


1
也许这会有所帮助:https://dev59.com/Tl4c5IYBdhLWcg3wHXNS - Iamzozo
5个回答

88

在您的应用程序/Helpers目录中创建一个名为AnythingHelper.php的新文件。 我的助手的一个示例是:

<?php
function getDomesticCities()
{
$result = \App\Package::where('type', '=', 'domestic')
    ->groupBy('from_city')
    ->get(['from_city']);

return $result;
}

通过以下命令为您的助手生成服务提供程序

php artisan make:provider HelperServiceProvider
在您新生成的HelperServiceProvider.php文件的register函数中添加以下代码。
require_once app_path('Helpers/AnythingHelper.php');

现在在您的config/app.php中加载此服务提供程序,您就完成了

'App\Providers\HelperServiceProvider',

1
不,只有上述代码可以实现,在您的 Blade 文件中使用 {{ yourHelperFunction('param') }}。 - Khan Shahrukh
1
我认为在Blade中无法访问Facade,如果您可以通过某些调整来实现访问(Facade),我不确定这是否是一个好的做法。 - Khan Shahrukh
2
我在config/app中添加了别名/门面,如下所示:'Helper' => App\Helpers\Helper::class,并且我能够在blade中使用Helper::myHelperFunction('param')。 - MaXi32
3
LOL @ 看起来更漂亮。外观并不更好-在大多数情况下,使用它们是一种不良实践。 - Mike Barwick
1
AnythingHelper.php 只是一个示例,您应该将其替换为原始文件名。 - Khan Shahrukh
显示剩余8条评论

62

创建全局函数文件的一种简单高效方法是直接从Composer中自动加载它。Composer的autoload部分接受一个files数组,会被自动加载。

  1. 在任何你喜欢的地方创建一个functions.php文件。在这个例子中,我们将在app/Helpers目录下创建。

  2. 添加你的函数,但不要添加类或命名空间。

<?php

function global_function_example($str)
{
   return 'A Global Function with '. $str;
}
  • composer.json 文件的 autoload 部分中添加以下行:

  • "files": ["app/Helpers/functions.php"]
    

    Laravel 5的示例:

    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": ["app/Helpers/functions.php"] // <-- Add this line
    },
    
  • 运行 composer dump-autoload

  • 完成!现在你可以在应用程序的任何部分,包括 Blade 视图中访问 global_function_example('hello world')


    1
    我还需要创建一个全局函数,可以在多个控制器文件中调用。这看起来很简单,但是当运行命令 composer dump-autoload 时会发生什么?是否会创建新文件?我甚至删除了像 composer.json、gulpfile.js 这样的文件,因为我认为它们根本没有被使用。 - Johnny
    太好了!运行 composer dump-autoload 就像清除 composer 缓存一样。基本上,它会重新评估需要从 composer.json 文件加载的类。祝你好运! - Arian Acosta
    高效的方法 - Naveen DA
    2
    比起被接受的答案,这个简单多了。我都试过! - Philip E
    1
    喜欢这个实现。直截了当且更快! - realnsleo
    如果该项不是最后一项,请在“files”后面不要忘记逗号:“[“app/Helpers/functions.php”]”,对于Mac,命令将是composer.phar dump-autoload。 - DragonFire

    24

    Laravel全局助手函数

    你经常会发现自己需要一些在整个应用程序中都可以访问的实用函数。借鉴Laravel编写默认助手函数的方式,您可以使用自定义函数扩展其功能。

    创建助手文件,而不是类

    我更喜欢使用文件而不是类,因为我不想处理命名空间,并且希望它的函数可以在没有类前缀的情况下访问,就像Laravel使用其帮助程序一样:greeting('Brian'); 而不是 Helper::greeting('Brian');

    文件:app/Support/helper.php

    使用Composer注册助手文件:composer.json

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

    创建你的第一个辅助函数

    <?php
    
    if (!function_exists('greet')) {
        /**
         * Greeting a person
         *
         * @param  string $person Name
         * @return string
         */
        function greet($person)
        {
            return 'Hello ' . $person;
        }
    }
    

    使用方法:

    在尝试访问其函数之前,请记得自动加载文件: composer dump-autoload

    让我们用 Tinker 进行测试

    $ php artisan tinker
    Psy Shell v0.8.17 (PHP 7.0.6 ΓÇö cli) by Justin Hileman
    >>> greet('Brian');
    => "Hello Brian"
    >>> exit
    Exit:  Goodbye.
    

    使用Blade

    <p>{{ greet('Brian') }}</p>
    

    作为 Blade 指令的高级用法:

    有时您会发现自己想要使用 Blade 指令而不是普通函数。 在 AppServiceProvider 的 boot 方法中注册您的 Blade 指令:app/Providers/AppServiceProvider.php

    public function boot()
    {
        // ...
        Blade::directive('greet', function ($expression) {
            return "<?php echo greet({$expression}); ?>";
        });
    }
    

    使用方法: <p>@greet('Brian')</p>

    注意: 你可能需要清除缓存视图 php artisan view:clear


    1
    我必须执行composer dump-autoload才能使其工作。 - Gjaa

    6
    上述答案很好,但有一些复杂性,因此需要这个答案。 utils.php
    if (!function_exists('printHello')) {
    
        function printHello()
        {
            return "Hello world!";
        }
    }
    

    app/Providers/AppServiceProvider.php 文件中,在 register 方法中添加以下内容:

    public function register()
    {
       require_once __DIR__ . "/path/to/utils.php"
    }
    

    现在,printHello函数就像任何其他Laravel全局函数一样,在代码库中的任何地方都可以访问。


    5

    如果您不想逐个注册所有帮助函数,并且想知道如何在创建新帮助函数时注册它们,还有另一种选项:

    再次进入 app/Providers/AppServiceProvider.php 文件,在 register 方法中添加以下内容:

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

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