154 votes

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

J'essaie de comprendre quel est le meilleur endroit pour placer 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 des classes dans ce dossier, mais cela semble également beaucoup pour une simple fonction. Un tel "outil" ne devrait-il pas être disponible dans les modèles Blade ?

Quelles sont les meilleures pratiques pour un projet de ce type et comment puis-je le mettre à la disposition des modèles Blade ?

236voto

Alexandre Danault Points 3443

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

La méthode propre : Créez une bibliothèque. De cette façon, elle sera chargée automatiquement UNIQUEMENT lorsque vous l'utiliserez réellement.

  • Créer un libraries dans votre dossier app dossier
  • Créez votre fichier de bibliothèque, créez-y une classe et ajoutez-y des fonctions statiques.
  • Option 1 : Editer start/global.php à ajouter app_path().'/libraries' à la ClassLoader::addDirectories( le tableau.
  • Option 2 : Editer composer.json à ajouter "app/libraries" à la autoload réseau. Exécuter composer dump-autoload
  • Appelez votre classe et vos fonctions statiques depuis vos vues.

A propos de vos options, cité dans le global.php fichier

En plus d'utiliser Composer, vous pouvez utiliser le chargeur de classes de Laravel pour charger vos contrôleurs et modèles. Ceci est utile pour garder toutes vos classes dans l'espace de nom "global" sans que Composer ne soit mis à jour.

Vous pouvez combiner les deux options, où le chargeur de classes de Laravel recherchera automatiquement les classes dans les répertoires enregistrés ( Option 1 plus facile) et Composer gardera un enregistrement de toutes les classes mais seulement après que vous l'ayez mis à jour ( Option 2 qui pourrait améliorer les performances).

84voto

JasonMortonNZ Points 1340

Ma façon de procéder consiste à créer un nouveau dossier dans le dossier /app dans la racine de votre projet Laravel 4. Ensuite, ajoutez ce dossier au premier tableau de la section /app/start/global.php comme suit :

<?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 du dossier dans le nouveau /app/classes suit votre convention d'espacement des noms. Laravel 4 chargera automatiquement toutes les classes/fichiers de ce dossier. Ainsi, il n'est pas nécessaire de fouiller dans les fichiers du compositeur ou d'exécuter la commande du compositeur.

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

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

<?php namespace Helpers;

class Helper {

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

Il vous suffit d'appeler Helpers\Helper::helloWorld();

Vous pourriez également aliaser cette classe d'aide dans votre /app/config/app.php fichier. Il suffit d'ajouter quelque chose comme ceci à la fin du fichier aliases le tableau :

'Helper'          => 'Helpers\Helper'

25voto

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, c'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 app/libraries et ajoutez-les à composer.json :

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

Exécuter

composer dump

Et ensuite, utilisez-les partout 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 sûr que ce n'était qu'un exemple, mais vous n'avez peut-être pas besoin d'une aide pour formater les dates, puisque 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.

7voto

Franz Points 5924

Vous pouvez également utiliser View::share() avec les fermetures pour y parvenir - je viens de publier un article à 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 vous gardez également l'espace de nom global propre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X