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

时间:2015-09-06 03:04:45

标签: php laravel-5 blade controllers helpers

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

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

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

5 个答案:

答案 0 :(得分:67)

在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的register函数中添加以下代码

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

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

'App\Providers\HelperServiceProvider',

答案 1 :(得分:36)

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

  1. 在任意位置创建functions.php文件,在此示例中,我们将在app/Helpers内创建它。

  2. 添加您的功能,但 添加类或命名空间。

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

    "files": ["app/Helpers/functions.php"]
    
  4. 对于Laravel 5:

    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": ["app/Helpers/functions.php"]
    },
    
    1. 运行composer dump-autoload
    2. 恭喜!您现在可以从应用程序的任何部分访问global_function_example('hello world'),包括Blade视图。

      我希望这对某人有用!

答案 2 :(得分:12)

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.

使用 Blade

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

作为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

答案 3 :(得分:0)

以上答案很好,但有一点复杂,因此该答案存在。

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全局函数中一样在代码库中的任何位置访问。

答案 4 :(得分:0)

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

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

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