【问题标题】:How do I make global helper functions in laravel 5?如何在 laravel 5 中创建全局辅助函数?
【发布时间】:2015-12-01 21:14:25
【问题描述】:

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

我读到的所有内容都表明要创建一个 helpers 文件夹并在那里添加函数,然后你可以这样做Helpers::functionName 这是正确的做法吗?

创建可在刀片模板和控制器中使用的辅助函数的“laravel 方式”是什么?

【问题讨论】:

标签: php laravel-5 blade controllers helpers


【解决方案1】:

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

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

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

现在在你的 config/app.php 中加载这个服务提供者,你就完成了

'App\Providers\HelperServiceProvider',

【讨论】:

  • 不,只有上面提到的代码才能做到,在你的刀片文件中做 {{ yourHelperFunction('param') }}
  • 我不认为你在刀片中访问门面,如果你可以(通过调整一些东西)我不确定这是否是一个好习惯
  • 我在 config/app 中添加了别名/外观,例如:'Helper' => App\Helpers\Helper::class,我可以使用 Helper::myHelperFunction('param')在刀片中。
  • 大声笑@看起来更好。外墙并不好 - 在大多数情况下,使用它们是不好的做法。
  • AnythingHelper.php 只是一个例子,你应该用原始文件名替换它
【解决方案2】:

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

  1. 在任何你喜欢的地方创建一个functions.php 文件。在此示例中,我们将在 app/Helpers 内部创建。

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

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

    "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

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

【讨论】:

  • 我还需要创建一个可以在多个控制器文件中调用的全局函数。这看起来很简单,但是当运行命令composer dump-autoload 时会发生什么?是否创建了新文件?我什至删除了 composer.json、gulpfile.js 之类的文件,因为我认为它们根本没有被使用。
  • 太棒了!运行composer dump-autoload 类似于清除作曲家缓存。基本上,它重新评估需要从 composer.json 文件加载的类。祝你好运!
  • 高效方法
  • 比公认的答案要简单得多。我都试过了!
  • 喜欢这个实现。直线前进,速度更快!
【解决方案3】:

Laravel 全局助手

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

创建助手文件,而不是类

我更喜欢文件而不是类,因为我不想打扰命名空间,我希望它的函数可以在没有类前缀的情况下访问,例如: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.

刀片

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

作为 Blade 指令的高级用法:

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

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

用法: &lt;p&gt;@greet('Brian')&lt;/p&gt;

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

【讨论】:

  • 我必须做一个 composer dump-autoload 才能让它工作
【解决方案4】:

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

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 全局函数一样。

【讨论】:

    【解决方案5】:

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

    再次在 app/Providers/AppServiceProvider.phpregister 方法中添加以下内容

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 2016-01-06
      • 2015-04-02
      • 2015-04-13
      • 2011-02-18
      • 2016-03-14
      • 1970-01-01
      • 2019-05-23
      相关资源
      最近更新 更多