Best Practices für Laravel 4-Helfer und Grundfunktionen?


152

Ich versuche zu verstehen, wo eine globale Funktion am besten in Laravel 4 eingefügt werden kann. Zum Beispiel die Datumsformatierung. Ich denke nicht, dass es sich lohnt, eine Fassade zu bauen, da die Fassaden zu modular sind. Ich habe Artikel über das Erstellen eines Bibliotheksordners und das Speichern von Klassen dort gelesen, aber das scheint auch für eine einfache Funktion viel zu sein. Sollte ein solches Tool nicht in Blade-Vorlagen verfügbar sein?

Was sind die Best Practices für so etwas und wie stelle ich es Blade-Vorlagen zur Verfügung?

Antworten:


233

Der hässliche, faule und schreckliche Weg: Fügen Sie am Ende bootstrap/start.phpeine hinzu include('tools.php')und platzieren Sie Ihre Funktion in dieser neuen Datei.

Der saubere Weg: Erstellen Sie eine Bibliothek. Auf diese Weise wird es NUR dann automatisch geladen, wenn Sie es tatsächlich verwenden.

  • Erstellen Sie einen librariesOrdner in Ihrem appOrdner
  • Erstellen Sie Ihre Bibliotheksdatei, erstellen Sie eine Klasse darin und fügen Sie statische Funktionen hinzu
  • Option 1 : Bearbeiten start/global.php, um app_path().'/libraries'es dem ClassLoader::addDirectories( Array hinzuzufügen .
  • Option 2 : Bearbeiten composer.json, um "app/libraries"es dem autoloadArray hinzuzufügen . Laufcomposer dump-autoload
  • Rufen Sie Ihre Klassen- und statischen Funktionen aus Ihren Ansichten auf.

Informationen zu Ihren Optionen, zitiert aus der global.phpDatei

Zusätzlich zur Verwendung von Composer können Sie den Laravel-Klassenlader zum Laden Ihrer Controller und Modelle verwenden. Dies ist nützlich, um alle Ihre Klassen im "globalen" Namespace zu belassen, ohne dass Composer aktualisiert wird.

Sie können beide Optionen kombinieren, wobei der Laravel-Klassenlader automatisch nach Klassen in den registrierten Verzeichnissen sucht ( Option 1 , einfacher) und Composer alle Klassen aufzeichnet, jedoch erst, nachdem Sie sie aktualisiert haben ( Option 2 kann die Leistung verbessern).


3
Ich denke, Sie müssen auch app_path().'/library'in start / global.php platzieren.
Alexandre Butynski

2
@AlexandreButynski Guter Punkt. Auf diese Weise können Sie Bibliotheken hinzufügen, ohne den Composer jedes Mal aktualisieren zu müssen. Ich habe meinen Beitrag bearbeitet, um dies hinzuzufügen.
Alexandre Danault

Also erstelle ich eine Klasse namens IDK ... SiteHelpers und definiere dann eine Methode formatDate. und dann sollte ich in der Vorlage SiteHelpers :: formatDate ($ date) ausführen können?
Jason Spick

@ JasonSpick Ja, und stellen Sie sicher, dass Sie Ihre Datei benennensitehelpers.php
Alexandre Danault

3
Warum müssen Sie es sowohl zum Autoload des Komponisten als auch zur Datei global.php hinzufügen?
CashIsClay

82

Dazu erstelle ich einen neuen Ordner im /appVerzeichnis im Stammverzeichnis Ihres Laravel 4-Projekts. Fügen Sie dann diesen Ordner wie folgt zum ersten Array der /app/start/global.phpDatei hinzu:

<?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.

));

Solange die Ordnerstruktur innerhalb des neuen /app/classesOrdners Ihrer Namespace-Konvention entspricht. Laravel 4 lädt automatisch alle Klassen / Dateien in diesem Ordner. Auf diese Weise müssen Sie keine Composer-Dateien durchsuchen oder den Composer-Befehl ausführen.

Ich bin mir nicht sicher, ob dies die beste Vorgehensweise ist, aber es funktioniert auf jeden Fall.

Wenn Sie eine einfache Datei mit dem folgenden Namen erstellt /app/classes/Helpers/Helper.phphaben:

<?php namespace Helpers;

class Helper {

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

Sie müssten nur anrufen Helpers\Helper::helloWorld();

Sie können diese Hilfsklasse auch als Alias ​​in Ihrer /app/config/app.phpDatei verwenden. Fügen Sie einfach so etwas am Ende des aliasesArrays hinzu:

'Helper'          => 'Helpers\Helper'

4
Ich mag diesen Weg, weil Sie sich nicht mit irgendetwas Komponistischem vermischen müssen, einer sauberen und noblen Lösung. +1
Gadoma

3
Wenn Sie Ihre Hilfsklasse zu Ihrer app.php-Datei hinzufügen, können Sie jetzt direkt wie folgt auf die Klasse zugreifen: Helper :: hellowWorld ();
Helmut Granda

sollte der Helfer eine Klasse sein? Kann ich hier eine einfache Funktion definieren?
Webinan

2
Dies funktioniert nicht, wenn Sie die Datei
composer.json

1
Tolle Lösung. Wie Rommy sagt, vergiss nicht zu rennen composer dump-autoload- ich habe es getan und 20 Minuten damit verbracht, meinen Kopf zu kratzen.
al_manchester

25

Die helpers.php-Methode von Laravel besteht darin, sie Ihren "Dateien" in composer.json ( https://github.com/laravel/framework/blob/master/composer.json ) hinzuzufügen :

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

Was ich mache, ist kleine Klassen zu erstellen (ein paar Methoden pro Klasse, eine Zeile pro Methode, alles erweitert von etwas und DRY, das ist mein Ziel),

class ExtendedCarbon extends Carbon\Carbon {

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

}

Speichern Sie sie in App / Bibliotheken und fügen Sie sie zu composer.json hinzu:

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

Ausführen

composer dump

Und dann verwenden Sie sie einfach, wo immer Sie brauchen

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

Sehen Sie sich dieses Video zum Refactoring an: http://www.youtube.com/watch?v=DC-pQPq0acs

Ich bin mir übrigens sicher, dass dies nur ein Beispiel war, aber Sie benötigen möglicherweise keinen Helfer zum Formatieren von Daten, da alle Daten in Laravel Instanzen von Carbon sind ( https://github.com/briannesbitt/Carbon ) und Es gibt viele Methoden zum Formatieren von Datum und Uhrzeit.


Ich bin selbst kein so großer Fan von statischen Methoden und versuche, bei Bedarf Instanzmethoden zu verwenden. Bug Ich bin mir ziemlich sicher, dass Sie im Falle einer solchen Verwendung viel besser formatDDMMAAAA()als haben würden static.
XedinUnknown

7

Sie können dies auch View::share()zusammen mit Verschlüssen verwenden - ich habe gerade darüber geschrieben: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Zusätzlicher Vorteil: Sie müssen keine zusätzliche Klasse erstellen und den globalen Namespace sauber halten.


Ich mag diesen Ansatz. Mehr Rail-ish. Könnten wir einige der View-Helper-Methoden innerhalb eines Merkmals hinzufügen und sie in der Blade-Ansicht verfügbar machen?
Bibstha

Ich denke nicht, dass das mit PHP möglich ist, um ehrlich zu sein.
Franz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.