Skip to main content
The ProfileController handles user profile management, including viewing, updating, and deleting user accounts.

Class Overview

namespace App\Http\Controllers;

use App\Http\Requests\ProfileUpdateRequest;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\View\View;

class ProfileController extends Controller

Routes

MethodRouteActionMiddleware
GET/profileeditauth, verified
PATCH/profileupdateauth, verified
DELETE/profiledestroyauth, verified

Methods

edit()

Display the user’s profile form.
public function edit(Request $request): View
request
Request
required
The HTTP request instance
Returns: View - The profile edit view Response Data:
user
User
The authenticated user object
isSocialiteUser
boolean
Whether the user authenticated via OAuth (GitHub/Google)
Example Implementation:
public function edit(Request $request): View
{
    $isSocialiteUser = Auth::user()->isSocialiteUser();

    return view('profile.edit', [
        'user' => $request->user(),
        'isSocialiteUser' => $isSocialiteUser,
    ]);
}
OAuth users (GitHub/Google) have restricted profile editing capabilities - they cannot change their password since authentication is managed by the provider.

update()

Update the user’s profile information.
public function update(ProfileUpdateRequest $request): RedirectResponse
request
ProfileUpdateRequest
required
Validated profile update request
Validation Rules (from ProfileUpdateRequest):
  • name - string, max 255 characters
  • email - string, email format, unique (excluding current user)
Returns: RedirectResponse - Redirects back to profile edit page Response:
  • Redirects to profile.edit route
  • Flash message: status = "profile-updated"
Example Implementation:
public function update(ProfileUpdateRequest $request): RedirectResponse
{
    $request->user()->fill($request->validated());

    if ($request->user()->isDirty('email')) {
        $request->user()->email_verified_at = null;
    }

    $request->user()->save();

    return Redirect::route('profile.edit')->with('status', 'profile-updated');
}
Changing the email address resets email_verified_at to null, requiring the user to verify their new email address.

destroy()

Delete the user’s account.
public function destroy(Request $request): RedirectResponse
request
Request
required
The HTTP request with password confirmation
Validation Rules:
password
string
required
Current password for confirmation (validated with current_password rule)
Returns: RedirectResponse - Redirects to home page Actions Performed:
  1. Validates current password
  2. Logs out the user
  3. Deletes the user record (cascade deletes accounts, categories, transactions)
  4. Invalidates the session
  5. Regenerates CSRF token
  6. Redirects to /
Example Implementation:
public function destroy(Request $request): RedirectResponse
{
    $request->validateWithBag('userDeletion', [
        'password' => ['required', 'current_password'],
    ]);

    $user = $request->user();

    Auth::logout();

    $user->delete();

    $request->session()->invalidate();
    $request->session()->regenerateToken();

    return Redirect::to('/');
}
Account deletion is permanent and will delete all associated data including accounts, transactions, categories, and net worth history.

Example Usage

Updating Profile

// PATCH /profile
// Request Body:
{
    "name": "John Doe",
    "email": "[email protected]"
}

// Response: Redirect to /profile with flash message
// Session: status => "profile-updated"

Deleting Account

// DELETE /profile
// Request Body:
{
    "password": "current-password"
}

// Response: Redirect to / (home page)
// User logged out and account deleted

Build docs developers (and LLMs) love