Learn how to configure settings in Laravel with this step-by-step guide. Customize your application easily for better performance and flexibility.
1. Create setting migration:
$php artisan make:migration settings
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('settings', function (Blueprint $table) {
$table->id();
$table->string('key')->unique();
$table->text('value')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('settings');
}
};
2. Create setting model:
$php artisan make:model Setting
File: App/Models/Setting.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Setting extends Model
{
protected $guarded = [];
}
3. Create setting controller:
$ php artisan make:controller SettingController
File: App/Http/Controllers/SettingController.php
<?php
namespace App\Http\Controllers;
use App\Models\Setting;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class SettingController extends Controller
{
public function edit(Request $request){
// Default settings
$settingArr = [
'site_name' => null,
'site_logo' => null,
'site_description' => null,
];
$settings = Setting::all();
foreach ($settings as $setting) {
if (array_key_exists($setting->key, $settingArr)) {
$settingArr[$setting->key] = $setting->value;
}
}
// Convert the array to an object if needed
$data['setting'] = (object) $settingArr;
return view("setting", $data);
}
public function update(Request $request)
{
$validatedData = $request->validate([
'site_name' => 'nullable',
'site_logo' => 'nullable|file|mimes:jpg,jpeg,png|max:2048',
'site_description' => 'nullable',
]);
if ($request->hasFile('site_logo')) {
$logoPath = $request->file('site_logo')->store('settings', 'public');
$setting = Setting::where('key', 'site_logo')->first();
if ($setting && $setting->value) {
Storage::disk('public')->delete($setting->value);
}
$validatedData['site_logo'] = $logoPath;
}
// Iterate through the validated data and update each setting
foreach ($validatedData as $key => $value) {
Setting::updateOrCreate(
['key' => $key],
['value' => $value]
);
}
return redirect()->back()->with('success','Setting updated successfully');
}
}
5. Create route:
FIle: routes/web.php
use App\Http\Controllers\SettingController;
Route::get('edit-setting', [SettingController::class,'edit'])->name('setting');
Route::post('update-setting', [SettingController::class,'update'])->name('updateSetting');
4. Create blade file:
File: resource/views/setting.blade.php
<form action="{{route('updateSetting')}}" method="post" enctype="multipart/form-data">
@csrf
<div>
<label for="site_name">Site Name</label>
<div class="card p-2 mt-3">
<input type="text" name="site_name" value="{{ old('site_name', $setting->site_name ?? '') }}">
</div>
</div>
<div>
<label for="site_logo">Site Logo</label>
<div class="card p-2 mt-3" style="width: 12rem">
<input type="file" name="site_logo" accept="image/*" >
@error('site_logo')
<div class="errors">
<span class="text-danger">
{{$message}}
</span>
</div>
@enderror
</div>
</div>
<div>
<label for="site_description">Site Description</label>
<div class="card p-2 mt-3" style="width: 12rem">
<textarea name="site_description" rows="7" >{{ old('site_description', $setting->site_description ?? '') }}</textarea>
</div>
</div>
<input type="submit" value="Submit">
</form>