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

How do I make global helper functions in laravel 5?

如果我想为我正在做的一些 oauth 东西创建一个 currentUser() 函数,我可以在视图或控制器中使用它(想想 rails,你在哪里做 helper_method: current_user 在应用程序控制器中)。

我读到的所有内容都指出创建一个助手文件夹并在其中添加函数,然后您就可以这样做 Helpers::functionName这是正确的方法吗?

创建可在 blade 模板和控制器中使用的辅助函数有什么 "laravel way"?

在您的 app/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

在你新生成的register函数中HelperServiceProvider.php添加如下代码

require_once app_path('Helpers/AnythingHelper.php');

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

'App\Providers\HelperServiceProvider',

创建全局函数文件的一种简单有效的方法是直接从 Composer 自动加载它。 composer 的自动加载部分接受自动加载的 files 数组。

  1. 随心所欲地创建一个 functions.php 文件。在此示例中,我们将在 app/Helpers 内创建。

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

    <?php
    
    function global_function_example($str)
    {
       return 'A Global Function with '. $str;
    }
    
  3. composer.jsonautoload 部分添加以下行:

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

    Laravel 5 示例:

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

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

Laravel 全局助手

通常您会发现自己需要一个可以在整个应用程序中全局访问的实用函数。借鉴 laravel 如何编写他们的默认助手,您可以使用自定义函数扩展功能。

创建助手文件,而不是class

我更喜欢文件而不是 class,因为我不想打扰名称空间并且我希望它的功能可以在没有 class 前缀的情况下访问,例如:greeting('Brian');而不是 Helper::greeting('Brian'); 就像 Laravel 对他们的助手所做的那样。

文件: 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 的启动方法中注册你的 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

上面的答案很好,但有点复杂,因此存在这个答案。

utils.php

if (!function_exists('printHello')) {

    function printHello()
    {
        return "Hello world!";
    }
}

app/Providers/AppServiceProvider.phpregister方法

中添加如下内容
public function register()
{
   require_once __DIR__ . "/path/to/utils.php"
}

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

另一种选择,如果您不想一个一个地注册所有的辅助函数,并且想知道每次创建新的辅助函数时如何注册它们:

再次在app/Providers/AppServiceProvider.php中添加下面的register方法

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