web-dev-qa-db-fra.com

Classes d'assistance personnalisées dans Laravel 5.4

J'ai des classes d'assistance dans app/Helpers. Comment puis-je charger ces classes en utilisant un service provider Pour les utiliser dans des modèles de lame?

par exemple. Si j'ai une classe CustomHelper qui contient une méthode fooBar():

<?php

nampespace App\Helpers;

class CustomHelper
{
    static function fooBar()
    {
        return 'it works!';
    }
}

Je veux pouvoir faire quelque chose comme ça dans mes modèles de lames:

{{ fooBar() }}

au lieu de faire ceci:

{{ \App\Helpers\CustomHelper::fooBar() }}

PS: @ andrew-brown's answer in Meilleures pratiques pour les assistants personnalisés sur Laravel 5 traite des fichiers non-classe. Ce serait bien d'avoir une solution basée sur les classes pour que les fonctions d'aide puissent être organisées entre les classes.

14
byteseeker

Je ne pense pas qu'il soit possible d'utiliser uniquement la fonction lorsque vous avez du code dans vos classes. Eh bien, vous pouvez essayer d'étendre Blade, mais c'est trop.

Ce que vous devez faire est de créer un fichier supplémentaire, par exemple app\Helpers\helpers.php et dans votre fichier composer.json mettez:

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": ["app/Helpers/helpers.php"] // <- this line was added
},

créer app/Helpers/helpers.php fichier et exécutez

composer dump-autoload

Maintenant dans votre app/Helpers/helpers.php fichier, vous pouvez ajouter ces fonctions personnalisées, par exemple comme ceci:

if (! function_exists('fooBar')) {
   function fooBar() 
   {
      return \App\Helpers\CustomHelper::fooBar();
   }
}

vous définissez donc des fonctions globales, mais en fait, toutes peuvent utiliser des méthodes publiques spécifiques de certaines classes.

Au fait, c'est exactement ce que Laravel fait pour ses propres assistants par exemple:

if (! function_exists('array_add')) {
    function array_add($array, $key, $value)
    {
        return Arr::add($array, $key, $value);
    }
}

comme tu vois array_add n'est qu'une façon d'écrire plus courte (ou peut-être moins verbeuse) Arr::add

32
Marcin Nabiałek