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?
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',
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é.
Créez un fichier functions.php
Où vous le souhaitez. Dans cet exemple, nous allons créer à l'intérieur de app/Helpers
.
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;
}
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
},
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.
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.
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
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;
}
}
N'oubliez pas de charger automatiquement le fichier avant d'essayer d'accéder à ses fonctions: composer dump-autoload
$ php artisan tinker
Psy Shell v0.8.17 (PHP 7.0.6 ΓÇö cli) by Justin Hileman
>>> greet('Brian');
=> "Hello Brian"
>>> exit
Exit: Goodbye.
<p>{{ greet('Brian') }}</p>
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