webentwicklung-frage-antwort-db.com.de

Best Practices für Laravel 4 Helfer und Grundfunktionen?

Ich versuche zu verstehen, an welcher Stelle eine globale Funktion am besten in Laravel= 4. Zum Beispiel Datumsformatierung. Ich halte das Erstellen einer Fassade nicht für sinnvoll, da die Fassaden zu modular sind. Ich habe Artikel über das Erstellen eines Bibliotheksordners und das Speichern von Klassen dort gelesen, aber für eine einfache Funktion scheint das auch eine Menge 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?

146
Jason Spick

Der hässliche, faule und schreckliche Weg: Fügen Sie am Ende von bootstrap/start.php Eine include('tools.php') hinzu 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 Ordner libraries in Ihrem Ordner app
  • Erstellen Sie Ihre Bibliotheksdatei, erstellen Sie eine Klasse darin und fügen Sie ihr statische Funktionen hinzu
  • Option 1: Bearbeiten Sie start/global.php, Um app_path().'/libraries' zum Array ClassLoader::addDirectories( Hinzuzufügen.
  • Option 2: Bearbeiten Sie composer.json, Um "app/libraries" Zum Array autoload hinzuzufügen. Führen Sie composer dump-autoload Aus
  • Rufen Sie Ihre Klassen- und statischen Funktionen aus Ihren Ansichten auf.

Informationen zu Ihren Optionen finden Sie in der Datei global.php

Zusätzlich zur Verwendung von Composer können Sie das Klassenladeprogramm Laravel verwenden, um Ihre Controller und Modelle zu laden. Dies ist nützlich, um alle Klassen im "globalen" Namespace zu belassen, ohne Composer zu aktualisieren.

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

233

Ich erstelle dazu einen neuen Ordner im Verzeichnis /app im Stammverzeichnis Ihres Laravel 4-Projekts. Fügen Sie diesen Ordner dann wie folgt zum ersten Array der Datei /app/start/global.php 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 im neuen Ordner /app/classes Ihrer Namensraumkonvention entspricht. Laravel 4 lädt automatisch alle Klassen/Dateien in diesem Ordner. Auf diese Weise müssen Sie keine composer Dateien durchsuchen oder composer Befehl.

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

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

<?php namespace Helpers;

class Helper {

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

Alles was Sie tun müssen, ist Helpers\Helper::helloWorld(); aufzurufen

Sie können diese Hilfsklasse auch in Ihrer /app/config/app.php -Datei aliasen. Fügen Sie einfach so etwas am Ende des aliases -Arrays hinzu:

'Helper'          => 'Helpers\Helper'
82
JasonMortonNZ

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

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

Ich erstelle kleine Klassen (ein paar Methoden pro Klasse, eine Zeile pro Methode, alles erweitert um etwas und DRY, das ist mein Ziel),

class ExtendedCarbon extends Carbon\Carbon {

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

}

speichere sie in app/libraries und füge sie composer.json hinzu:

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

Execute

composer dump

Und dann nutzen Sie sie einfach dort, wo Sie sie brauchen

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

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

Übrigens, ich bin mir sicher, dass es nur ein Beispiel war, aber Sie brauchen möglicherweise keinen Helfer, um Daten zu formatieren, da alle Daten in Laravel Instanzen von Carbon ( https://github.com/briannesbitt/Carbon ) und es gibt unzählige Methoden zum Formatieren von Datum und Uhrzeit.

Sie können View::share() auch zusammen mit Closures verwenden, um dies zu erreichen - ich habe gerade darüber gepostet: http://www.develophp.org/2014/07/laravel-4-blade-helper- Funktionen /

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

7
Franz