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

66

Я только начал работать с 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

Данные, которые я хочу передать всем контроллерам и представлениям, могут быть напрямую установлены в script, как в примере в начале моего сообщения, , но он также может быть сгенерирован динамически, из базы данных, например. Эти данные могут быть списком категорий. Мне нужны они во всех представлениях для создания навигационной панели, но мне также нужно, чтобы они определяли некоторые шаблоны маршрутизации (например, категорию/подкатегорию/продукт), а также анализировали некоторую информацию в нескольких контроллерах (например, получите информацию из категории, которая содержит 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...']
]

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

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

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

Спасибо

Теги:
laravel-4

6 ответов

89
Лучший ответ

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

Создайте новый файл в каталоге 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');

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

Update

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

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

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

Category::all();

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

  • 0
    Простой способ! Делать это так хорошо для «постоянных массивов», уже установленных в коде проекта. Но как насчет переменных или массивов, сгенерированных во время выполнения, к которым я хочу получить глобальный доступ из других источников? У меня есть некоторый базовый стартовый код в global.php, и там создаются некоторые переменные, которые мне понадобятся в некоторых контроллерах или представлениях. Есть ли способ установить значение этих переменных Config или даже создать новые во время выполнения?
  • 0
    Да, ты можешь. Я обновил ответ
Показать ещё 12 комментариев
15

Для констант

Создайте файл 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 автоматически включает все файлы конфигурации, поэтому нет необходимости в ручном режиме:)

  • 0
    Недоступно в некоторых консольных командах, таких как route:cache : Use of undefined constant ID - assumed 'ID'
6

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

// global contants for all requests
Route::group(['prefix' => ''], function() {
    define('USER_ROLE_ADMIN','1');
    define('USER_ROLE_ACCOUNT','2');
});
  • 0
    Если у меня есть большое количество констант, есть ли способ сохранить их в другом файле (ах) и затем включить их в функцию маршрута? Кроме того, что делает строка ['prefix' => '']? Я знаю, что это ассоциативный массив, но делает ли это константы доступными для всех маршрутов? Благодарю.
  • 1
    Ага ну разобрался с префиксной частью: laravel.com/docs/5.1/routing#route-group-prefixes
Показать ещё 3 комментария
2

Я думаю, что лучший способ - использовать локализацию.

Создайте новый файл messages.php в resources/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 локализация

  • 0
    Гениальное предложение!
1

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

use Illuminate\Support\Facades\Config;
  • 0
    Или просто используйте функцию config ().
0

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

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

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

\Config::get('privileged');

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню