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 \ Constants:: $ 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, это нормально? Или как еще я могу хранить эти данные? Что будет лучшим и семантически правильным способом?
Спасибо
9 ответов
Для большинства констант, используемых глобально в приложении, достаточно сохранить их в файлах конфигурации. Это также довольно просто
Создайте новый файл в 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 в каталоге 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 автоматически включает все конфигурационные файлы, поэтому нет необходимости в ручном включении:)
Константы в Ларавеле
Приложение / 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
Что касается глобальных констант в Laravel 5, мне не нравится вызывать для них Config. Я определяю их в группе маршрутов следующим образом:
// global contants for all requests
Route::group(['prefix' => ''], function() {
define('USER_ROLE_ADMIN','1');
define('USER_ROLE_ACCOUNT','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')
или же
Создайте класс констант:
<?php
namespace App\Support;
class Constants {
/* UNITS */
public const UNIT_METRIC = 0;
public const UNIT_IMPERIAL = 1;
public const UNIT_DEFAULT = UNIT_METRIC;
}
Затем используйте его в своей модели, контроллере, что угодно:
<?php
namespace App\Models;
use App\Support\Constants;
class Model
{
public function units()
{
return Constants::UNIT_DEFAULT;
}
}
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
Просто чтобы добавить ответ, приведенный выше, вам нужно будет включить класс config, прежде чем вы сможете начать использовать его в Laravel 5.3
use Illuminate\Support\Facades\Config;
Просто поместите файл constants.php в каталог конфигурации и определите свои константы в этом файле, этот файл будет автоматически загружен, протестирован в Laravel 6+