Laravel: Где хранить данные и константы глобальных массивов?

Я только начал работать с Laravel. Мне нужно переписать целую систему, которую я создал несколько лет назад, используя Laravel 4 в качестве базовой структуры. В моей старой системе я использую файл констант.php с объявленными константами и файл globals.php, содержащий множество наборов массивов (например, статусы категорий, типы событий, языки и т. Д.). Поступая таким образом, я мог бы использовать что-то вроде

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

где угодно в моем приложении.

Мой вопрос в том, как я могу хранить эту информацию в так называемом «laravel way». Я попытался использовать какой-то объект для хранения этой информации, установив это как сервис и создав для него фасад:

приложение / библиотеки / 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' ]; } 

приложение / библиотеки / Project / ConstantsServiceProvider.php

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

приложение / библиотеки / 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" }, 

и поэтому я обращаюсь к этому свойству как PJ \ Constants :: $ langs .

Это работает, но я сомневаюсь, что это самый эффективный / правильный способ сделать это. Я имею в виду, это правильный способ «размножать» переменную, создавая провайдера услуг и фасады и все такие вещи? Или где я должен помещать эти данные?

Спасибо за любой совет.

EDIT # 01

Данные, которые я хочу передать всем контроллерам и представлениям, могут быть напрямую заданы в скрипте, как в примере в начале моего сообщения, но он также может быть сгенерирован динамически из базы данных, например. Эти данные могут быть списком категорий. Мне нужны они во всех представлениях для создания навигационной панели, но мне также нужно, чтобы они определяли некоторые шаблоны маршрутизации (например, категорию / подкатегорию / продукт), а также анализировали некоторую информацию в нескольких контроллерах (например, получите информацию из категории, которая содержит X).

Мой массив выглядит примерно так:

 $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...'] ] 

Как пример. Индекс – это идентификатор категории, а Value – информация, связанная с категорией.

Мне нужен этот массив, также доступный во всех контроллерах и представлениях.

Итак, если я сохраню его как переменную Config, это нормально? Или как еще я могу хранить эти данные? Что было бы лучшим и семантически правильным способом?

благодаря

Для большинства констант, используемых глобально в приложении, достаточно хранить их в файлах конфигурации. Это также довольно просто

Создайте новый файл в каталоге app/config . Назовем его constants.php

Там вы должны вернуть массив значений конфигурации.

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

И вы можете получить к ним доступ следующим образом

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

И вы также можете установить их

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

Обратите внимание, что установленные вами значения не будут сохраняться. Они доступны только для текущего запроса.

Обновить

Конфигурация, вероятно, не подходит для хранения информации, сгенерированной из базы данных. Вы могли бы просто использовать Eloquent Model :

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

И запросить все категории

 Category::all(); 

Если вся модель по какой-то причине не работает, вы можете начать думать о создании своего собственного класса и фасада. Или вы можете просто создать класс со всеми статическими переменными и методами, а затем использовать его без фасадного материала.

Для констант

Создайте файл constants.php в каталоге конфигурации: –

 define('YOUR_DEFINED_CONST', 'Your defined constant value!'); return [ 'your-returned-const' => 'Your returned constant value!' ]; 

Вы можете использовать их как: –

 echo YOUR_DEFINED_CONST . '<br>'; echo config('constants.your-returned-const'); 

Для статических массивов

Создайте файл static_arrays.php в каталоге конфигурации: –

 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' ]; } 

Вы можете использовать его как: –

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

Примечание. Laravel автоматически включает все конфигурационные файлы, поэтому нет необходимости в ручном включении 🙂

Для глобальных констант в Laravel 5 мне не нравится называть Config для них. Я определяю их в группе Route следующим образом:

 // global contants for all requests Route::group(['prefix' => ''], function() { define('USER_ROLE_ADMIN','1'); define('USER_ROLE_ACCOUNT','2'); }); 

Я думаю, что лучший способ – использовать локализацию. создайте новый файл messages.php в ресурсах / lang / en (en, потому что это то, что установлено в моем config / app 'locale' => 'en') возвращает массив всех ваших значений

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

];

для получения для laravel 5.3 и ниже

 echo trans('messages.welcome') 

или

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

для использования 5.4

 echo __('messages.welcome') 

локализация laravel 5.0

или

laravel 5.4 локализация

Чтобы добавить к вышеуказанному ответу, вам нужно будет включить класс config, прежде чем вы сможете начать использовать его в Laravel 5.3

 use Illuminate\Support\Facades\Config; 

По крайней мере, в Laravel 5.4, в вашем конструкторе вы можете создать их;

 public function __construct() { \Config::set('privileged', array('user1','user2'); \Config::set('SomeOtherConstant', 'my constant); } 

Тогда вы можете называть их таким образом в своих методах;

 \Config::get('privileged'); 

Особенно полезен для статических методов в модели и т. Д.

Ссылка https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found