How to Configure Settings in Laravel: A Step-by-Step Guide

How to Configure Settings in Laravel: A Step-by-Step Guide

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>

Comments