Настройки динамической конфигурации Laravel
Я использую пакет в своем проекте и сохраняет настройки внутри config/packagename
Я хотел бы динамически изменять это значение внутри конфигурационного файла, так выглядит структура файла;
<?php
return [
'view_id' => '118754561',
'cache_lifetime_in_minutes' => 60 * 24,
];
Я хотел бы изменить его на что-то вроде этого -
'view_id' => Auth::user()->id,
Можете ли вы сделать это в файле конфигурации, или вам нужно сохранить какую-то переменную, которая будет обновляться позже в контроллере. Есть ли способ разместить эти переменные в файле env и получить доступ к этим новым переменным с контроллера?
Ответы
Ответ 1
Это также универсальное решение для динамического обновления вашего .env файла (соответствует отдельным парам ключ/значение)
- Измените настройку в вашем config/packagename следующим образом:
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, где значение должно быть заключено в двойные кавычки, потому что они содержат пробелы).
По общему признанию, это не может быть хорошим решением, если у вас есть несколько пользователей одновременно с использованием этого пакета в вашем проекте. Поэтому это зависит от того, для чего вы используете этот пакет.
Примечание: вам нужно сделать эту функцию общедоступной, если вы планируете использовать ее из других классов.
Ответ 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
Надеюсь, это поможет вам!