Подтвердить что ты не робот

Настройки динамической конфигурации Laravel

Я использую пакет в своем проекте и сохраняет настройки внутри config/packagename

Я хотел бы динамически изменять это значение внутри конфигурационного файла, так выглядит структура файла;

<?php

return [
    'view_id' => '118754561',

    'cache_lifetime_in_minutes' => 60 * 24,
];

Я хотел бы изменить его на что-то вроде этого -

'view_id' => Auth::user()->id,

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

4b9b3361

Ответ 1

Это также универсальное решение для динамического обновления вашего .env файла (соответствует отдельным парам ключ/значение)

  • Измените настройку в вашем config/packagename следующим образом:
return [
    'view_id' => env('VIEW_ID', '118754561'),
    etc...
]
  1. Добавьте начальное значение в .env:

    view_id = 118754561

  2. В соответствующем контроллере (например, AuthController) используйте приведенный ниже код и вызовите функцию следующим образом: updateDotEnv('VIEW_ID', Auth::User()->id)

    protected function updateDotEnv($key, $newValue, $delim='')
    {
    
        $path = base_path('.env');
        // get old value from current env
        $oldValue = env($key);
    
        // was there any change?
        if ($oldValue === $newValue) {
            return;
        }
    
        // rewrite file content with changed data
        if (file_exists($path)) {
            // replace current value with new value 
            file_put_contents(
                $path, str_replace(
                    $key.'='.$delim.$oldValue.$delim, 
                    $key.'='.$delim.$newValue.$delim, 
                    file_get_contents($path)
                )
            );
        }
    }
    

(Параметр $delim необходим, если вы хотите сделать эту функцию более общей для работы с парами ключ = значение в .env, где значение должно быть заключено в двойные кавычки, потому что они содержат пробелы).

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

Примечание: вам нужно сделать эту функцию общедоступной, если вы планируете использовать ее из других классов.

Ответ 2

Если вы хотите редактировать файлы конфигурации (либо config/packagename.php, либо .env), вы можете следовать ответ matthiku.

Однако, если бы я был вами, я бы предпочел бы настроить этот сторонний пакет на основе некоторого значения, определенного во время выполнения, вместо изменения какого-либо файла (который, кстати, не вступит в силу до следующего запроса, когда значения env считываются снова).

Итак, на мой взгляд, самый чистый способ сделать это:

  • сохраните нужное значение в данных конфигурации:

    config(['packagename.view_id' => Auth::user()->id]);

  • Однако вы можете заметить, что это, вероятно, не сработает: поставщик услуг, который предоставляет необходимую вам услугу, часто регистрируется до обработки запроса, то есть до изменения конфигурации. Таким образом, вы по-прежнему получаете сервис со старыми настройками.

  • Итак, как вы могли бы вызывать поставщика услуг только тогда, когда это необходимо, а не раньше (то есть после установки нового значения конфигурации)? Вы можете сделать его отсроченным провайдером. Следуя вашему примеру "пространственно-ларавель-аналитики", замените в config/app.php эту строку:

    Spatie\Analytics\AnalyticsServiceProvider::class

    с этим:

    App\Providers\AnalyticsDeferredServiceProvider::class

    и, наконец, создать класс App\Providers\AnalyticsDeferredServiceProvider, используя:

:

<?php
namespace App\Providers;

use Spatie\Analytics\Analytics;
use Spatie\Analytics\AnalyticsServiceProvider;

class AnalyticsDeferredServiceProvider extends AnalyticsServiceProvider
{
    protected $defer = true;

    public function provides()
    {
        return [Analytics::class];
    }
}

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

Ответ 3

Вы можете сделать это.

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

'view_id' => isset($_REQUEST['view_id'])?$_REQUEST['view_id']:null,

Чтобы получить идентификатор просмотра

 echo config('app.view_id'); // app is config file name

Ответ 4

Все файлы конфигурации оболочки Laravel, хранящиеся в каталоге app/config.

поэтому, если нам нужно создавать собственные значения конфигурации, было бы лучше сохранить отдельную пользовательскую конфигурацию в пользовательском файле. поэтому нам нужно создать пользовательский файл в app/config directory.

Laravel автоматически читает этот файл как файл конфигурации и будет автоматически управлять им В этом разделе мы работаем с настраиваемой конфигурацией в laravel и получаем конфигурационное значение в контроллере или виде.

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

создайте файл в app/config/custom.php, у которого есть ключи ключей и значение, например: -

return array(
  'my_val' => 'mysinglelue',
  'my_arr_val' => array('1', '2', '3'),
);

Теперь вам нужно получить эти значения конфигурации в представлении/контроллере, чтобы мы использовали метод класса get() для этого

Синтаксис:

echo Config::get('filename.arraykey');

где filename является config file’s name, обычным в нашем случае, а ключ является array key значения, которое вы хотите получить.

В нашем случае это будет как:

echo Config::get('custom.my_val');

Создать конфигурацию времени выполнения в laravel: -

Значения конфигурации, установленные во время выполнения, будут установлены для текущего запроса, а не переносятся на последующие запросы.

Вы можете передать динамические значения здесь, чтобы вы могли динамически изменять файл конфигурации с помощью функций isset().

Как и как @Kundan roy, как было предложено использовать isset(), здесь применяется такое же условие. Но это альтернативный метод, который будет работать для динамической настройки значений в конфигурации.

Config::set('custom.my_val', 'mysinglelue');

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

Ответ 5

Используйте это в контроллере, когда вам нужно изменить.

  <?php

    use Illuminate\Support\Facades\Config;

     //[...]

    $user_id =  Auth::user()->id; 

    Config::set('view_id', $user_id );

Ответ 6

Начиная с Laravel v5.2 вы можете динамически устанавливать значения конфигурации следующим образом:

<?php

config(['app.timezone' => 'America/Chicago']);

$value = config('app.timezone');

echo $value;
// output: 'America/Chicago'

Ответ 7

config (['packagename.view_id' => Auth :: user() → id]);

Ответ 8

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

Выполнение динамических значений конфигурации - это "БЕСПЛАТНАЯ ПРАКТИКА" в мире кодирования. Таким образом, для вашей проблемы существует следующая альтернатива.

Определить значение в файле .env (необязательно)

VIEW_ID=your_view_id_here

Использовать значение внутри контроллера

$auth_id = auth()->user()->id;
$view_id = env('VIEW_ID', $auth_id);
// If .env file doesn't contains 'VIEW_ID' it will take $auth_user as the view_id

Надеюсь, это поможет вам!