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


82

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

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

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

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

Ответы:


118

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

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

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


Простой способ! Это хорошо для «постоянных массивов», уже установленных в коде проекта. Но как насчет переменных или массивов, сгенерированных во время выполнения, к которым я хочу получить глобальный доступ отовсюду. У меня есть базовый стартовый код на global.php, и там создаются некоторые переменные, которые мне понадобятся после в некоторых контроллерах или представлениях. Есть ли способ установить значение этих переменных конфигурации или даже создать новые во время выполнения?
Marco Madueño Mejía

Я не думал, что это может быть так просто. Я отмечу это как ответ, но у меня есть последнее сомнение. Одна из тех переменных, которые мне нужно сделать глобально доступными, содержит набор категорий, взятых из базы данных. Он требуется для всех представлений, поскольку он будет использоваться для меню навигации, но он также требуется в некоторых контроллерах и даже для маршрутизации. Правильно ли (семантически говоря) сохранять этот тип данных как переменную конфигурации? Или надо как-то по-другому хранить?
Marco Madueño Mejía

2
@Corner, начиная с версии 5.0, каталог config находится непосредственно в корне каталога вашего проекта.
lukasgeiter

4
Для людей, использующих Laravel 5 или выше, вы должны добавить «использовать конфигурацию»; в вашем контроллере или поместите косую черту в шрифт Config, например: \ Config :: get ('constants.langs');
rotaercz

2
Вы можете использовать config()помощник, а не Config::get()сейчас.
Leith

23

Для констант

Создайте файл 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'
AliN11,

13

Создать файл общих констант в 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

1
Спасибо, что поделился. Я забыл про автозагрузку: D
Ченнавир Хакари

с удовольствием @ChannaveerHakari
Parth kharecha

8

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

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

Если у меня большое количество констант, есть ли способ сохранить их в другом файле (файлах), а затем включить их в функцию маршрута? Кроме того, что делает строка ['prefix' => '']? Я знаю, что это ассоциативный массив, но делает ли это доступными константы для всех маршрутов? Благодарю.
user3089840

1
Ага, ну я разобрался с префиксом: laravel.com/docs/5.1/routing#route-group-prefixes
user3089840

Еще одно замечание: что бы я ни делал, похоже, что PHPUnit это не нравится. Когда я пробую это по-вашему, в браузере все работает нормально, но PHPUnit сообщает мне, что мои константы уже определены, а это просто неправда.
user3089840

Если вы кешируете свои конфиги, то определение в них констант не сработает.
нули и единицы

Отличная идея использовать приставку
Арун Йокеш

4

Я считаю, что лучше всего использовать локализацию.

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


Правильно. Подзапрос от новичка - как прочитать этот файл message.php и получить значение ключа в виде массива? Я хочу прочитать его как массив и отправить как ответ json для моей клиентской библиотеки, то есть Angular JS для обработки определенных строк.
Гопинатх

2

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

use Illuminate\Support\Facades\Config;

Или просто используйте функцию config ().
ademers 01

2

По крайней мере, в 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


0

Просто поместите файл constants.php в каталог конфигурации и определите свои константы в этом файле, этот файл будет автоматически загружен, протестирован в Laravel 6+

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.