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 vaut 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, mais cela semble également beaucoup pour une fonction simple. Un "outil" comme celui-ci ne devrait-il pas être disponible dans les modèles de lame?
Quelles sont les meilleures pratiques pour quelque chose comme cela et comment puis-je le rendre disponible aux modèles de lames?
La manière laide, paresseuse et affreuse: À 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.
libraries
dans votre dossier app
start/global.php
Pour ajouter app_path().'/libraries'
au tableau ClassLoader::addDirectories(
.composer.json
Pour ajouter "app/libraries"
Au tableau autoload
. Exécuter composer dump-autoload
À propos de vos options, citées dans le fichier global.php
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 Composer mise à jour.
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 facile)) et Composer gardera une trace de toutes les classes mais seulement après l'avoir mise à jour (Option 2, pourrait améliorer les performances).
Ma façon de faire est de créer un nouveau dossier dans le répertoire /app
À la racine de votre projet Laravel 4. Ajoutez ensuite ce dossier au premier tableau de la liste /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 dossier /app/classes
Respecte votre convention de nomspacing. Laravel 4 chargera automatiquement toutes les classes/tous les fichiers de ce dossier. De cette manière, vous n'aurez plus besoin de creuser dans les fichiers composer ni exécuter composer commande.
Pas sûr que ce soit la meilleure pratique, mais ça marche.
Si vous avez créé un fichier simple appelé /app/classes/Helpers/Helper.php
Tel que:
<?php namespace Helpers;
class Helper {
public static function helloWorld()
{
return 'Hello World';
}
}
Il suffit d’appeler Helpers\Helper::helloWorld();
Vous pouvez également aliaser cette classe d'assistance dans votre fichier /app/config/app.php
. Ajoutez simplement quelque chose comme ceci à la fin du tableau aliases
:
'Helper' => 'Helpers\Helper'
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
}
}
sauvegardez-les dans app/libraries et ajoutez-les à composer.json:
"autoload": {
"classmap": [
...
"app/libraries",
...
],
},
Execute
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
En passant, je suis un peu sûr que ce n’était qu’un exemple, mais vous n’avez peut-être pas besoin d’un assistant pour formater les dates, car toutes les dates entre Laravel sont des instances de Carbon ( https://github.com/briannesbitt/Carbon ) et il a des tas de méthodes pour formater la date et l'heure.
Vous pouvez également utiliser View::share()
avec des fermetures pour y parvenir - je viens de vous écrire à ce sujet: http://www.develophp.org/2014/07/laravel-4-blade-helper- fonctions /
Avantage supplémentaire: vous n'avez pas besoin de créer une classe supplémentaire ni de garder le namespace global propre.