Я только начал работать с Laravel. Мне нужно переписать всю систему, которую я создал несколько лет назад, используя Laravel 4 в качестве базовой структуры. В моей старой системе у меня был constant.php
файл с объявленными константами и globals.php
файл, содержащий множество наборов массивов (например, статусы категорий, типы событий, языки и т. Д.). Поступая так, я мог бы использовать что-то вроде
foreach ( $langs as $code => $domain ) {
// Some stuff
}
где угодно в моем приложении.
Мой вопрос в том, как я могу хранить эту информацию так называемым «способом ларавел». Я попытался использовать какой-то объект для хранения этой информации, установив его как службу и создав для нее фасад:
приложение / библиотеки / проект / 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'
];
}
приложение / библиотеки / проект / ConstantsServiceProvider.php
namespace PJ;
use Illuminate\Support\ServiceProvider;
class ConstantsServiceProvider extends ServiceProvider {
public function register() {
$this->app->singleton('PJConstants', function() {
return new Constants;
});
}
}
приложение / библиотеки / проект / 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
.
Это работает, но я сомневаюсь, что это наиболее эффективный или правильный способ сделать это. Я имею в виду, правильный ли способ «размножить» переменную путем создания целого поставщика услуг, фасадов и всего подобного? Или куда мне эти данные положить?
Спасибо за любой совет.
РЕДАКТИРОВАТЬ # 01
Данные, которые я хочу передать всем контроллерам и представлениям, можно напрямую задать в скрипте, как в примере в начале моего сообщения, но они также могут быть сгенерированы динамически, например, из базы данных. Эти данные могут быть списком категорий. Мне они нужны во всех представлениях для создания панели навигации, но они также нужны мне для определения некоторых шаблонов маршрутизации (например /category/subcategory/product
), а также для анализа некоторой информации в нескольких контроллерах (например, для получения информации из категории, содержащей продукт 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()
помощник, а неConfig::get()
сейчас.Для констант
Создайте файл 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'
приложение / constants.php
define('YOUR_CONSTANT_VAR', 'VALUE'); //EX define('COLOR_TWO', 'red');
composer.json добавить расположение файла при автозагрузке в composer.json
"autoload": { "files": [ "app/constants.php" ] }
Прежде чем это изменение вступит в силу, вы должны запустить следующую команду в Терминале для восстановления файлов автозагрузки Laravel:
источник
Для глобальных констант в 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')
локализация laravel 5.0
или же
локализация laravel 5.4
источник
Чтобы добавить к приведенному выше ответу, вам нужно будет включить класс конфигурации, прежде чем вы сможете начать использовать его в 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
источник
Просто поместите файл constants.php в каталог конфигурации и определите свои константы в этом файле, этот файл будет автоматически загружен, протестирован в Laravel 6+
источник