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.php
Datei mit einigen deklarierten Konstanten und eine globals.php
Datei, 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?
quelle
config()
Helfer verwenden, anstatt ihnConfig::get()
jetzt zu verwenden.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 :)
quelle
route:cache
:Use of undefined constant ID - assumed 'ID'
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:
quelle
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'); });
quelle
Ich denke, der beste Weg ist die Lokalisierung.
Erstellen Sie eine neue Datei
messages.php
inresources/lang/en
(en
weil dies in my festgelegt istconfig/app
'locale'=>'en'
) und geben Sie ein Array aller Ihrer Werte zurückreturn [ '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
quelle
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;
quelle
Zumindest in Laravel 5.4 können Sie sie in Ihrem Konstruktor erstellen.
public function __construct() { \Config::set('privileged', array('user1','user2'); \Config::set('SomeOtherConstant', 'my constant'); }
Dann können Sie sie in Ihren Methoden so nennen;
\Config::get('privileged');
Besonders nützlich für statische Methoden im Modell usw.
Referenz auf Laracasts.com https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found
quelle
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
quelle