Intereting Posts

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

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

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

 <?php return [ 'view_id' => '118754561', 'cache_lifetime_in_minutes' => 60 * 24, ]; 

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

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

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

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

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

  1. Измените настройку в вашем 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, где значение должно быть заключено в двойные кавычки, потому что они содержат пробелы).

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

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 

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