web-dev-qa-db-fra.com

Comment créer des fonctions d'assistance globales dans laravel 5?

Si je voulais créer une fonction currentUser() pour certaines choses oauth que je fais là où je peux les utiliser dans une vue ou dans un contrôleur (pensez Rails, où vous faites helper_method: current_user dans le contrôleur d'application).

Tout ce que je lis déclare pour créer un dossier d'aide et y ajouter la fonction, puis de cette façon vous pouvez faire Helpers::functionName Est-ce la bonne façon de procéder?

Quelle est la "façon laravel" de créer des fonctions d'assistance qui peuvent être utilisées dans les modèles de lames et les contrôleurs?

32
TheWebs

Créez un nouveau fichier dans votre répertoire app/Helpers nommez-le AnythingHelper.php Un exemple de mon aide est:

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

return $result;
}

générer un fournisseur de services pour votre assistant en suivant la commande

php artisan make:provider HelperServiceProvider

dans la fonction d'enregistrement de votre HelperServiceProvider.php nouvellement généré, ajoutez le code suivant

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

maintenant dans votre config/app.php chargez ce fournisseur de services et vous avez terminé

'App\Providers\HelperServiceProvider',
68
Khan Shahrukh

Un moyen simple et efficace de créer un fichier de fonctions globales consiste à le charger automatiquement directement depuis Composer. La section de chargement automatique de composer accepte un tableau files qui est automatiquement chargé.

  1. Créez un fichier functions.php Où vous le souhaitez. Dans cet exemple, nous allons créer à l'intérieur de app/Helpers.

  2. Ajoutez vos fonctions, mais ne pas ajoutez une classe ou un espace de noms.

    <?php
    
    function global_function_example($str)
    {
       return 'A Global Function with '. $str;
    }
    
  3. Dans composer.json À l'intérieur de la section autoload, ajoutez la ligne suivante:

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

    Exemple pour Laravel 5:

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

Terminé! Vous pouvez désormais accéder à global_function_example('hello world') depuis n'importe quelle partie de votre application, y compris les vues Blade.

41
Arian Acosta

Aides mondiales Laravel

Souvent, vous trouverez que vous avez besoin d'une fonction utilitaire accessible à l'échelle mondiale tout au long de votre application. Empruntant à la façon dont laravel écrit leurs assistants par défaut, vous pouvez étendre la capacité avec vos fonctions personnalisées.

Créez l'assistant fichier, pas la classe

Je vous préfère un fichier et non une classe car je ne veux pas me soucier des espaces de noms et je veux que ses fonctions soient accessibles sans les préfixes de classe comme: greeting('Brian'); au lieu de Helper::greeting('Brian'); comme Laravel fait avec leurs assistants.

Fichier:app/Support/helper.php

Enregistrez le fichier d'assistance avec Composer: composer.json

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

Créez votre première fonction d'aide

<?php

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

Usage:

N'oubliez pas de charger automatiquement le fichier avant d'essayer d'accéder à ses fonctions: composer dump-autoload

Testons avec Tinker

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

Avec lame

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

Utilisation avancée comme directive Blade:

Parfois, vous vous retrouverez à vouloir utiliser une directive lame au lieu d'une simple fonction. Enregistrez votre directive Blade dans la méthode de démarrage d'AppServiceProvider: app/Providers/AppServiceProvider.php

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

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

Remarque: vous devrez peut-être effacer les vues du cache php artisan view:clear

12
bmatovu