Skip to content
Advertisement

Laravel – Set global variable from settings table

I’m trying to store all my settings from my settings table into a global variable, but I’m stucked now(I have no idea what’s the next step), this is my actual model and seeder:

model – Settings.php

JavaScript

seeder – SettingsTableSeeder.php

JavaScript

How can I store all the data inside the settings table and make then acessible from blade, or any controller or view?

Edit


Now, my question is, how can i update a single or multiple value(s) from a form?

I have set this up:

My route:

JavaScript

My AdminAdminConfiguracoesController:

JavaScript

My SettingRepository:

JavaScript

My blade form:

JavaScript

But things does not work. How can I update the values into the table?

Advertisement

Answer

See improved answer in Update 2

I would add a dedicated Service Provider for this. It will read all your settings stored in the database and add them to Laravels config. This way there is only one database request for the settings and you can access the configuration in all controllers and views like this:

JavaScript

Step 1: Create the Service Provider.

You can create the Service Provider with artisan:

php artisan make:provider SettingsServiceProvider

This will create the file app/Providers/SettingsServiceProvider.php.

Step 2: Add this to the boot-method of the provider you have just created:

JavaScript

From the Laravel Docs:

[The boot method] is called after all other service providers have been registered, meaning you have access to all other services that have been registered by the framework.

http://laravel.com/docs/5.1/providers#the-boot-method

Step 3: Register the provider in your App.

Add this line to the providers array in config/app.php:

JavaScript

And that’s it. Happy coding!

Update: I want to add that the boot-method supports dependency injection. So instead of hard coding AppSetting, you could inject a repository / an interface that is bound to the repository, which is great for testing.

Update 2: As Jeemusu mentioned in his comment, the app will query the database on every request. In order to hinder that, you can cache the settings. There are basically two ways you can do that.

  1. Put the data into the cache every time the admin is updating the settings.

  2. Just remember the settings in the cache for some time and clear the cache every time the admin updates the settings.

To make thinks more fault tolerant, I’d use the second option. Caches can be cleared unintentionally. The first option will fail on fresh installations as long as the admin did not set the settings or you reinstall after a server crash.

For the second option, change the Service Providers boot-method:

JavaScript

Now you only have to make the cache forget the settings key after the admin updates the settings:

JavaScript
User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement