it-swarm.com.ru

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

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

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

<?php

return [
    'view_id' => '118754561',

    'cache_lifetime_in_minutes' => 60 * 24,
];

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

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

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

22
Courtney Ball

Это также универсальное решение для динамического обновления вашего .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: Вам, конечно, нужно сделать функцию публичной, если вы планируете использовать ее из других классов.

18
matthiku

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

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

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

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

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

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

  • Итак, как вы могли бы вызывать поставщика услуг только тогда, когда это необходимо, а не раньше (то есть после установки нового значения конфигурации)? Вы можете сделать его провайдером deferred. Следуя вашему примеру «spatie laravel-analytics», замените в 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];
    }
}

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

7
alepeino

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

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

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

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

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

Все файлы конфигурации платформы 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'),
);

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

Синтаксис:

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');

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

3
Naresh Kumar .P

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

  <?php

    use Illuminate\Support\Facades\Config;

     //[...]

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

    Config::set('view_id', $user_id );
2
Shahid Chaudhary

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

0
Kundan roy

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

<?php

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

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

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