How to set global dynamic variables in Laravel? - php

I need to set global variables in Laravel that I can modify whenever I want. Suppose that I have an admin area where I want to be able to modify colors, ads ... etc.
How can I do that, without storing values in the database?

You can use the config.
For the example, I am using Jenssegers\Agent\Agent to detect is the client desktop and generate different views and different queries. For that, I have created config/globalVars.php:
use Jenssegers\Agent\Agent;
$agent = new Agent();
return [
'isDesktop' => $agent->isDesktop()
];
Now, I can use config('globalVars.isMobile') everywhere.
In your case, you want and to change these vars:
var_dump(config('globalVars.isDesktop')); // true/false
config(['globalVars' => ['isDesktop' => 'fake info']]);
var_dump(config('globalVars.isDesktop')); // fake info

Related

Output route url with two variables using only ID

If possible..how would this be done? Laravel 5.5
route('section.category.subcategory',$subcategory->id)
must output (routes/web.php has the get:: set as this too)
/section/{parent_slug}/{subcategory_slug}
I could easily do
route('section.category.subcategory',[
'subcategory_slug' => $subcategory->slug,
'parent_slug'=>$parent->slug
]
);
but I'm trying to avoid having to declare those things all the time.
I thought getRouteKeyName in model would be first place to go to, but it binds to only one variable as far as I could find.
RouteHandler isn't the place to do anything either because it reads the url, not outputs it right?
I'm assuming in some file that I don't know about I will have to set this sort of logic.
if(requested_route is section.category.subcategory)){
// get the parent_id of ID provided,
// get parent's slug
// build the url.
}
Even better, I think I could do a left join when pulling the list of subcategories, so I have $subcategory->parent_slug instead of going for $parent->slug. This way
route('section.category.subcategory',[$subcategory])
has all the variables it needs to work with.
I think for this helper would be a good choice so you could create url like this:
route('section.category.subcategory',build_category_parameters($subcategory))
and you can create function like this:
function build_category_parameters($subcategory)
{
// here any logic that is needed
// here return array something like this
return [ 'subcategory_slug' => $subcategory->slug,
'parent_slug'=> $subcategory->parent->slug
];
}
If you don't have helper file already you can create one using this way Laravel - require php script in a service provider

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?
This also is a generic solution to dynamically update your .env file (respective the individual key/value pairs)
Change the setting in your config/packagename like so:
return [
'view_id' => env('VIEW_ID', '118754561'),
etc...
]
Add an initial value into .env:
VIEW_ID=118754561
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.
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.
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'
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.
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 );
You can do like this.
In your custom config file. Add the following code You can send your id dynamically from the query string.
'view_id' => isset($_REQUEST['view_id'])?$_REQUEST['view_id']:null,
To get view id
echo config('app.view_id'); // app is config file name
config(['packagename.view_id' => Auth::user()->id]);
Actually if you are that point of code which forces you to make the config values dynamic, then there should be something wrong with your code flow, as the use of config file is just for initializing required values - which should be defined before the app is loaded.
Making config values dynamic is a "BAD PRACTICE" in the world of coding.
So there is the following alternative for your problem.
Define value in .env file (optional)
VIEW_ID=your_view_id_here
Use value inside Controller
$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
Hope this helps you!
config::set() doesn't works for me in laravel 8. but I got best answer for Create or edit Config file
config(['YOUR-CONFIG.YOUR_KEY' => 'NEW_VALUE']);
$text = '<?php return ' . var_export(config('YOUR-CONFIG'), true) . ';';
file_put_contents(config_path('YOUR-CONFIG.php'), $text);
just try this way this works for me.
original answer you can see here

How to define a dynamic global variable in code-igniter framework.

How to define a dynamic global variable in code-igniter framework.
I am using Geo-Location tracking api, which tracks the country of the user based on user's IP address.
I need to set the value of this global variable dynamically depending on the country code returned from the API.
what is the best way to achieve this ?
In your case, You can store the value in session like this
$newdata = array(
'country' => 'Nepal',
);
$this->session->set_userdata($newdata);
And again retrieve the session value like this
$country = $this->session->userdata('country');
Have a look at their website (see the Config Class), it is written in great detail there.

laravel 5: Where define global Vars?

In the old laravel 4 Code we use an constants.php to define global vars.
What is the best practices to use define vars in Laravel 5?
We wouldn't store it in the .env file or the routes.php
I just want to improve a little bit #Adam's answer. Suppose an online shopping cart. Then, you want a global var to store the currency symbol in order to be displayed at views. Because this value can be changed across the time, you can specify it at App\Providers\ConfigServiceProvider like so:
public function register()
{
$currency = 'whatever you want';
config([
'currency' => $currency
]);
}
The $currency = config('currency') var is global for use at entire application even the request is not yet arrived at controllers (you can read more about middleware classes).
If you definitively want to use constanst (values never change) you could consider set the values at config files direclty as below:
# create a new config file config/customs.php
# like content, you could start with:
return [
'currency' => '$'
];
Finally, you grap the value in your app with config('customs.currency').
Depends on what sort of variables you are trying to store. If they are related to the model they should be stored in the model, if they are related to the environment they should be stored in .env. What sort of variables are you trying to store?

pass more than 1 variables from the url for a multi language website

I am doing a multi language website for which i use a route:group with a prefix in my route.php.
Now, i am trying to grab the variables of language to know which language i am viewing the website, and then use it to query database.
I have found a problem, how to get more than 1 variables from the url?
Route::get('/{vedi}/{fuffa}', function($vedi, $fuffa)
{
$arrays=array(['campo'=>$vedi,
'lingua'=>$fuffa]);
return View::make('abc')->with('data',$arrays);
});
then in my 'abc' view i would ask for a
{{$data->campo}}
but he tell me it's not a n object.
1) how can i do?
2)is this a corret approach to build a website multilanguage?
For 1)
You are trying to access your data via a $data object that does not exist. You try to access your values like if $data was an object (by using ->campo).
What actually happens that you have an array. In your case, you can access your variables like this:
{{ $data['campo'] }}
What you also can do:
$arrays=array('campo'=>$vedi,
'lingua'=>$fuffa);
return View::make('abc')->with($arrays);
});
And then, in your view, you will have the variables directly available, without being in one $data array:
{{ $campo }}
For 2)
You can make use of laravels Localization functionality. Basically, you make one or many files for each language where you have the same structure of messages. In your views, you acceess the same messages, but based on the viewers chosen language the correct message is shown.
See Laravel Localization here

Categories