Я только начал работать с 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, это нормально? Или как еще я могу хранить эти данные? Что было бы лучшим и семантически правильным способом?
Спасибо
Для большинства констант, используемых глобально в приложении, достаточно хранить их в файлах конфигурации. Это также довольно просто
Создайте новый файл в каталоге 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 автоматически включает все файлы конфигурации, поэтому нет необходимости в ручном режиме:)
route:cache
: Use of undefined constant ID - assumed 'ID'
Для глобальных констант в 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
в 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.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');
Особенно полезен для статических методов в модели и т.д.
Ссылка на Laracasts.com https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found