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

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

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

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

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

приложение / библиотеки / 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 \ Константы :: $ Langs.

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

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

РЕДАКТИРОВАТЬ # 01

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

Мой массив что-то вроде:

$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, это нормально? Или как еще я могу хранить эти данные? Что будет лучшим и семантически правильным способом?

Спасибо

67

Решение

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

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

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

Обновить

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

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

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

Category::all();

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

96

Другие решения

Для констант

Создайте файл constants.php в каталоге config: —

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 в каталоге config: —

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

17

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

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

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

use Illuminate\Support\Facades\Config;
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

2

Константы в Ларавеле

Приложение / constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

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

composer.json
добавить местоположение файла при автозагрузке в composer.json

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

Прежде чем это изменение вступит в силу, необходимо выполнить следующую команду в Терминале, чтобы восстановить файлы автозагрузки Laravel:

composer dump-autoload
2

Atleast в 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

1
По вопросам рекламы [email protected]