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


82

Я щойно почав працювати з Laravel. Мені потрібно переписати цілу систему, яку я створив кілька років тому, використовуючи Laravel 4 як базовий фреймворк. У моїй старій системі раніше у мене був constant.phpфайл із декларованими деякими константами та globals.phpфайл, який містив безліч наборів масивів (наприклад, статуси категорій, тип подій, мови тощо). Роблячи це, я міг би використати щось на зразок

foreach ( $langs as $code => $domain ) {
    // Some stuff
}

в будь-якому місці мого додатка.

Моє питання полягає в тому, як я можу зберігати цю інформацію так званим "способом laravel". Я спробував використовувати якийсь об'єкт для зберігання цієї інформації, встановивши це як послугу і створивши для неї фасад:

app / libraries / 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'
        ];
}

app / libraries / Project / ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

class ConstantsServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->singleton('PJConstants', function() {
            return new Constants;
        });
    }
}

app / libraries / 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

Дані, які я хочу передати всім контролерам, і подання можуть бути безпосередньо встановлені в сценарії, як у прикладі на початку мого допису, але вони також можуть генеруватися динамічно, наприклад, з бази даних. Ці дані можуть бути списком категорій. Вони потрібні мені у всіх поданнях для створення навігаційної панелі, але вони також потрібні для визначення деяких шаблонів маршрутизації (наприклад /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...']
]

Просто як приклад. Index - це ідентифікатор категорії, а Value - це інформація, пов’язана з категорією.

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

Отже, чи слід зберігати його як змінну Config? Як інакше я міг зберігати ці дані; який би був найкращий та семантично правильний спосіб?

Відповіді:


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, і там створюються деякі змінні, які мені знадобляться після в деяких контролерах або поданнях. Чи є спосіб встановити значення змінних Config або навіть створити нові під час виконання?
Marco Madueño Mejía

Я не думав, що це може бути так просто. Я позначу це як відповідь, але в мене є останній сумнів щодо цього. Одна з тих змінних, які мені потрібні для глобального доступу, містить набір категорій, взятих із бази даних. Він необхідний для всіх видів, оскільки він буде використовуватися для навігаційного меню, але він також потрібен у деяких контролерах і навіть для маршрутизації. Чи правильно (семантично кажучи) зберігати цей тип даних як змінну Config? Або я повинен зберігати це якимось іншим способом?
Marco Madueño Mejía

2
@Corner починаючи з 5.0, каталог конфігурації знаходиться безпосередньо в кореневій директорії вашого проекту.
lukasgeiter

4
Для людей, які використовують Laravel 5 або новішої версії, вам слід додати "use Config;" у вашому контролері або вставте косу риску в шрифт Config так: \ Config :: get ('constants.langs');
rotaercz

2
Ви можете скористатися config()помічником, а не Config::get()зараз.
Лейт

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

app / 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
Channaveer Hakari

мені приємно @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 для обробки певних рядків.
Gopinath

2

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

use Illuminate\Support\Facades\Config;

Або просто скористайтеся функцією config ().
ademers

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.