Je voudrais créer des fonctions d'aide pour éviter de répéter du code entre les vues dans Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Ce sont essentiellement des fonctions de formatage de texte. Où et comment puis-je créer un fichier avec ces fonctions?
php
laravel
laravel-5
laravel-helper
Calebe Oliveira
la source
la source
Cours personnalisés dans Laravel 5, la voie facile
Cette réponse est applicable aux classes personnalisées générales au sein de Laravel. Pour une réponse plus spécifique à la lame, voir les directives de lame personnalisées dans Laravel 5 .
Étape 1: créez votre fichier Helpers (ou autre classe personnalisée) et donnez-lui un espace de noms correspondant. Écrivez votre classe et votre méthode:
Étape 2: créez un alias:
Étape 3: exécuter
composer dump-autoload
dans la racine du projetÉtape 4: utilisez-le dans votre modèle de lame:
Crédit supplémentaire: utilisez cette classe n'importe où dans votre application Laravel:
Source: http://www.php-fig.org/psr/psr-4/
Pourquoi cela fonctionne: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
Origine du chargement automatique: http://php.net/manual/en/language.oop5.autoload.php
la source
aliases
tableau dansapp/config.php
:'Helper' => App\Helpers\Helper::class,
vous pourrez alors appeler laHelper::prettyJson();
lame très bien.ma pensée initiale était aussi le chargement automatique du compositeur, mais cela ne me semblait pas très Laravel 5ish. L5 fait un usage intensif des fournisseurs de services, c'est ce qui amorce votre application.
Pour commencer, j'ai créé un dossier dans mon
app
répertoire appeléHelpers
. Ensuite, dans leHelpers
dossier, j'ai ajouté des fichiers pour les fonctions que je voulais ajouter. Avoir un dossier avec plusieurs fichiers nous permet d'éviter un gros fichier qui devient trop long et ingérable.Ensuite, j'ai créé un
HelperServiceProvider.php
en exécutant la commande artisan:Dans la
register
méthode, j'ai ajouté cet extraitenregistrez enfin le fournisseur de services dans votre
config/app.php
tableau des fournisseursmaintenant, n'importe quel fichier de votre
Helpers
répertoire est chargé et prêt à l'emploi.MISE À JOUR 2016-02-22
Il y a beaucoup de bonnes options ici, mais si ma réponse fonctionne pour vous, j'ai continué et j'ai fait un package pour inclure les aides de cette façon. Vous pouvez soit utiliser le package pour vous inspirer, soit le télécharger gratuitement avec Composer. Il a des assistants intégrés que j'utilise souvent (mais qui sont tous inactifs par défaut) et vous permet de créer vos propres assistants personnalisés avec un simple générateur Artisan. Il répond également à la suggestion d'un répondant d'utiliser un mappeur et vous permet de définir explicitement les assistants personnalisés à charger ou, par défaut, de charger automatiquement tous les fichiers PHP dans votre répertoire d'assistance. Les commentaires et les RP sont très appréciés!
Github: browner12 / helpers
la source
start.php
fichier (ce qui n'était pas génial, mais a servi son objectif pour le moment). avez-vous une autre suggestion pour charger plusieurs fichiers?C'est ce que suggère
JeffreyWay
cette discussion sur les Laracasts .app/Http
répertoire, créez unhelpers.php
fichier et ajoutez vos fonctions.composer.json
, dans leautoload
bloc, ajoutez"files": ["app/Http/helpers.php"]
.composer dump-autoload
.la source
app/helpers.php
ouapp/Helpers/
semble être un meilleur endroit.composer dump-autoload
?composer dump-autoload
vous pouvez suivre ceci: developpé.beAprès avoir passé au crible une variété de réponses sur SO et Google, je n'ai toujours pas pu trouver une approche optimale. La plupart des réponses suggèrent que nous quittions l'application et que nous nous appuyions sur Composer d'outil tiers pour faire le travail, mais je ne suis pas convaincu que le couplage à un outil juste pour inclure un fichier soit judicieux.
La réponse d'Andrew Brown se rapproche le plus de la façon dont je pense qu'elle devrait être abordée, mais (au moins en 5.1), l'étape du fournisseur de services n'est pas nécessaire. La réponse de Heisian met en évidence l'utilisation
PSR-4
qui nous rapproche un peu plus. Voici ma dernière implémentation pour les assistants dans les vues:Tout d'abord, créez un fichier d'aide n'importe où dans le répertoire de vos applications, avec un espace de noms:
Ensuite, alias votre classe dans
config\app.php
, dans lealiases
tableau:Et cela devrait être tout ce que vous devez faire.
PSR-4
et l'alias doit exposer l'assistant à vos vues, donc dans votre vue, si vous tapez:Il devrait produire:
la source
{!! bob() !!}
. va faire un peu plus de recherche et voir si c'est possiblebob()
véritablement mondial ne serait pas une chose sage à faire. Les espaces de noms sont là pour une raison et nous ne devrions pas appeler àbob()
côté des fonctions PHP de base. Je vais ajouter votre bit d'alias à mon code - merci!extends Helper
t- il ? Cela ne me semble pas nécessaire.extends Helper
n'est en effet pas nécessaire. Merci pour l'information.Directives de lame personnalisées dans Laravel 5
Oui, il existe une autre façon de procéder!
Étape 1: enregistrer une directive Blade personnalisée:
Étape 2: utilisez votre directive Blade personnalisée:
Les sorties:
CECI EST MA DIRECTIVE DE LAME PERSONNALISÉE !!
Lien personnalisé
Source: https://laravel.com/docs/5.1/blade#extending-blade
Lecture supplémentaire: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
Si vous voulez savoir comment créer au mieux des classes personnalisées que vous pouvez utiliser n'importe où , consultez Classes personnalisées dans Laravel 5, la méthode simple
la source
Voici mon fichier HelpersProvider.php:
Vous devez créer un dossier appelé
Helpers
sous leapp
dossier, puis créer un fichier appelé à l'whatever.php
intérieur et ajouter la chaînewhatever
à l'intérieur du tableau $ helpers.Terminé!
Éditer
Je n'utilise plus cette option, j'utilise actuellement le compositeur pour charger des fichiers statiques comme des aides.
Vous pouvez ajouter les assistants directement à:
la source
glob()
comme l'a écrit Andrew Brown? Si vous voulez pouvoir spécifier les fichiers que vous souhaitez inclure, pourquoi ne pas spécifier les fichiers dans lecomposer.json
pour les charger automatiquement comme Joseph Silber l'a écrit? Pourquoi préférez-vous cette solution? Je ne dis pas que c'est une mauvaise solution, je suis juste curieux.composer.json
exception de deux points - tout d'abord, il conserve la carte à l'intérieur de l'application elle-même, plutôt qu'un fichier de métadonnées; deuxièmement, il ne vous oblige pas à réexécutercomposer dump-autoload
chaque fois que vous modifiez la liste des fichiers à charger.include
ourequire
, Laravel a déjà un chargement automatique PSR-4 intégréPour les bibliothèques d'assistance personnalisées dans mon projet Laravel, j'ai créé un dossier avec un nom
Libraries
dans monLaravel/App
répertoire et dans le répertoire des bibliothèques, j'ai créé divers fichiers pour différentes bibliothèques d'assistance.Après avoir créé mes fichiers d'aide, j'inclus simplement tous ces fichiers dans mon fichier composer.json comme ceci
et exécuter
la source
composer dump-autoload
etcomposer dumpautoload
fonctionne également en fait fonctionneracomposer du
également ...Depuis qu'OP a demandé les meilleures pratiques , je pense qu'il nous manque encore quelques bons conseils ici.
Un seul fichier helpers.php est loin d'être une bonne pratique. Tout d'abord parce que vous mélangez beaucoup de types de fonctions différents, vous êtes donc contre les bons principes de codage. De plus, cela pourrait nuire non seulement à la documentation du code, mais également aux mesures de code comme la complexité cyclomatique , l' indice de maintenabilité et le volume Halstead . Plus vous avez de fonctions, plus cela empire.
La documentation du code serait OK en utilisant des outils comme phpDocumentor , mais en utilisant Sami, il ne rendra pas les fichiers procéduraux . La documentation de l'API Laravel est un tel cas - il n'y a pas de documentation sur les fonctions d'assistance: https://laravel.com/api/5.4
Les métriques de code peuvent être analysées avec des outils comme PhpMetrics . L'utilisation de PhpMetrics version 1.x pour analyser le code du framework Laravel 5.4 vous donnera de très mauvaises métriques CC / MI / HV pour les fichiers src / Illuminate / Foundation / helpers.php et src / Illuminate / Support / helpers.php .
Plusieurs fichiers d'aide contextuelle (par exemple , string_helpers.php , array_helpers.php , etc.) amélioreraient certainement ces mauvaises mesures, ce qui rendrait le code plus facile à maintenir. Selon le générateur de documentation de code utilisé, cela serait suffisant.
Il peut être encore amélioré en utilisant des classes d'assistance avec des méthodes statiques afin qu'elles puissent être contextualisées à l'aide d'espaces de noms. Tout comme la façon dont Laravel déjà fait avec
Illuminate\Support\Str
etIlluminate\Support\Arr
classes. Cela améliore à la fois les mesures / organisation du code et la documentation. Les alias de classe pourraient être utilisés pour les rendre plus faciles à utiliser.Structurer avec des classes améliore l'organisation et la documentation du code, mais d'un autre côté, nous finissons par perdre ces fonctions globales courtes et faciles à mémoriser. Nous pouvons encore améliorer cette approche en créant des alias de fonction pour ces méthodes de classes statiques. Cela peut être fait manuellement ou dynamiquement.
Laravel utilise en interne la première approche en déclarant des fonctions dans les fichiers d'assistance procédurale qui sont mappées aux méthodes des classes statiques. Ce n'est peut-être pas l'idéal car vous devez redéclarer tous les éléments (docblocks / arguments).
J'utilise personnellement une approche dynamique avec une
HelperServiceProvider
classe qui crée ces fonctions dans le temps d'exécution:On peut dire que c'est de l'ingénierie mais je ne pense pas. Cela fonctionne plutôt bien et contrairement à ce que l'on pourrait attendre, il ne coûte pas de temps d'exécution pertinent au moins lors de l'utilisation de PHP 7.x.
la source
Voici un script shell bash que j'ai créé pour créer des façades Laravel 5 très rapidement.
Exécutez-le dans votre répertoire d'installation de Laravel 5.
Appelez ça comme ceci:
Exemple:
Si vous exécutez cet exemple, il créera les répertoires
Facades
etProviders
sous «your_laravel_installation_dir / app / MyApp».Il créera les 3 fichiers suivants et les affichera également à l'écran:
Une fois cela fait, il affichera un message similaire au suivant:
Mettez donc à jour la liste des fournisseurs et alias dans 'config / app.php'
Courir
composer -o dumpautoload
Le "./app/MyApp/Facades/Helper.php" ressemblera à l'origine à ceci:
Maintenant, ajoutez simplement vos méthodes dans "./app/MyApp/Facades/Helper.php".
Voici à quoi ressemble "./app/MyApp/Facades/Helper.php" après avoir ajouté une fonction d'assistance.
Cette fonction attend un modèle et peut accepter un deuxième argument booléen facultatif.
Si l'URL actuelle correspond au modèle qui lui a été transmis, elle affichera 'active' (ou 'class = "active"' si vous ajoutez 'true' comme deuxième argument à l'appel de fonction).
Je l'utilise pour mettre en évidence le menu qui est actif.
Voici le code source de mon script. J'espère que vous le trouverez utile et faites-le moi savoir si vous avez des problèmes avec celui-ci.
la source
au lieu d'inclure votre classe d'assistance personnalisée, vous pouvez réellement ajouter à votre
config/app.php
fichier sous des alias.devrait ressembler à ceci.
puis à votre contrôleur, incluez l'assistant en utilisant la méthode 'use Helper' afin que vous puissiez simplement appeler une partie de la méthode sur votre classe d'assistance.
ou dans la vue des ressources, vous pouvez déjà appeler directement la classe Helper.
Mais c'est toujours l'approche de style de codage du développeur à suivre. Nous pouvons avoir différentes manières de résoudre les problèmes, et je veux juste partager ce que j'ai aussi pour les débutants.
la source
Créer un répertoire d'aide personnalisé: créez d'abord un répertoire d'aide dans le répertoire de l'application. Créer une définition de classe hlper: Créons maintenant une fonction d'assistance simple qui concaténera deux chaînes. Créez un nouveau fichier MyFuncs.php dans /app/Helpers/MyFuncs.php Ajoutez le code suivant
espace de noms App \ Helpers; définit l'espace de noms Helpers sous l'espace de noms App. La classe MyFuncs {…} définit la classe d'assistance MyFuncs. fonction statique publique full_name ($ first_name, $ last_name) {…} définit une fonction statique qui accepte deux paramètres de chaîne et renvoie une chaîne concaténée
Le service des aides fournit la classe
Les fournisseurs de services sont habitués à charger automatiquement les classes. Nous devrons définir un fournisseur de services qui chargera toutes nos classes d'assistance dans le répertoire / app / Helpers.
Exécutez la commande artisan suivante:
php artisan make: fournisseur HelperServiceProvider
Le fichier sera créé dans
/app/Providers/HelperServiceProvider.php
Ajoutez le code suivant:
ICI,
Nous devons maintenant enregistrer HelperServiceProvider et créer un alias pour nos assistants.
Ouvrir un
/config/app.php
fichierLocalisez la variable du tableau des fournisseurs
Ajoutez la ligne suivante
Localisez la variable de tableau d'alias
Ajoutez la ligne suivante
Enregistrez les modifications à l'aide de notre aide personnalisée
Nous allons créer un itinéraire qui appellera notre fonction d'assistance personnalisée Open /app/routes.php
Ajoutez la définition d'itinéraire suivante
ICI,
la source
Créez d'abord helpers.php dans le répertoire App \ Http. Ajoutez ensuite le code suivant dans le composer.json
Exécutez ensuite la commande suivante
Vous pouvez maintenant définir votre fonction personnalisée dans le fichier helpers.php.
la source
Une autre façon que j'ai utilisée était: 1) créé un fichier dans app \ FolderName \ fileName.php et avait ce code à l'intérieur c'est-à-dire
2) Après cela dans notre lame
c'est ça. et il fonctionne
la source
La meilleure pratique pour écrire des assistants personnalisés est
1) Dans le
app
répertoire de la racine du projet, créez un dossier nommé Helpers (juste pour séparer et structurer le code).2) Dans le dossier, écrivez des fichiers psr-4 ou des fichiers php normaux
Si les fichiers PHP sont au format psr-4, il sera automatiquement chargé, sinon ajoutez la ligne suivante dans le fichier composer.json qui se trouve dans le répertoire racine du projet
À l'intérieur de la
autoload
clé, créez une nouvelle clé nomméefiles
pour charger les fichiers au moment du chargement automatique, à l'intérieur de l'files
objet ajoutez le chemin à partir du répertoire de l'application., Voici un exemple.PS: essayez de lancer
composer dump-autoload
si le fichier n'est pas chargé.la source
Créez Helpers.php dans app / Helper / Helpers.php
Ajouter le compositeur et la mise à jour du compositeur
utiliser dans le contrôleur
utiliser dans le changement de vue dans le fichier config-> app.php
appeler en vue
la source
composer.json
est inutile, car le chargement automatique de psr-4 fera le travail.dans dir bootstrap \ autoload.php
ajouter ce fichier
la source
**
** créer un nouvel assistant
Utiliser pour le contrôleur et tout fichier d'affichage
la source
Dans laravel 5.3 et supérieur, l'équipe laravel a déplacé tous les fichiers procéduraux (
routes.php
) hors duapp/
répertoire, et leapp/
dossier entier estpsr-4
chargé automatiquement. La réponse acceptée fonctionnera dans ce cas, mais elle ne me semble pas juste.Donc ce que j'ai fait, c'est que j'ai créé un
helpers/
répertoire à la racine de mon projet et que j'ai mis les fichiers d'aide à l'intérieur, et dans moncomposer.json
fichier, j'ai fait ceci:De cette façon, mon
app/
répertoire est toujours un psr-4 chargé automatiquement, et les assistants sont un peu mieux organisés.J'espère que cela aide quelqu'un.
la source
Il y a quelques bonnes réponses ici mais je pense que c'est la plus simple. Dans Laravel 5.4 (et probablement dans les versions antérieures), vous pouvez créer une classe dans un endroit qui vous convient, par exemple App / Libraries / Helper.php
Ensuite, vous pouvez simplement l'appeler dans votre modèle de lame comme ceci:
Si vous ne voulez pas utiliser @inject, il vous suffit de rendre la fonction 'uppercasePara' statique et d'incorporer l'appel dans votre modèle de lame comme ceci:
Pas besoin d'alias. Laravel résout automatiquement la classe concrète.
la source