Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel dynamic config settings

I'm using a package within my project and it stores a setting inside config/packagename

I would like to dynamically change this value inside the config file, this is how the file structure looks currently;

<?php

return [
    'view_id' => '118754561',

    'cache_lifetime_in_minutes' => 60 * 24,
];

I would like to change it to something like this -

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

Can you do this within the config file, or do you have to store some sort of variable to be updated later within a controller. Is there a way to place these variables in an env file and access these new variables from a controller?

like image 279
Courtney Ball Avatar asked Sep 18 '16 21:09

Courtney Ball


People also ask

How set dynamic value in config file in laravel?

Create run time configuration in laravel :- Configuration values which are set at run-time are will set for the current request, not be carried over to subsequent requests. You can pass the dynamic values over here so that you can modify the config file dynamically over here using the isset() functions.

Where is config PHP in laravel?

All of the configuration files for the Laravel framework are stored in the app/config directory. Each option in every file is documented, so feel free to look through the files and get familiar with the options available to you.

How get data from config file in laravel?

use Config; $variable= Config::get('file1. EMP_DOC_PATH'); By this way you can get the variables value from config.


6 Answers

This also is a generic solution to dynamically update your .env file (respective the individual key/value pairs)

  1. Change the setting in your config/packagename like so:
return [
    'view_id' => env('VIEW_ID', '118754561'),
    etc...
]
  1. Add an initial value into .env:

    VIEW_ID=118754561

  2. In an appropriate controller (e.g. AuthController), use the code below and call the function like this: 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)
                )
            );
        }
    }
    

(The $delim parameter is needed if you want to make this function more generic in order to work with key=value pairs in .env where the value has to be enclosed in double quotes because they contain spaces).

Admittedly, this might not be a good solution if you have multiple users at the same time using this package in your project. So it depends on what you are using this package for.

NB: You need to make the function public of course if you plan to use it from other classes.

like image 131
matthiku Avatar answered Sep 27 '22 09:09

matthiku


All configuration files of Laravel framework stored in the app/config directory.

so if we need to create custom configuration values it would be better to keep separate our custom configuration in custom file. so we need to create custom file in app/config directory.

Laravel auto read this file as a config file and will auto manage it In this topic we are working with custom configuration in laravel and get configuration value in controller or view.

Now i am going to explain how to create a custom config file in Laravel so that we can implement dynamic feature over to this.

create a file in app/config/custom.php which have config keys and value like:-

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

Now need to get these config values in view/controller so we will use Config class get() method for this

Syntax:

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

where filename is the config file’s name, custom in our case, and key is the array key of the value you’re wanting to access.

In Our case it will be as:

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

Create run time configuration in laravel :-

Configuration values which are set at run-time are will set for the current request, not be carried over to subsequent requests.

You can pass the dynamic values over here so that you can modify the config file dynamically over here using the isset() functions.

Like how the @Kundan roy as suggested using of the isset() the same condition applies here to. But this one is the alternative method that will work for the dynamic setting of the values in the config.

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

Hence by using this method you can create the dynamic config files based on the values that you need.

like image 31
Naresh Kumar P Avatar answered Sep 27 '22 09:09

Naresh Kumar P


If you want to actually edit the config files (either config/packagename.php or .env) then you may follow matthiku's answer.

However, if I were you, I guess I'd rather want to configure this 3rd party package based on some value defined at runtime, instead of modifying any file (which by the way won't take effect until the next request, when the env values are read again).

So, in my opinion the cleanest way to do this is:

  • store your desired value in the config data:

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

  • However, you may notice this probably won't work: the service provider which provides the service you need is often registered before the request is processed, that is, before your config change takes place. So you are still getting the service with old values config.

  • So, how could you have the service provider be called only when needed and not before (that is, after setting the new config value)? You could make it a deferred provider. Following your example of "spatie laravel-analytics", replace in config/app.php this line:

    Spatie\Analytics\AnalyticsServiceProvider::class

    with this one:

    App\Providers\AnalyticsDeferredServiceProvider::class

    and finally create the App\Providers\AnalyticsDeferredServiceProvider class, with:

:

<?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];
    }
}

This way you can have the provider read the config values when you are about to instantiate the service, after you set any runtime config values.

like image 31
alepeino Avatar answered Sep 26 '22 09:09

alepeino


Since Laravel v5.2 you can dynamically set config values this way:

<?php

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

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

echo $value;
// output: 'America/Chicago'
like image 42
lasec0203 Avatar answered Sep 25 '22 09:09

lasec0203


Use this in controller when you need to change.

  <?php

    use Illuminate\Support\Facades\Config;

     //[...]

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

    Config::set('view_id', $user_id );
like image 31
Shahid Chaudhary Avatar answered Sep 26 '22 09:09

Shahid Chaudhary


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

like image 34
Kundan roy Avatar answered Sep 29 '22 09:09

Kundan roy