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

The*_*ebs 34 php controllers helpers blade laravel-5

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

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

什么是创建辅助功能的"laravel方式",可以在刀片模板和控制器中使用?

Kha*_*ukh 72

在你的app/Helpers目录中创建一个新文件,命名为AnythingHelper.php我的助手的一个例子是:

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

return $result;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

require_once app_path('Helpers/AnythingHelper.php');
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我在config/app中添加了alias/facade,如:'Helper'=> App\Helpers\Helper :: class,我可以在刀片中使用Helper :: myHelperFunction('param'). (2认同)
  • 哈哈@看起来更好.外墙不是更好 - 在大多数情况下,使用它们是不好的做法. (2认同)

Ari*_*sta 43

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

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

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

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

    "files": ["app/Helpers/functions.php"]
    
    Run Code Online (Sandbox Code Playgroud)

对于Laravel 5:

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": ["app/Helpers/functions.php"] // <-- Add this line
},
Run Code Online (Sandbox Code Playgroud)
  1. composer dump-autoload

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

我希望这对某人有用!

  • 比公认的答案简单得多。我两个都试了! (2认同)

bma*_*ovu 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/"
        }
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

创建您的第一个帮助函数

<?php

if (!function_exists('greet')) {
    /**
     * Greeting a person
     *
     * @param  string $person Name
     * @return string
     */
    function greet($person)
    {
        return 'Hello ' . $person;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

在尝试访问其功能之前,请记住自动加载文件: 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.
Run Code Online (Sandbox Code Playgroud)

随着刀片

<p>{{ greet('Brian') }}</p>
Run Code Online (Sandbox Code Playgroud)

作为Blade指令的高级用法:

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

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

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

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


fay*_*ayz 5

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

实用程序.php

if (!function_exists('printHello')) {

    function printHello()
    {
        return "Hello world!";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public function register()
{
   require_once __DIR__ . "/path/to/utils.php"
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

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