Właśnie zacząłem pracować z Laravelem. Muszę przepisać cały system, który zrobiłem kilka lat temu, używając Laravel 4 jako podstawy. W moim starym systemie miałem constant.php
plik z zadeklarowanymi stałymi i globals.php
plik, który zawierał wiele zestawów tablic (na przykład statusy kategorii, typy zdarzeń, języki itp.). Robiąc to, mógłbym użyć czegoś takiego
foreach ( $langs as $code => $domain ) {
// Some stuff
}
w dowolnym miejscu mojej aplikacji.
Moje pytanie brzmi, jak mogę przechowywać te informacje w tak zwany „laravel way”. Próbowałem użyć jakiegoś obiektu do przechowywania tych informacji, ustawiając to jako usługę i tworząc dla niego fasadę:
app / libraries / 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 / libraries / 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 / libraries / 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"
},
więc mam dostęp do tej właściwości jako PJ\Constants::$langs
.
To działa, ale wątpię, czy jest to najbardziej efektywny lub poprawny sposób na zrobienie tego. Chodzi mi o to, czy jest to właściwy sposób na „propagowanie” zmiennej poprzez tworzenie całego usługodawcy, fasad i tego typu rzeczy? Albo gdzie mam umieścić te dane?
Dzięki za każdą radę.
EDYCJA # 01
Dane, które chcę przekazać do wszystkich kontrolerów i widoków można ustawić bezpośrednio w skrypcie, jak w przykładzie na początku mojego wpisu, ale można je też generować dynamicznie, np. Z bazy danych. Te dane mogą być listą kategorii. Potrzebuję ich we wszystkich widokach, aby wygenerować pasek nawigacji, ale potrzebuję ich również do zdefiniowania niektórych wzorców routingu (takich jak /category/subcategory/product
), a także do przeanalizowania niektórych informacji w kilku kontrolerach (na przykład uzyskanie informacji z kategorii, która zawiera produkt X).
Moja tablica to coś takiego:
$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...']
]
Jako przykład. Indeks to identyfikator kategorii, a wartość to informacje skojarzone z kategorią.
Potrzebuję tej tablicy, również dostępnej we wszystkich kontrolerach i widokach.
Czy powinienem zatem zapisać go jako zmienną konfiguracyjną? Jak inaczej mógłbym przechowywać te dane; jaki byłby najlepszy i poprawny semantycznie sposób?
źródło
config()
pomocnika zamiast używaćConfig::get()
teraz.Dla stałych
Utwórz plik constants.php w katalogu konfiguracyjnym: -
define('YOUR_DEFINED_CONST', 'Your defined constant value!'); return [ 'your-returned-const' => 'Your returned constant value!' ];
Możesz ich używać jak: -
echo YOUR_DEFINED_CONST . '<br>'; echo config('constants.your-returned-const');
Dla tablic statycznych
Utwórz plik static_arrays.php w katalogu konfiguracyjnym: -
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' ]; }
Możesz go używać tak, jak: -
echo StaticArray::$langs['en'];
Uwaga: Laravel automatycznie dołącza wszystkie pliki konfiguracyjne, więc nie ma potrzeby ręcznego dołączania :)
źródło
route:cache
:Use of undefined constant ID - assumed 'ID'
app / constants.php
define('YOUR_CONSTANT_VAR', 'VALUE'); //EX define('COLOR_TWO', 'red');
composer.json dodaj lokalizację pliku podczas automatycznego ładowania w pliku composer.json
"autoload": { "files": [ "app/constants.php" ] }
Zanim ta zmiana zacznie obowiązywać, musisz uruchomić następujące polecenie w Terminalu, aby zregenerować pliki automatycznego ładowania Laravel:
źródło
W przypadku stałych globalnych w Laravel 5 nie lubię wywoływać dla nich Config. Definiuję je w grupie Route w ten sposób:
// global contants for all requests Route::group(['prefix' => ''], function() { define('USER_ROLE_ADMIN','1'); define('USER_ROLE_ACCOUNT','2'); });
źródło
Myślę, że najlepszym sposobem jest użycie lokalizacji.
Utwórz nowy plik
messages.php
wresources/lang/en
(en
ponieważ tak jest w moimconfig/app
'locale'=>'en'
) zwróć tablicę wszystkich wartościreturn [ 'welcome' => 'Welcome to our application' ];
pobrać dla laravel 5.3 i niższych
echo trans('messages.welcome');
lub
echo Lang::get('messages.welcome');
do 5,4 użycia
echo __('messages.welcome')
Lokalizacja laravel 5.0
lub
Lokalizacja laravel 5.4
źródło
Aby dodać do powyższej odpowiedzi, będziesz musiał dołączyć klasę config, zanim zaczniesz jej używać w Laravel 5.3
use Illuminate\Support\Facades\Config;
źródło
Co najmniej w Laravel 5.4 możesz je tworzyć w swoim konstruktorze;
public function __construct() { \Config::set('privileged', array('user1','user2'); \Config::set('SomeOtherConstant', 'my constant'); }
Następnie możesz nazwać je w ten sposób w swoich metodach;
\Config::get('privileged');
Szczególnie przydatne w przypadku metod statycznych w modelu itp.
Odniesienie na Laracasts.com https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found
źródło
Po prostu umieść plik constants.php w katalogu konfiguracyjnym i zdefiniuj swoje stałe w tym pliku, plik zostanie automatycznie załadowany, przetestowany w Laravel 6+
źródło