How do I make global helper functions in laravel 5?

风流意气都作罢 提交于 2019-11-27 05:17:14

问题


If I wanted to make a currentUser() function for some oauth stuff I am doing where I can use it in a view or in a controller (think rails, where you do helper_method: current_user in the application controller).

Everything I read states to create a helpers folder and add the function there and then that way you can do Helpers::functionName Is this the right way to do this?

Whats the "laravel way" of creating helper functions that can be used in blade templates and controllers?


回答1:


Create a new file in your app/Helpers directory name it AnythingHelper.php An example of my helper is :

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

return $result;
}

generate a service provider for your helper by following command

php artisan make:provider HelperServiceProvider

in the register function of your newly generated HelperServiceProvider.php add following code

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

now in your config/app.php load this service provider and you are done

'App\Providers\HelperServiceProvider',



回答2:


An easy and efficient way of creating a global functions file is to autoload it directly from Composer. The autoload section of composer accepts a files array that is automatically loaded.

  1. Create a functions.php file wherever you like. In this example, we are going to create in inside app/Helpers.

  2. Add your functions, but do not add a class or namespace.

    <?php
    
    function global_function_example($str)
    {
       return 'A Global Function with '. $str;
    }
    
  3. In composer.json inside the autoload section add the following line:

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

    Example for Laravel 5:

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

Done! You may now access global_function_example('hello world') form any part of your application including Blade views.




回答3:


Laravel global helpers

Often you will find your self in need of a utility function that is access globally throughout you entire application. Borrowing from how laravel writes their default helpers you're able to extend the ability with your custom functions.

Create the helper file, not class

I prefer to you a file and not a class since I dont want to bother with namespaces and I want its functions to be accessible without the class prefixes like: greeting('Brian'); instead of Helper::greeting('Brian'); just like Laravel does with their helpers.

File: app/Support/helper.php

Register helper file with Composer: composer.json

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

Create your first helper function

<?php

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

Usage:

Remember to autoload the file before trying to access its functions: composer dump-autoload

Let's test with Tinker

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

With Blade

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

Advanced usage as Blade directive:

A times you will find yourself wanting to use a blade directive instead of a plain function. Register you Blade directive in the boot method of AppServiceProvider: app/Providers/AppServiceProvider.php

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

Usage: <p>@greet('Brian')</p>

Note: you might need to clear cache views php artisan view:clear




回答4:


The above answers are great with a slight complication, therefore this answer exists.

utils.php

if (!function_exists('printHello')) {

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

in app/Providers/AppServiceProvider.php add the following in register method

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

now printHello function is accessible anywhere in code-base just as any other laravel global functions.



来源:https://stackoverflow.com/questions/32419619/how-do-i-make-global-helper-functions-in-laravel-5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!