Laravel: Wo sollen globale Arrays Daten und Konstanten gespeichert werden?

82

Ich habe gerade angefangen mit Laravel zu arbeiten. Ich muss ein ganzes System, das ich vor einigen Jahren erstellt habe, neu schreiben und Laravel 4 als Basis-Framework verwenden. In meinem alten System hatte ich eine constant.phpDatei mit einigen deklarierten Konstanten und eine globals.phpDatei, die viele Array-Sets enthielt (z. B. Kategoriestatus, Ereignistyp, langs usw.). Auf diese Weise könnte ich so etwas gebrauchen

foreach ( $langs as $code => $domain ) {
    // Some stuff
}

überall in meiner App.

Meine Frage ist, wie ich diese Informationen auf die sogenannte "Laravel-Art" speichern kann. Ich habe versucht, diese Informationen mit einem Objekt zu speichern, als Service festzulegen und dafür eine Fassade zu erstellen:

app / library / Project / Constants.php

namespace PJ;

class Constants {

    public static $langs = [
            'es' => 'www.domain.es',
            'en' => 'www.domain.us',
            'uk' => 'www.domain.uk',
            'br' => 'www.domain.br',
            'it' => 'www.domain.it',
            'de' => 'www.domain.de',
            'fr' => 'www.domain.fr'
        ];
}

app / library / Project / ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

class ConstantsServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->singleton('PJConstants', function() {
            return new Constants;
        });
    }
}

app / library / Project / ConstantsFacade.php

namespace PJ;

use Illuminate\Support\Facades\Facade;

class ConstantsFacade extends Facade {
    protected static function getFacadeAccessor() { 
        return 'PJConstants';
    }
}

composer.json

"psr-4": {
     "PJ\\": "app/libraries/Project"
},

und so greife ich auf diese Eigenschaft als zu PJ\Constants::$langs.

Dies funktioniert, aber ich bezweifle, dass dies die effizienteste oder korrekteste Methode ist. Ich meine, ist es der richtige Weg, eine Variable zu "verbreiten", indem ein ganzer Dienstleister und Fassaden und all diese Dinge erstellt werden? Oder wo soll ich diese Daten ablegen?

Vielen Dank für jeden Rat.

EDIT # 01

Daten, die ich an alle Controller und Ansichten übergeben möchte, können direkt im Skript festgelegt werden, wie im Beispiel am Anfang meines Beitrags, aber sie können auch dynamisch generiert werden, beispielsweise aus einer Datenbank. Diese Daten können eine Liste von Kategorien sein. Ich benötige sie in allen Ansichten, um eine Navigationsleiste zu generieren, aber ich benötige sie auch, um einige Routing-Muster (wie /category/subcategory/product) zu definieren und um einige Informationen in mehreren Controllern zu analysieren (wie zum Beispiel Informationen aus der Kategorie abrufen, die das X-Produkt enthält).

Mein Array ist so etwas wie:

$categories = [
    1 => ['name' => 'General', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    2 => ['name' => 'Nature', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    3 => ['name' => 'World', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    4 => ['name' => 'Animals', 'parent' => 2, 'description' => 'Lorem ipsum...']
]

Nur als Beispiel. Index ist die ID der Kategorie, und der Wert ist die der Kategorie zugeordnete Information.

Ich benötige dieses Array auch, das in allen Controllern und Ansichten verfügbar ist.

Soll ich es also als Konfigurationsvariable speichern? Wie könnte ich diese Daten sonst speichern? Was wäre der beste und semantisch korrekte Weg?

Marco Madueño Mejía
quelle

Antworten:

117

Für die meisten Konstanten, die global in der Anwendung verwendet werden, ist es ausreichend, sie in Konfigurationsdateien zu speichern. Es ist auch ziemlich einfach

Erstellen Sie eine neue Datei im app/configVerzeichnis. Nennen wir esconstants.php

Dort müssen Sie ein Array von Konfigurationswerten zurückgeben.

return [
    'langs' => [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us'
        // etc
    ]
];

Und Sie können wie folgt darauf zugreifen

Config::get('constants.langs');
// or if you want a specific one
Config::get('constants.langs.en');

Und Sie können sie auch einstellen

Config::set('foo.bar', 'test');

Beachten Sie, dass die von Ihnen festgelegten Werte nicht beibehalten werden. Sie sind nur für die aktuelle Anfrage verfügbar.

Aktualisieren

Die Konfiguration ist wahrscheinlich nicht der richtige Ort zum Speichern von Informationen, die aus der Datenbank generiert wurden. Sie könnten einfach ein eloquentes Modell verwenden wie:

class Category extends Eloquent {
    // db table 'categories' will be assumed
}

Und fragen Sie alle Kategorien ab

Category::all();

Wenn das ganze Modell aus irgendeinem Grund nicht funktioniert, können Sie darüber nachdenken, eine eigene Klasse und eine Fassade zu erstellen. Oder Sie können einfach eine Klasse mit allen statischen Variablen und Methoden erstellen und sie dann ohne Fassadenmaterial verwenden.

lukasgeiter
quelle
Einfacher Weg! Dies zu tun ist gut für "konstante Arrays", die bereits im Projektcode festgelegt sind. Aber was ist mit Variablen oder Arrays, die zur Laufzeit generiert werden und auf die ich von überall aus global zugreifen möchte? Ich habe einen grundlegenden Startcode bei global.php und einige Variablen werden dort erstellt, die ich in einigen Controllern oder Ansichten benötigen werde. Gibt es eine Möglichkeit, den Wert dieser Konfigurationsvariablen festzulegen oder zur Laufzeit sogar neue zu erstellen?
Marco Madueño Mejía
Ich hätte nicht gedacht, dass es so einfach sein könnte. Ich werde es als Antwort markieren, aber ich habe einen letzten Zweifel daran. Eine dieser Variablen, die ich global zugänglich machen muss, enthält eine Reihe von Kategorien aus der Datenbank. Es ist für alle Ansichten erforderlich, da es für das Navigationsmenü verwendet wird, aber es ist auch in einigen Controllern und sogar für das Routing erforderlich. Ist es (semantisch gesehen) richtig, diese Art von Daten als Konfigurationsvariable zu speichern? Oder sollte ich es auf andere Weise aufbewahren?
Marco Madueño Mejía
2
@Corner seit 5.0 befindet sich das Konfigurationsverzeichnis direkt im Stammverzeichnis Ihres Projektverzeichnisses.
Lukasgeiter
4
Für Benutzer von Laravel 5 oder höher müssen Sie "use Config;" hinzufügen. in Ihrem Controller oder setzen Sie einen Schrägstrich in die Schriftart von Config wie folgt: \ Config :: get ('constants.langs');
Rotaercz
2
Sie können den config()Helfer verwenden, anstatt ihn Config::get()jetzt zu verwenden.
Leith
23

Für Konstanten

Erstellen Sie die Datei constants.php im Konfigurationsverzeichnis: -

define('YOUR_DEFINED_CONST', 'Your defined constant value!');

return [

'your-returned-const' => 'Your returned constant value!'

];

Sie können sie verwenden wie: -

echo YOUR_DEFINED_CONST . '<br>';

echo config('constants.your-returned-const');

Für statische Arrays

Erstellen Sie die Datei static_arrays.php im Konfigurationsverzeichnis: -

class StaticArray
{

    public static $langs = [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us',
        'uk' => 'www.domain.uk',
        'br' => 'www.domain.br',
        'it' => 'www.domain.it',
        'de' => 'www.domain.de',
        'fr' => 'www.domain.fr'
    ];

}

Sie können es verwenden wie: -

echo StaticArray::$langs['en'];

Hinweis: Laravel schließt alle Konfigurationsdateien automatisch ein, sodass kein manuelles Einschließen erforderlich ist :)

Gagandeep Gambhir
quelle
Nicht verfügbar in einigen Konsolenbefehlen wie route:cache:Use of undefined constant ID - assumed 'ID'
AliN11
13

Erstellen Sie eine Datei mit allgemeinen Konstanten in Laravel

app / constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

    //EX
    define('COLOR_TWO', 'red');

composer.json Dateispeicherort beim automatischen Laden in composer.json hinzufügen

"autoload": {
    "files": [
        "app/constants.php"
    ]
}

Bevor diese Änderung wirksam werden kann, müssen Sie den folgenden Befehl in Terminal ausführen, um die Autoload-Dateien von Laravel neu zu generieren:

composer dump-autoload
Parth Kharecha
quelle
1
Danke für das Teilen. Ich hatte das Autoloading vergessen: D
Channaveer Hakari
Es ist mir ein Vergnügen @ChannaveerHakari
Parth Kharecha
8

Für globale Konstanten in Laravel 5 rufe ich nicht gerne Config für sie auf. Ich definiere sie in der Routengruppe wie folgt:

// global contants for all requests
Route::group(['prefix' => ''], function() {
    define('USER_ROLE_ADMIN','1');
    define('USER_ROLE_ACCOUNT','2');
});
Mladen Janjetovic
quelle
Wenn ich eine große Anzahl von Konstanten habe, gibt es eine Möglichkeit, diese in anderen Dateien zu speichern und sie dann in die Routenfunktion aufzunehmen? Was macht die Zeile ['Präfix' => '']? Ich weiß, dass es sich um ein assoziatives Array handelt, aber sind dadurch die Konstanten für alle Routen verfügbar? Vielen Dank.
user3089840
1
Aha gut, ich habe den Präfix-Teil herausgefunden: laravel.com/docs/5.1/routing#route-group-prefixes
user3089840
Eine weitere Randnotiz, egal was ich mache, es scheint, dass PHPUnit es nicht mag. Wenn ich es auf Ihre Weise versuche, funktioniert im Browser alles einwandfrei, aber PHPUnit sagt mir, dass meine Konstanten bereits definiert sind, und das stimmt einfach nicht.
user3089840
Wenn Sie Ihre Konfigurationen zwischenspeichern, funktioniert das Definieren von Konstanten in ihnen nicht.
Nullen und Einsen
Tolle Idee, das Präfix zu verwenden
Arun Yokesh
4

Ich denke, der beste Weg ist die Lokalisierung.

Erstellen Sie eine neue Datei messages.phpin resources/lang/en( enweil dies in my festgelegt ist config/app 'locale'=>'en') und geben Sie ein Array aller Ihrer Werte zurück

return [
    'welcome' => 'Welcome to our application'
];

für Laravel 5.3 und darunter abzurufen

echo trans('messages.welcome');

oder

echo Lang::get('messages.welcome');

für 5.4 verwenden

echo __('messages.welcome') 

Laravel 5.0 Lokalisierung

oder

Laravel 5.4 Lokalisierung

Bill Stephen
quelle
Das ist richtig. Unterabfrage eines Neulings ist, wie man diese message.php-Datei liest und den Schlüsselwert als Array erhält? Ich möchte es als Array lesen und als JSON-Antwort für meine clientseitige Bibliothek senden, dh Angular JS, um bestimmte Zeichenfolgen zu verarbeiten.
Gopinath
2

Um die obige Antwort zu ergänzen, müssen Sie die Konfigurationsklasse einschließen, bevor Sie sie in Laravel 5.3 verwenden können

use Illuminate\Support\Facades\Config;
Jignesh Rawal
quelle
Oder verwenden Sie einfach die Funktion config ().
Ademers
0

Legen Sie einfach eine Datei constants.php in das Konfigurationsverzeichnis und definieren Sie Ihre Konstanten in dieser Datei. Diese Datei wird automatisch geladen und in Laravel 6+ getestet

Engr Syed Rowshan Ali
quelle