A flexible and powerful Laravel package for managing application settings with multi-language support and various data structures.
- Multi-language Support: Built-in localization for settings
- Multiple Data Types: Support for strings, arrays, and nested structures
- Flexible Storage: Store single values or collections
- ArrayAccess Implementation: Access settings like arrays
- Database-backed: Persistent storage using Eloquent
- Performance: Efficient data retrieval and caching
- Blade Directive: Custom Blade directive for easy iteration
- Add the
SettingsServicesclass to your project:
app/Services/Settings/SettingsServices.php- Add the helper function to your
app/helpers.phpor create it:
<?php
use \App\Services\Settings\SettingsServices;
if (!function_exists('setting')) {
function setting(?string $key, ?string $lang = null): SettingsServices
{
return new SettingsServices($key, $lang);
}
}- Create the settings migration:
Schema::create('settings', function (Blueprint $table) {
$table->id();
$table->string('key')->unique();
$table->text('value')->nullable();
$table->timestamps();
});- Create the
Settingmodel:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Setting extends Model
{
protected $fillable = ['key', 'value'];
}Store and retrieve file paths:
setting('website')->save([
'logo_path' => 'website/old_logo.png',
]);
// Get
$logoPath = setting('website')->logo_path; // "website/old_logo.png"Store simple key-value pairs:
$items = [
'name' => 'name value new',
'email' => 'email value',
];
setting('item_single')->save($items);
// Get
$name = setting('item_single')->name; // "name value new"
$email = setting('item_single')->email; // "email value"Store localized key-value pairs:
$items = [
'name' => ['ar' => 'name ar', 'en' => 'name en'],
'email' => ['ar' => 'email ar', 'en' => 'email en'],
];
setting('single_language')->save($items);
// Get (uses current app locale)
$name = setting('single_language')->name; // Returns based on app()->getLocale()
$email = setting('single_language')->email;
// Get specific language
$nameAr = setting('single_language', 'ar')->name; // "name ar"
$nameEn = setting('single_language', 'en')->name; // "name en"Store collections of items:
$items = [
['name' => 'name value 1', 'email' => 'email value 1'],
['name' => 'name value 2', 'email' => 'email value 2'],
];
setting('single_multiple_items')->save($items);
// Get all items
foreach (setting('single_multiple_items')->get() as $item) {
echo $item->name; // "name value 1", "name value 2"
echo $item->email; // "email value 1", "email value 2"
}
// Or use each() method
setting('single_multiple_items')->each(function ($item) {
echo "{$item->name} - {$item->email}";
});Blade Usage:
@eachSetting('single_multiple_items')
<div>{{ $item->name }} - {{ $item->email }}</div>
@endEachSettingStore collections with localized content:
$items = [
[
'name' => ['ar' => 'name value 1 ar', 'en' => 'name value 1 en'],
'email' => ['ar' => 'email value 1 ar', 'en' => 'email value 1 en'],
],
[
'name' => ['ar' => 'name value 2 ar', 'en' => 'name value 2 en'],
'email' => ['ar' => 'email value 2 ar', 'en' => 'email value 2 en'],
],
];
setting('single_multiple_language_items')->save($items);
// Get items (respects current locale)
foreach (setting('single_multiple_language_items')->get() as $item) {
echo $item->name; // Returns based on app()->getLocale()
echo $item->email;
}
// Or use each() method
setting('single_multiple_language_items')->each(function ($item) {
echo "{$item->name} - {$item->email}";
});Blade Usage:
@eachSetting('single_multiple_language_items')
<div>{{ $item->name }} - {{ $item->email }}</div>
@endEachSettingStore multiple items:
$items = [
['name' => 'name 1 multiples', 'email' => 'email 1 multiples'],
['name' => 'name 2 multiples', 'email' => 'email 2 multiples'],
];
setting('multiple_items')->save($items);
// Get all items
foreach (setting('multiple_items')->get() as $item) {
echo $item->name; // "name 1 multiples", "name 2 multiples"
echo $item->email; // "email 1 multiples", "email 2 multiples"
}
// Or use each() method
setting('multiple_items')->each(function ($item) {
echo "{$item->name} - {$item->email}";
});Blade Usage:
@eachSetting('multiple_items')
<div>{{ $item->name }} - {{ $item->email }}</div>
@endEachSettingStore multiple items with localization:
$items = [
[
'name' => ['ar' => 'name value 1 ar', 'en' => 'name value 1 en'],
'email' => ['ar' => 'email value 1 ar', 'en' => 'email value 1 en'],
],
[
'name' => ['ar' => 'name value 2 ar', 'en' => 'name value 2 en'],
'email' => ['ar' => 'email value 2 ar', 'en' => 'email value 2 en'],
],
];
setting('multiple_language_items')->save($items);
// Get items (respects current locale)
foreach (setting('multiple_language_items')->get() as $item) {
echo $item->name; // Returns based on app()->getLocale()
echo $item->email;
}
// Or use each() method
setting('multiple_language_items')->each(function ($item) {
echo "{$item->name} - {$item->email}";
});
// Get items in specific language
setting('multiple_language_items', 'ar')->each(function ($item) {
echo "{$item->name} - {$item->email}"; // Arabic content
});Blade Usage:
@eachSetting('multiple_language_items')
<div>{{ $item->name }} - {{ $item->email }}</div>
@endEachSettingUse the custom @eachSetting directive in your Blade templates for iterating over multiple items.
Add to your AppServiceProvider:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('eachSetting', function ($expression) {
return "<?php foreach(setting({$expression})->get() as \$item): ?>";
});
Blade::directive('endEachSetting', function () {
return "<?php endforeach; ?>";
});
}All examples using @eachSetting are shown in the usage section above for items 4-7.
The service implements ArrayAccess, allowing array-like access:
$items = ['name' => 'John', 'email' => 'john@example.com'];
setting('user')->save($items);
// Check if key exists
if (isset(setting('user')['name'])) {
// Key exists
}
// Get value
$name = setting('user')['name'];Retrieve the raw stored value:
$rawData = setting('users')->toArray();setting('users')
->each(function ($user, $index) {
echo "User {$index}: {$user->name}";
});| Method | Description |
|---|---|
save(array|string $data) |
Save data to database |
get() |
Get all items (for arrays) with locale processing |
each(callable $callback) |
Iterate over items with callback |
toArray() |
Get raw value as array |
__get($property) |
Magic getter for accessing properties |
| Parameter | Type | Description |
|---|---|---|
$key |
string | Unique identifier for the setting |
$lang |
string|null | Language code (defaults to app()->getLocale()) |
- Storage: Data is stored as JSON in the database
- Retrieval: JSON is decoded and processed based on structure
- Localization: Multi-language values are automatically resolved based on current or specified locale
- Fallback: If a locale key doesn't exist, falls back to the first available value
- Laravel 8.x or higher
- PHP 8.0 or higher
This package is open-sourced software licensed under the MIT license.
Contributions are welcome! Please feel free to submit a Pull Request.
If you encounter any issues or have questions, please open an issue on the repository.
Made with ❤️ for the Laravel community