it-roy-ru.com

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

Спасибо

74
Marco Madueño Mejía

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

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

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

104
lukasgeiter

для констант

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

20
Gagandeep Gambhir

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

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

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

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

или же

локализация laravel 5.4

2
Bill Stephen

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

приложение/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
Terminal

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

use Illuminate\Support\Facades\Config;
2
Jignesh Rawal

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