Ich möchte Hilfsfunktionen erstellen, um zu vermeiden, dass Code zwischen Ansichten in Laravel 5 wiederholt wird:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Sie sind im Grunde Textformatierungsfunktionen. Wo und wie kann ich mit diesen Funktionen eine Datei erstellen?
php
laravel
laravel-5
laravel-helper
Calebe Oliveira
quelle
quelle
Benutzerdefinierte Klassen in Laravel 5, der einfache Weg
Diese Antwort gilt für allgemeine benutzerdefinierte Klassen in Laravel. Eine weitere Blade-spezifische Antwort finden Sie unter Benutzerdefinierte Blade-Anweisungen in Laravel 5 .
Schritt 1: Erstellen Sie Ihre Helferdatei (oder eine andere benutzerdefinierte Klasse) und geben Sie ihr einen passenden Namespace. Schreiben Sie Ihre Klasse und Methode:
Schritt 2: Erstellen Sie einen Alias:
Schritt 3: Führen Sie
composer dump-autoload
das Projektstammverzeichnis ausSchritt 4: Verwenden Sie es in Ihrer Blade-Vorlage:
Zusätzliches Guthaben: Verwenden Sie diese Klasse an einer beliebigen Stelle in Ihrer Laravel-App:
Quelle: http://www.php-fig.org/psr/psr-4/
Warum es funktioniert: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
Woher das automatische Laden stammt von: http://php.net/manual/en/language.oop5.autoload.php
quelle
aliases
Array hinzufügen inapp/config.php
:'Helper' => App\Helpers\Helper::class,
Dann könnten SieHelper::prettyJson();
Blade ganz gut aufrufen .Mein erster Gedanke war auch das Autoload des Komponisten, aber es fühlte sich für mich nicht sehr laravelisch an. L5 nutzt Service Provider in hohem Maße. Sie sind das, was Ihre Anwendung bootstraps.
Zu Beginn habe ich in meinem
app
Verzeichnis einen Ordner namens erstelltHelpers
. Dann innerhalb derHelpers
ich Ordners Dateien für Funktionen hinzugefügt, ich hinzufügen wollte. Wenn wir einen Ordner mit mehreren Dateien haben, können wir vermeiden, dass eine große Datei zu lang und nicht mehr verwaltbar ist.Als nächstes habe ich eine erstellt,
HelperServiceProvider.php
indem ich den handwerklichen Befehl ausgeführt habe:Innerhalb der
register
Methode habe ich dieses Snippet hinzugefügtZuletzt registrieren Sie den Dienstanbieter in Ihrem
config/app.php
im Anbieter-ArrayJetzt jede Datei in Ihrem
Helpers
Verzeichnis geladen und ist einsatzbereit.UPDATE 22.02.2016
Hier gibt es viele gute Optionen, aber wenn meine Antwort für Sie funktioniert, habe ich ein Paket erstellt, um auf diese Weise Helfer einzubeziehen. Sie können das Paket entweder als Inspiration verwenden oder es auch mit Composer herunterladen. Es hat einige eingebaute Helfer, die ich oft benutze (die aber standardmäßig alle inaktiv sind) und ermöglicht es Ihnen, Ihre eigenen benutzerdefinierten Helfer mit einem einfachen Artisan-Generator zu erstellen. Es behandelt auch den Vorschlag eines Responders, einen Mapper zu verwenden, und ermöglicht es Ihnen, die benutzerdefinierten Helfer, die geladen werden sollen, explizit zu definieren oder standardmäßig automatisch alle PHP-Dateien in Ihr Hilfsverzeichnis zu laden. Feedback und PRs werden sehr geschätzt!
Github: browner12 / helfer
quelle
start.php
Datei registriert habe (was nicht großartig war, aber seinen Zweck für die Zeit erfüllt hat). Haben Sie einen weiteren Vorschlag zum Laden mehrerer Dateien?Dies wird
JeffreyWay
in dieser Laracasts-Diskussion vorgeschlagen .app/Http
Erstellen Sie in Ihrem Verzeichnis einehelpers.php
Datei und fügen Sie Ihre Funktionen hinzu.composer.json
innerhalb desautoload
Blocks hinzu"files": ["app/Http/helpers.php"]
.composer dump-autoload
.quelle
app/helpers.php
oderapp/Helpers/
scheint ein besserer Ort zu sein.composer dump-autoload
?composer dump-autoload
Nachdem ich eine Vielzahl von Antworten auf SO und Google durchgesehen hatte, konnte ich immer noch keinen optimalen Ansatz finden. Die meisten Antworten deuten darauf hin, dass wir die Anwendung verlassen und uns bei der Ausführung auf das Tool Composer eines Drittanbieters verlassen. Ich bin jedoch nicht davon überzeugt, dass die Kopplung an ein Tool nur zum Einfügen einer Datei sinnvoll ist.
Die Antwort von Andrew Brown kam meiner Meinung nach am nächsten, aber (zumindest in 5.1) ist der Schritt des Dienstanbieters nicht erforderlich. Heisians Antwort hebt hervor, wessen Verwendung
PSR-4
uns einen Schritt näher bringt. Hier ist meine endgültige Implementierung für Helfer in Ansichten:Erstellen Sie zunächst eine beliebige Hilfedatei in Ihrem Apps-Verzeichnis mit einem Namespace:
Als nächstes alias Ihre Klasse in
config\app.php
, imaliases
Array:Und das sollte alles sein, was Sie tun müssen.
PSR-4
und der Alias sollte den Helfer Ihren Ansichten aussetzen, also in Ihrer Ansicht, wenn Sie Folgendes eingeben:Es sollte Folgendes ausgeben:
quelle
{!! bob() !!}
.bob()
wirklich global zu werden, wäre keine kluge Sache. Namespaces gibt es aus einem Grund und wir sollten nichtbob()
neben Basis-PHP-Funktionen aufrufen . Ich werde Ihr Aliasing-Bit zu meinem Code hinzufügen - danke!extends Helper
? Es scheint mir nicht notwendig zu sein.extends Helper
ist ja nicht nötig. Danke für die Warnung.Benutzerdefinierte Blade-Richtlinien in Laravel 5
Ja, da ist noch einer Weg!
Schritt 1: Registrieren Sie eine benutzerdefinierte Blade-Direktive:
Schritt 2: Verwenden Sie Ihre benutzerdefinierte Blade-Direktive:
Ausgänge:
DAS IST MEINE BENUTZERDEFINIERTE KLINGENRICHTLINIE !!
Benutzerdefinierten Link
Quelle: https://laravel.com/docs/5.1/blade#extending-blade
Zusätzliche Lektüre: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
Wenn Sie lernen möchten, wie Sie am besten benutzerdefinierte Klassen erstellen, die Sie überall verwenden können, lesen Sie Benutzerdefinierte Klassen in Laravel 5, auf einfache Weise
quelle
Dies ist meine HelpersProvider.php-Datei:
Sie sollten einen Ordner erstellen, der
Helpers
unter dem Ordner aufgerufen wirdapp
, dann eine Datei mit dem Namenwhatever.php
inside erstellen und die Zeichenfolgewhatever
im Array $ helpers hinzufügen .Erledigt!
Bearbeiten
Ich verwende diese Option nicht mehr. Derzeit verwende ich Composer, um statische Dateien wie Helfer zu laden.
Sie können die Helfer direkt hinzufügen unter:
quelle
glob()
Andrew Brown geschrieben hat? Wenn Sie in der Lage sein möchten, die Dateien anzugeben, die Sie einschließen möchten, geben Sie die Dateien an,composer.json
um sie automatisch zu laden, wie Joseph Silber es geschrieben hat. Warum bevorzugen Sie diese Lösung? Ich sage nicht, dass dies eine schlechte Lösung ist, ich bin nur neugierig.composer.json
nur durch zwei Punkte. Erstens wird die Zuordnung in der Anwendung selbst und nicht in einer Metadatendatei gespeichert. Zweitens müssen Sie nichtcomposer dump-autoload
jedes Mal neu ausführen, wenn Sie die Liste der zu ladenden Dateien ändern.include
oderrequire
, Laravel hat bereits PSR-4 Autoloading eingebautFür benutzerdefinierte Hilfsbibliotheken in meinem Laravel-Projekt habe ich einen Ordner mit dem Namen
Libraries
in meinem erstelltLaravel/App
Verzeichnis erstellt und im Verzeichnis Bibliotheken verschiedene Dateien für verschiedene Hilfsbibliotheken erstellt.Nachdem ich meine Hilfsdateien erstellt habe, füge ich einfach alle diese Dateien wie folgt in meine composer.json- Datei ein
und ausführen
quelle
composer dump-autoload
undcomposer dumpautoload
funktioniert auch infactcomposer du
wird auch funktionieren ...Da fragte OP nach Best Practices , fehlen uns hier noch einige gute Ratschläge.
Eine einzelne helpers.php- Datei ist keine gute Praxis. Erstens, weil Sie viele verschiedene Arten von Funktionen mischen und somit gegen die guten Codierungsprinzipien sind. Darüber hinaus könnte dies nicht nur die Codedokumentation, sondern auch die Codemetriken wie Cyclomatic Complexity , Maintainability Index und Halstead Volume beeinträchtigen . Je mehr Funktionen Sie haben, desto schlimmer wird es.
Code Dokumentation wäre Ok - Tools wie mit phpDocumentor , aber unter Verwendung von Sami es kein Verfahren Dateien übertragen werden . Die Laravel-API-Dokumentation ist ein solcher Fall - es gibt keine Dokumentation zu Hilfsfunktionen : https://laravel.com/api/5.4
Codemetriken können mit Tools wie PhpMetrics analysiert werden . Wenn Sie PhpMetrics Version 1.x zur Analyse des Laravel 5.4-Framework-Codes verwenden, erhalten Sie sehr schlechte CC / MI / HV-Metriken für src / Illuminate / Foundation / helpers.php und src / Illuminate / Support / helpers.php Dateien .
Mehrere kontextbezogene Hilfsdateien (z. B. string_helpers.php , array_helpers.php usw.) würden diese fehlerhaften Metriken sicherlich verbessern, was zu einer einfacheren Verwaltung des Codes führen würde. Abhängig vom verwendeten Codedokumentationsgenerator wäre dies gut genug.
Es kann weiter verbessert werden, indem Hilfsklassen mit statischen Methoden verwendet werden, sodass sie mithilfe von Namespaces kontextualisiert werden können. Genau wie Laravel es schon mit
Illuminate\Support\Str
undIlluminate\Support\Arr
Klassen macht. Dies verbessert sowohl die Codemetrik / Organisation als auch die Dokumentation. Klassen-Aliase könnten verwendet werden, um ihre Verwendung zu vereinfachen.Die Strukturierung mit Klassen verbessert die Organisation und Dokumentation des Codes, aber andererseits verlieren wir diese großen kurzen und leicht zu merkenden globalen Funktionen. Wir können diesen Ansatz weiter verbessern, indem wir Funktionsaliasnamen für diese statischen Klassenmethoden erstellen. Dies kann entweder manuell oder dynamisch erfolgen.
Laravel verwendet intern den ersten Ansatz, indem Funktionen in den prozeduralen Hilfsdateien deklariert werden, die den statischen Klassenmethoden zugeordnet sind. Dies ist möglicherweise nicht die ideale Sache, da Sie alle Dinge (Dokumentblöcke / Argumente) neu deklarieren müssen.
Ich persönlich verwende einen dynamischen Ansatz mit einer
HelperServiceProvider
Klasse, die diese Funktionen in der Ausführungszeit erstellt:Man kann sagen, dass dies über das Engineering hinausgeht, aber ich denke nicht. Es funktioniert ziemlich gut und kostet entgegen den Erwartungen keine relevante Ausführungszeit, zumindest bei Verwendung von PHP 7.x.
quelle
Hier ist ein Bash-Shell-Skript, das ich erstellt habe, um Laravel 5-Fassaden sehr schnell zu erstellen.
Führen Sie dies in Ihrem Laravel 5-Installationsverzeichnis aus.
Nennen Sie es so:
Beispiel:
Wenn Sie dieses Beispiel ausführen, wird es die Verzeichnisse erstellen
Facades
undProviders
unter ‚your_laravel_installation_dir / app / MyApp‘.Es werden die folgenden 3 Dateien erstellt und auf dem Bildschirm ausgegeben:
Danach wird eine Meldung angezeigt, die der folgenden ähnelt:
Aktualisieren Sie daher die Liste der Anbieter und Alias in 'config / app.php'.
Lauf
composer -o dumpautoload
Die "./app/MyApp/Facades/Helper.php" sieht ursprünglich so aus:
Fügen Sie jetzt einfach Ihre Methoden in "./app/MyApp/Facades/Helper.php" hinzu.
So sieht "./app/MyApp/Facades/Helper.php" aus, nachdem ich eine Hilfsfunktion hinzugefügt habe.
Diese Funktion erwartet ein Muster und kann ein optionales zweites boolesches Argument akzeptieren.
Wenn die aktuelle URL mit dem an sie übergebenen Muster übereinstimmt, wird 'active' ausgegeben (oder 'class = "active"', wenn Sie dem Funktionsaufruf 'true' als zweites Argument hinzufügen).
Ich benutze es, um das aktive Menü hervorzuheben.
Unten ist der Quellcode für mein Skript. Ich hoffe, Sie finden es nützlich und lassen Sie mich wissen, wenn Sie Probleme damit haben.
quelle
Anstatt Ihre benutzerdefinierte Hilfsklasse einzuschließen, können Sie Ihre
config/app.php
Datei auch unter Aliasnamen hinzufügen .sollte so aussehen.
Fügen Sie dann Ihrem Helfer den Helper mit der Methode 'use Helper' hinzu, damit Sie einfach einen Teil der Methode in Ihrer Helper-Klasse aufrufen können.
In der Ressourcenansicht können Sie die Helper-Klasse bereits direkt aufrufen.
Dies ist jedoch immer noch der Ansatz des Entwicklercodierungsstils. Wir haben möglicherweise verschiedene Möglichkeiten, Probleme zu lösen, und ich möchte nur mitteilen, was ich auch für Anfänger habe.
quelle
Benutzerdefiniertes Helferverzeichnis erstellen : Erstellen Sie zuerst das Helferverzeichnis im App-Verzeichnis. Erstellen einer hlper-Klassendefinition: Erstellen Sie jetzt eine einfache Hilfsfunktion , die zwei Zeichenfolgen verkettet. Erstellen Sie eine neue Datei MyFuncs.php in /app/Helpers/MyFuncs.php. Fügen Sie den folgenden Code hinzu
Namespace App \ Helpers; Definiert den Helpers-Namespace unter App-Namespace. Klasse MyFuncs {…} definiert die Hilfsklasse MyFuncs. öffentliche statische Funktion full_name ($ first_name, $ last_name) {…} definiert eine statische Funktion, die zwei Zeichenfolgenparameter akzeptiert und eine verkettete Zeichenfolge zurückgibt
Helfer Service bieten Klasse
Dienstanbieter werden zum automatischen Laden von Klassen verwendet. Wir müssen einen Dienstanbieter definieren, der alle unsere Hilfsklassen in das Verzeichnis / app / Helpers lädt.
Führen Sie den folgenden Handwerkerbefehl aus:
PHP Artisan machen: Anbieter HelperServiceProvider
Die Datei wird in erstellt
/app/Providers/HelperServiceProvider.php
Fügen Sie den folgenden Code hinzu:
HIER,
Wir müssen jetzt den HelperServiceProvider registrieren und einen Alias für unsere Helfer erstellen.
/config/app.php
Datei öffnenSuchen Sie die Array-Variable des Anbieters
Fügen Sie die folgende Zeile hinzu
Suchen Sie die Aliase-Array-Variable
Fügen Sie die folgende Zeile hinzu
Speichern Sie die Änderungen mit unserem benutzerdefinierten Helfer
Wir werden eine Route erstellen, die unsere benutzerdefinierte Hilfsfunktion Open /app/routes.php aufruft
Fügen Sie die folgende Routendefinition hinzu
HIER,
quelle
Erstellen Sie zuerst die Datei helpers.php im Verzeichnis App \ Http. Fügen Sie dann den folgenden Code in die Datei composer.json ein
Führen Sie als nächstes den folgenden Befehl aus
Jetzt können Sie Ihre benutzerdefinierte Funktion in der Datei helpers.php definieren.
quelle
Eine andere Möglichkeit, die ich verwendet habe, war: 1) eine Datei in app \ FolderName \ fileName.php erstellt und diesen Code darin enthalten, dh
2) Danach in unserer Klinge
das ist es. und es funktioniert
quelle
Best Practice zum Schreiben von benutzerdefinierten Helfern ist
1)
app
Erstellen Sie im Verzeichnis des Projektstamms einen Ordner mit dem Namen Helpers (nur um den Code zu trennen und zu strukturieren).2) Schreiben Sie in den Ordner psr-4-Dateien oder normale PHP-Dateien
Wenn die PHP-Dateien das Format psr-4 haben, werden sie automatisch geladen. Andernfalls fügen Sie die folgende Zeile in die Datei composer.json ein, die sich im Projektstammverzeichnis befindet
autoload
Erstellen Sie innerhalb des Schlüssels einen neuen Schlüssel mit dem Namenfiles
zum Laden von Dateien zum Zeitpunkt des automatischen Ladens. Fügen Sie innerhalb desfiles
Objekts den Pfad ab dem App-Verzeichnis hinzu. Hier ein Beispiel.PS: Versuchen Sie es,
composer dump-autoload
wenn die Datei nicht geladen wurde.quelle
Erstellen Sie Helpers.php in app / Helper / Helpers.php
Fügen Sie in Composer und Composer Update hinzu
Verwendung in Controller
Verwenden Sie in der Ansicht Änderung in der Datei config-> app.php
Anruf in Sicht
quelle
composer.json
nutzlos, da das automatische Laden von psr-4 die Aufgabe übernimmt.in dir bootstrap \ autoload.php
Fügen Sie diese Datei hinzu
quelle
** **.
** Neuen Helfer erstellen
Verwendung für den Controller und jede Ansichtsdatei
quelle
In Laravel 5.3 und höher hat das Laravel-Team alle prozeduralen Dateien (
routes.php
) aus demapp/
Verzeichnis verschoben , und der gesamteapp/
Ordner wird automatisch geladenpsr-4
. Die akzeptierte Antwort wird in diesem Fall funktionieren, aber es fühlt sich für mich nicht richtig an.Also habe ich ein
helpers/
Verzeichnis im Stammverzeichnis meines Projekts erstellt und die Hilfedateien darin abgelegt, und in meinercomposer.json
Datei habe ich Folgendes getan:Auf diese Weise meine
app/
Verzeichnis immer noch ein automatisch geladenes psr-4-Verzeichnis, und die Helfer sind etwas besser organisiert.Hoffe das hilft jemandem.
quelle
Hier gibt es einige gute Antworten, aber ich denke, das ist die einfachste. In Laravel 5.4 (und wahrscheinlich auch in früheren Versionen) können Sie eine Klasse an einem für Sie geeigneten Ort erstellen, z. B. App / Libraries / Helper.php
Dann können Sie es einfach in Ihrer Blade-Vorlage folgendermaßen aufrufen:
Wenn Sie @inject nicht verwenden möchten, machen Sie einfach die Funktion 'uppercasePara' als statisch und binden Sie den Aufruf wie folgt in Ihre Blade-Vorlage ein:
Keine Notwendigkeit für Aliase. Laravel löst die konkrete Klasse automatisch auf.
quelle