Я использую пакет в своем проекте, и он сохраняет настройки внутри config/packagename
Я хотел бы динамически изменить это значение внутри конфигурационного файла, так выглядит файловая структура в настоящее время;
<?php return [ 'view_id' => '118754561', 'cache_lifetime_in_minutes' => 60 * 24, ];
Я хотел бы изменить его на что-то вроде этого –
'view_id' => Auth::user()->id,
Можете ли вы сделать это в файле конфигурации, или вам нужно сохранить какую-то переменную, которая будет обновляться позже в контроллере. Есть ли способ разместить эти переменные в файле env и получить доступ к этим новым переменным с контроллера?
Это также является универсальным решением для динамического обновления вашего .env-файла (соответствующего отдельным парам ключ / значение)
return [ 'view_id' => env('VIEW_ID', '118754561'), etc... ]
Добавьте начальное значение в .env:
View_id = 118754561
В соответствующем контроллере (например, 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, где значение должно быть заключено в двойные кавычки, потому что они содержат пробелы).
По общему признанию, это может быть не лучшим решением, если у вас есть несколько пользователей одновременно с использованием этого пакета в вашем проекте. Так что это зависит от того, для чего вы используете этот пакет.
NB: вам нужно сделать эту функцию открытой, если вы планируете использовать ее из других классов.
Если вы хотите редактировать файлы конфигурации ( config/packagename.php
или .env
), вы можете последовать ответу mattyiku .
Однако, если бы я был вами, я бы предпочел бы настроить этот сторонний пакет на основе некоторого значения, определенного во время выполнения, вместо изменения любого файла (который, кстати, не вступает в силу до следующего запроса, когда значения 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]; } }
Таким образом, вы можете заставить провайдера прочитать значения конфигурации, когда вы собираетесь создать экземпляр службы, после того, как вы установите значения конфигурации среды выполнения.
Вы можете сделать это.
В вашем настраиваемом файле конфигурации. Добавьте следующий код. Вы можете отправить свой идентификатор динамически из строки запроса.
'view_id' => isset($_REQUEST['view_id'])?$_REQUEST['view_id']:null,
Чтобы получить идентификатор вида
echo config('app.view_id'); // app is config file name
Используйте это в контроллере, когда вам нужно изменить.
$user_id = Auth::user()->id; \Config::set('view_id', $user_id );
Все файлы конфигурации рамы 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()
класса Config для этого
Синтаксис:
echo Config::get('filename.arraykey');
где filename
– это filename
config file's name
, настраиваемое в нашем случае, а ключ – это array key
к которому вы хотите получить доступ.
В нашем случае это будет так:
echo Config::get('custom.my_val');
Создание конфигурации времени выполнения в laravel: –
Значения конфигурации, установленные во время выполнения, будут установлены для текущего запроса, а не переносятся на последующие запросы.
Здесь вы можете передать динамические значения, чтобы вы могли динамически изменять конфигурационный файл здесь, используя функции
isset()
.
Подобно тому, как @Kundan roy, как было предложено использовать isset()
здесь применяется такое же условие. Но это альтернативный метод, который будет работать для динамической настройки значений в конфиге.
Config::set('custom.my_val', 'mysinglelue');
Следовательно, используя этот метод, вы можете создавать динамические файлы конфигурации на основе требуемых значений.
Фактически, если вы являетесь той точкой кода, которая заставляет вас делать значения конфигурации динамическими, то в вашем потоке кода должно быть что-то неправильно, так как использование файла конфигурации предназначено только для инициализации требуемых значений – это должно быть определено до того, как приложение будет загружен.
Выполнение динамических значений конфигурации – это «БЕСПЛАТНАЯ ПРАКТИКА» в мире кодирования. Таким образом, для вашей проблемы существует следующая альтернатива.
Определить значение в файле .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
Надеюсь, это поможет вам!