Meilleures pratiques pour les aides et fonctions de base Laravel 4?

152

J'essaie de comprendre le meilleur endroit pour mettre une fonction globale dans Laravel 4. Par exemple, le formatage de la date. Je ne pense pas que faire une façade en vaille la peine car les façades sont trop modulaires. J'ai lu des articles sur la création d'un dossier de bibliothèque et le stockage de classes là-bas, mais cela semble également beaucoup pour une fonction simple. Un «outil» comme celui-ci ne devrait-il pas être disponible dans les modèles Blade?

Quelles sont les meilleures pratiques pour quelque chose comme celui-ci et comment le rendre disponible pour les modèles Blade?

Jason Spick
la source

Réponses:

233

La manière laide, paresseuse et horrible: à la fin de bootstrap/start.php, ajoutez un include('tools.php')et placez votre fonction dans ce nouveau fichier.

La manière propre: créez une bibliothèque. De cette façon, il sera chargé automatiquement UNIQUEMENT lorsque vous l'utiliserez réellement.

  • Créez un librariesdossier dans votre appdossier
  • Créez votre fichier de bibliothèque, créez une classe dedans et ajoutez-y des fonctions statiques
  • Option 1 : Modifier start/global.phppour ajouter app_path().'/libraries'auClassLoader::addDirectories( tableau.
  • Option 2 : Modifier composer.jsonpour ajouter "app/libraries"auautoload tableau. Courircomposer dump-autoload
  • Appelez votre classe et vos fonctions statiques à partir de vos vues.

À propos de vos options, cité dans le global.phpfichier

En plus d'utiliser Composer, vous pouvez utiliser le chargeur de classe Laravel pour charger vos contrôleurs et modèles. Ceci est utile pour conserver toutes vos classes dans l'espace de noms "global" sans mise à jour de Composer.

Vous pouvez combiner les deux options, où le chargeur de classe Laravel recherchera automatiquement les classes dans les répertoires enregistrés ( option 1 , plus simple) et Composer gardera une trace de toutes les classes, mais seulement après la mise à jour ( option 2 , pourrait améliorer les performances).

Alexandre Danault
la source
3
Je pense que vous devez également placer app_path().'/library', dans start / global.php.
Alexandre Butynski
2
@AlexandreButynski Bon point. Cela permettra d'ajouter des bibliothèques sans avoir à mettre à jour le compositeur à chaque fois. J'ai modifié mon message pour l'ajouter.
Alexandre Danault
Je crée donc une classe appelée IDK ... SiteHelpers puis je définis une méthode formatDate. et puis dans le modèle je devrais être capable de faire SiteHelpers :: formatDate ($ date)?
Jason Spick
@JasonSpick Oui, et assurez-vous de nommer votre fichiersitehelpers.php
Alexandre Danault
3
Pourquoi avez-vous besoin de l'ajouter au chargement automatique du compositeur ainsi qu'au fichier global.php?
CashIsClay
82

Ma façon de faire est de créer un nouveau dossier dans le /apprépertoire à la racine de votre projet Laravel 4. Ajoutez ensuite ce dossier au premier tableau du /app/start/global.phpfichier comme ceci:

<?php

ClassLoader::addDirectories(array(

app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/classes', // This line is the one I've added.

));

Tant que la structure de dossiers dans le nouveau /app/classesdossier respecte votre convention d'espacement de noms. Laravel 4 chargera automatiquement toutes les classes / fichiers de ce dossier. De cette façon, il n'est pas nécessaire de fouiller dans les fichiers de composition ou d'exécuter la commande de composition.

Je ne sais pas si c'est la meilleure pratique, mais cela fonctionne certainement.

Si vous avez créé un fichier simple appelé /app/classes/Helpers/Helper.phpcomme ceci:

<?php namespace Helpers;

class Helper {

    public static function helloWorld()
    {
        return 'Hello World';
    }
}

Tout ce que vous auriez à faire est d'appeler Helpers\Helper::helloWorld();

Vous pouvez également alias cette classe d'assistance dans votre /app/config/app.phpfichier. Ajoutez simplement quelque chose comme ceci à la fin du aliasestableau:

'Helper'          => 'Helpers\Helper'
JasonMortonNZ
la source
4
J'aime cette façon parce que vous n'avez pas à vous mêler de quoi que ce soit de compositeur, une solution propre et élégante. +1
Gadoma
3
Si vous deviez ajouter votre classe d'assistance à votre fichier app.php, vous pouvez maintenant accéder directement à la classe comme ceci: Helper :: hellowWorld ();
Helmut Granda
l'aide doit-elle être une classe? puis-je définir une fonction simple ici?
Webinan
2
Cela ne fonctionne pas si vous n'éditez pas le composer.json et ne lancez pas le compositeur dumpautoload
Rommy
1
Excellente solution. Comme le dit Rommy, n'oubliez pas de courir composer dump-autoload- je l'ai fait et j'ai passé 20 minutes à me gratter la tête.
al_manchester
25

La méthode helpers.php de Laravel consiste à l'ajouter à vos "fichiers" dans composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

"autoload": {
    "classmap": [
        ...
    ],
    "files": [
        "app/libraries/helpers.php"
    ],
},

Ce que je fais est de créer de petites classes (quelques méthodes par classe, une ligne par méthode, tout est étendu à partir de quelque chose et DRY, c'est mon objectif),

class ExtendedCarbon extends Carbon\Carbon {

    public function formatDDMMAAAA($date)
    {
        /// format and return
    }

}

enregistrez-les dans les applications / bibliothèques et ajoutez-les à composer.json:

"autoload": {
    "classmap": [
        ...
        "app/libraries",
        ...
    ],
},

Exécuter

composer dump

Et puis utilisez-les là où vous en avez besoin

$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);

Regardez cette vidéo sur le refactoring: http://www.youtube.com/watch?v=DC-pQPq0acs

Au fait, je suis un peu sûr que ce n'était qu'un exemple, mais vous n'aurez peut-être pas besoin d'aide pour formater les dates, car toutes les dates dans Laravel sont des instances de Carbon ( https://github.com/briannesbitt/Carbon ) et il dispose de nombreuses méthodes pour formater la date et l'heure.

Antonio Carlos Ribeiro
la source
Je ne suis pas un grand fan des méthodes statiques moi-même, et j'essaie d'utiliser des méthodes d'instance si nécessaire. Bug Je suis à peu près sûr que dans le cas d'une telle utilisation, vous feriez bien mieux d'avoir formatDDMMAAAA()comme static.
XedinUnknown le
7

Vous pouvez également utiliser View::share()avec des fermetures pour y parvenir - je viens de poster à ce sujet: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Avantage supplémentaire: vous n'avez pas besoin de créer une classe supplémentaire et de garder l'espace de noms global propre.

Franz
la source
J'aime cette approche. Plus de rail-ish. Pouvons-nous comment ajouter toutes les méthodes d'aide à la vue à l'intérieur d'un trait et les avoir disponibles dans la vue en lame?
bibstha le
Je ne pense pas que ce soit possible avec PHP, pour être honnête.
Franz