Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

LaravelFan's avatar

Route not defined issued

Hi,

The last route is not being recognized as I keep getting Route [home.address] not defined.


<?php

use App\Http\Controllers\UserProfileController;
use App\Http\Controllers\UserAddressController;
use App\Http\Controllers\UserDashboardController;
use Illuminate\Support\Facades\Route;


/** Laravel Breeze routes that update the User's username, email and password */
Route::middleware(['auth', 'verified', 'role:user'])
    ->group(function () {
        Route::get('dashboard', [UserDashboardController::class, 'dashboard'])->name('dashboard');
        Route::get('profile', [UserProfileController::class, 'index'])->name('profile');
        Route::get('address', [UserAddressController::class, 'address'])->name('address');
        Route::put('profile', [UserProfileController::class, 'updateProfile'])->name('profile.update');
        Route::post('profile', [UserProfileController::class, 'updatePassword'])->name('profile.update.password');
    });

/** User Address route */
Route::get('user/dashboard/create', [UserAddressController::class, 'create'])->name('address.create');
Route::post('user/dashboard/address', [UserAddressController::class, 'store'])->name('address.store');
Route::get('user/dashboard/address/{id}/edit', [UserAddressController::class, 'edit'])->name('address.edit');
Route::put('user/dashboard/address/{id}', [UserAddressController::class, 'update'])->name('address.update');
Route::delete('user/dashboard/address/{id}', [UserAddressController::class, 'destroy'])->name('address.destroy');
Route::get('/user/dashboard/address.index', [UserAddressController::class, 'home'])->name('home.address');


This is the UserAddressController


<?php

namespace App\Http\Controllers;

// This adds the UserAddress Model to the controller
use App\Models\UserAddress;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

class UserAddressController extends Controller
{

    // This will return the address page
    public function address()
    {
        $addresses = UserAddress::where('user_id', Auth::user()->id)->get();
        return view('user.dashboard.address.index', compact('addresses'));
    }

    // This will return the create page
    public function create()
    {
        return view('user.dashboard.address.create');
    }

    public function home()
    {
        return view('user.dashboard.address.index');
    }


    public function store(Request $request)
    {
        // This adds validation to the user input fields
        $request->validate([
            'name' => ['required', 'max:200'],
            'email' => ['required', 'max:200', 'email'],
            'phone' => ['required', 'max:200'],
            'country' => ['required', 'max:200'],
            'state' => ['required', 'max:200'],
            'city' => ['required', 'max:200'],
            'zip' => ['required', 'max:200'],
            'address' => ['required', 'max:200'],

        ]);

        // This stores the user input into the database
        $address = new UserAddress();
        $address->user_id = Auth::user()->id;
        $address->name = $request->name;
        $address->email = $request->email;
        $address->phone = $request->phone;
        $address->country = $request->country;
        $address->state = $request->state;
        $address->city = $request->city;
        $address->zip = $request->zip;
        $address->address = $request->address;
        $address->save();

        // This displays the toast message 
        toastr('Updated Successfully!')->success('Address successfully added!');
        return redirect()->route('address');
    }

    // This will update an existing address

    public function edit(string $id)
    {
        $address = UserAddress::findOrFail($id);
        return view('user.dashboard.address.edit', compact('address'));
    }

    public function update(Request $request, string $id)
    {
        $request->validate([
            'name' => ['required', 'max:200'],
            'email' => ['required', 'max:200', 'email'],
            'phone' => ['required', 'max:200'],
            'country' => ['required', 'max:200'],
            'state' => ['required', 'max:200'],
            'city' => ['required', 'max:200'],
            'zip' => ['required', 'max:200'],
            'address' => ['required'],
        ]);

        $address = UserAddress::findOrFail($id);
        $address->user_id = Auth::user()->id;
        $address->name = $request->name;
        $address->email = $request->email;
        $address->phone = $request->phone;
        $address->country = $request->country;
        $address->state = $request->state;
        $address->city = $request->city;
        $address->zip = $request->zip;
        $address->address = $request->address;
        $address->save();

        toastr('Updated Successfully!', 'success', 'Success')->success('Updated Successfully!');

        return redirect()->route('home.address');
    }

    // This will delete an address

    public function destroy(string $id)
    {
        $address = UserAddress::findOrFail($id);
        $address->delete();

        return response(['status' => 'success', 'message' => 'Deleted Successfully!']);
    }
}


Grateful for your guidance.

0 likes
29 replies
gych's avatar

First try to run php artisan route:clear

Also in your route path you use address.index with a dot between address and index. This is not correct use a slash instead. Don't use dot's in route path's.

LaravelFan's avatar

@gych Hi, Like this:


<?php

namespace App\Http\Controllers;

// This adds the UserAddress Model to the controller
use App\Models\UserAddress;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

class UserAddressController extends Controller
{

    // This will return the address page
    public function address()
    {
        $addresses = UserAddress::where('user_id', Auth::user()->id)->get();
        return view('user.dashboard.address.index', compact('addresses'));
    }

    // This will return the create page
    public function create()
    {
        return view('user.dashboard.address.create');
    }

    public function home()
    {
        return view('user/dashboard/address/index');
    }


    public function store(Request $request)
    {
        // This adds validation to the user input fields
        $request->validate([
            'name' => ['required', 'max:200'],
            'email' => ['required', 'max:200', 'email'],
            'phone' => ['required', 'max:200'],
            'country' => ['required', 'max:200'],
            'state' => ['required', 'max:200'],
            'city' => ['required', 'max:200'],
            'zip' => ['required', 'max:200'],
            'address' => ['required', 'max:200'],

        ]);

        // This stores the user input into the database
        $address = new UserAddress();
        $address->user_id = Auth::user()->id;
        $address->name = $request->name;
        $address->email = $request->email;
        $address->phone = $request->phone;
        $address->country = $request->country;
        $address->state = $request->state;
        $address->city = $request->city;
        $address->zip = $request->zip;
        $address->address = $request->address;
        $address->save();

        // This displays the toast message 
        toastr('Updated Successfully!')->success('Address successfully added!');
        return redirect()->route('address');
    }

    // This will update an existing address

    public function edit(string $id)
    {
        $address = UserAddress::findOrFail($id);
        return view('user.dashboard.address.edit', compact('address'));
    }

    public function update(Request $request, string $id)
    {
        $request->validate([
            'name' => ['required', 'max:200'],
            'email' => ['required', 'max:200', 'email'],
            'phone' => ['required', 'max:200'],
            'country' => ['required', 'max:200'],
            'state' => ['required', 'max:200'],
            'city' => ['required', 'max:200'],
            'zip' => ['required', 'max:200'],
            'address' => ['required'],
        ]);

        $address = UserAddress::findOrFail($id);
        $address->user_id = Auth::user()->id;
        $address->name = $request->name;
        $address->email = $request->email;
        $address->phone = $request->phone;
        $address->country = $request->country;
        $address->state = $request->state;
        $address->city = $request->city;
        $address->zip = $request->zip;
        $address->address = $request->address;
        $address->save();

        toastr('Updated Successfully!', 'success', 'Success')->success('Updated Successfully!');

        return redirect()->route('home');
    }

    // This will delete an address

    public function destroy(string $id)
    {
        $address = UserAddress::findOrFail($id);
        $address->delete();

        return response(['status' => 'success', 'message' => 'Deleted Successfully!']);
    }
}

The controller


<?php

use App\Http\Controllers\UserProfileController;
use App\Http\Controllers\UserAddressController;
use App\Http\Controllers\UserDashboardController;
use Illuminate\Support\Facades\Route;


/** Laravel Breeze routes that update the User's username, email and password */
Route::middleware(['auth', 'verified', 'role:user'])
    ->group(function () {
        Route::get('dashboard', [UserDashboardController::class, 'dashboard'])->name('dashboard');
        Route::get('profile', [UserProfileController::class, 'index'])->name('profile');
        Route::get('address', [UserAddressController::class, 'address'])->name('address');
        Route::put('profile', [UserProfileController::class, 'updateProfile'])->name('profile.update');
        Route::post('profile', [UserProfileController::class, 'updatePassword'])->name('profile.update.password');
    });

/** User Address route */
Route::get('user/dashboard/create', [UserAddressController::class, 'create'])->name('address.create');
Route::post('user/dashboard/address', [UserAddressController::class, 'store'])->name('address.store');
Route::get('user/dashboard/address/{id}/edit', [UserAddressController::class, 'edit'])->name('address.edit');
Route::put('user/dashboard/address/{id}', [UserAddressController::class, 'update'])->name('address.update');
Route::delete('user/dashboard/address/{id}', [UserAddressController::class, 'destroy'])->name('address.destroy');
Route::get('/user/dashboard/address/index', [UserAddressController::class, 'home'])->name('home');

gych's avatar

@Mamunsson Its better to use address.index or even better 'user.dashboard.address' for the route name

Personally I name my routes always kind of similar to the route path

For example for the user dashboard address route I would use this route path, name and controller method

Route::get('/user/dashboard/address', [UserAddressController::class, 'index'])->name('user.dashboard.address');

And I also use route groups for user and dashboard to keep routes grouped, but that's not a must if you prefer to write them all separately

LaravelFan's avatar

@gych I applied the code you provided and received: Route [user.dashboard.address] not defined.

gych's avatar

@Mamunsson Are you caching the routes ? Run php artisan route:clear and make sure you don't cache the routes on local.

Or is this route file in a group with already a name and prefix set for that group? Which route file are you exactly using and where did you add it to your application ?

LaravelFan's avatar

@gych This user.php file contains all the routes for the user dashboard:


<?php

use App\Http\Controllers\UserProfileController;
use App\Http\Controllers\UserAddressController;
use App\Http\Controllers\UserDashboardController;
use Illuminate\Support\Facades\Route;


/** Laravel Breeze routes that update the User's username, email and password */
Route::middleware(['auth', 'verified', 'role:user'])
    ->group(function () {
        Route::get('dashboard', [UserDashboardController::class, 'dashboard'])->name('dashboard');
        Route::get('profile', [UserProfileController::class, 'index'])->name('profile');
        Route::get('address', [UserAddressController::class, 'address'])->name('address');
        Route::put('profile', [UserProfileController::class, 'updateProfile'])->name('profile.update');
        Route::post('profile', [UserProfileController::class, 'updatePassword'])->name('profile.update.password');
    });

/** User Address route */
Route::get('user/dashboard/create', [UserAddressController::class, 'create'])->name('address.create');
Route::post('user/dashboard/address', [UserAddressController::class, 'store'])->name('address.store');
Route::get('user/dashboard/address/{id}/edit', [UserAddressController::class, 'edit'])->name('address.edit');
Route::put('user/dashboard/address/{id}', [UserAddressController::class, 'update'])->name('address.update');
Route::delete('user/dashboard/address/{id}', [UserAddressController::class, 'destroy'])->name('address.destroy');

All I'm trying to achieve is to direct the user to the address page when they click on update address which should be handled by the route:


Route::get('address', [UserAddressController::class, 'address'])->name('address');

Snapey's avatar

@Mamunsson This is of no use unless you also tell us what prefix and namespace you have in your route service provider

gych's avatar

@Mamunsson Ok and when you added this route file user.php to your project did you already define a route name and route prefix for that group ?

LaravelFan's avatar

@gych Hi, Can you please elaborate on what you meant by "And make sure you don't cache the routes on local"?

gych's avatar

@Mamunsson Some people cache the routes in their local develpoment environment. Which should never be done. Only cache the routes in a production environment and never use php artisan route:cache in a local environment.

See this section from the Laravel docs for more info: https://laravel.com/docs/11.x/routing#route-caching

1 like
Snapey's avatar

After all we have been through together, you still think that the controller has some part to play in defining routes!

1 like
LaravelFan's avatar

    public function update(Request $request, string $id)
    {
        $request->validate([
            'name' => ['required', 'max:200'],
            'email' => ['required', 'max:200', 'email'],
            'phone' => ['required', 'max:200'],
            'country' => ['required', 'max:200'],
            'state' => ['required', 'max:200'],
            'city' => ['required', 'max:200'],
            'zip' => ['required', 'max:200'],
            'address' => ['required'],
        ]);

        $address = UserAddress::findOrFail($id);
        $address->user_id = Auth::user()->id;
        $address->name = $request->name;
        $address->email = $request->email;
        $address->phone = $request->phone;
        $address->country = $request->country;
        $address->state = $request->state;
        $address->city = $request->city;
        $address->zip = $request->zip;
        $address->address = $request->address;
        $address->save();

        toastr('Updated Successfully!', 'success', 'Success')->success('Updated Successfully!');

        return redirect()->route('user.dashboard.address');
    }

The return redirect()->route('user.dashboard.address'); should direct the user back to the address page after updating the address but it is not doing so.

LaravelFan's avatar

This is in the RouteServiceProvider.php file:


<?php

namespace App\Providers;

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * The path to your application's "home" route.
     *
     * Typically, users are redirected here after authentication.
     *
     * @var string
     */
    public const HOME = '/user/dashboard';

    /**
     * Define your route model bindings, pattern filters, and other route configuration.
     */
    public function boot(): void
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });

        $this->routes(function () {
            Route::middleware('api')
                ->prefix('api')
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->group(base_path('routes/web.php'));

            Route::middleware(['web', 'auth', 'role:admin'])
                ->prefix('admin')
                ->as('admin.')
                ->group(base_path('routes/admin.php'));

            Route::middleware(['web', 'auth', 'role:vendor'])
                ->prefix('vendor')
                ->as('vendor.')
                ->group(base_path('routes/vendor.php'));

                Route::middleware(['web', 'auth', 'role:user'])
                ->prefix('user')
                ->as('user.')
                ->group(base_path('routes/user.php'));
        });
    }
}

LaravelFan's avatar

If I put it like this: return redirect()->route('about'); It will show the about page which has this route in the web.php file:


/** About us page route */
Route::get('/about', [AboutController::class, 'about'])->name('about');

Snapey's avatar

@Mamunsson And the web.php has no prefix() and no as() so is not at all relevant.

Snapey's avatar

@Mamunsson

If you have this

Route::get('address', [UserAddressController::class, 'address'])->name('address');

in your user.php routes file, then because of the settings in route service provider this translates to a route of /user/address and a route NAME of 'user.address'

What made you think it was called home.address ?

LaravelFan's avatar

@Snapey That did it! Many thanks indeed. I need to understand this better.

Because I tried it like this: return redirect()->route('address'); and it didn't work.

This is how I did it now in light of your guidance:


<?php

use App\Http\Controllers\UserProfileController;
use App\Http\Controllers\UserAddressController;
use App\Http\Controllers\UserDashboardController;
use Illuminate\Support\Facades\Route;


/** Laravel Breeze routes that update the User's username, email and password */
Route::middleware(['auth', 'verified', 'role:user'])
    ->group(function () {
        Route::get('dashboard', [UserDashboardController::class, 'dashboard'])->name('dashboard');
        Route::get('profile', [UserProfileController::class, 'index'])->name('profile');
        Route::get('address', [UserAddressController::class, 'address'])->name('address');
        Route::put('profile', [UserProfileController::class, 'updateProfile'])->name('profile.update');
        Route::post('profile', [UserProfileController::class, 'updatePassword'])->name('profile.update.password');
    });

/** User Address route */
Route::get('user/dashboard/create', [UserAddressController::class, 'create'])->name('address.create');
Route::post('user/dashboard/address', [UserAddressController::class, 'store'])->name('address.store');
Route::get('user/dashboard/address/{id}/edit', [UserAddressController::class, 'edit'])->name('address.edit');
Route::put('user/dashboard/address/{id}', [UserAddressController::class, 'update'])->name('address.update');
Route::delete('user/dashboard/address/{id}', [UserAddressController::class, 'destroy'])->name('address.destroy');
Route::get('/user/address', [UserAddressController::class, 'address'])->name('user.address');

And: return redirect()->route('user.address');

Snapey's avatar

@Mamunsson Why do you have the address route declared twice?

You also have the middleware twice. Once in your service provider and then again in the user.php routes file.

LaravelFan's avatar

@Snapey Because if I remove it, I get: Route [user.address] not defined. I don't know what to do about it.

LaravelFan's avatar

@snapey This is how I did it now:


/** Laravel Breeze routes that update the User's username, email and password */
Route::middleware(['auth', 'verified', 'role:user'])
    ->group(function () {
        Route::get('dashboard', [UserDashboardController::class, 'dashboard'])->name('dashboard');
        Route::get('profile', [UserProfileController::class, 'index'])->name('profile');
        Route::get('user/address', [UserAddressController::class, 'address'])->name('address');
        Route::put('profile', [UserProfileController::class, 'updateProfile'])->name('profile.update');
        Route::post('profile', [UserProfileController::class, 'updatePassword'])->name('profile.update.password');
    });

/** User Address route */
Route::get('user/dashboard/create', [UserAddressController::class, 'create'])->name('address.create');
Route::post('user/dashboard/address', [UserAddressController::class, 'store'])->name('address.store');
Route::get('user/dashboard/address/{id}/edit', [UserAddressController::class, 'edit'])->name('address.edit');
Route::put('user/dashboard/address/{id}', [UserAddressController::class, 'update'])->name('address.update');
Route::delete('user/dashboard/address/{id}', [UserAddressController::class, 'destroy'])->name('address.destroy');

LaravelFan's avatar

@Snapey This is how I tried to put it:


Route::middleware(['web', 'auth', 'role:user'])
    ->prefix('user')
    ->as('user.')
    ->group(function () {
        Route::group(['middleware' => 'web'], function () {
            Route::get('dashboard', [UserDashboardController::class, 'dashboard'])->name('dashboard');
            Route::get('profile', [UserProfileController::class, 'index'])->name('profile');
            Route::get('user/address', [UserAddressController::class, 'address'])->name('address');
            Route::put('profile', [UserProfileController::class, 'updateProfile'])->name('profile.update');
            Route::post('profile', [UserProfileController::class, 'updatePassword'])->name('profile.update.password');
        });
    })->group(base_path('routes/user.php'));

And removed this part from the RouteServiceProvider:


Route::middleware(['web', 'auth', 'role:user'])
                ->prefix('user')
                ->as('user.')
                ->group(base_path('routes/user.php'));

The user dashboard stopped working.

Snapey's avatar
Snapey
Best Answer
Level 122

@Mamunsson you need to get past blindly copy and paste solutions and try and understand what the code is saying

in your route service provider you had

Route::middleware(['web', 'auth', 'role:user'])
                ->prefix('user')
                ->as('user.')
                ->group(base_path('routes/user.php'));

which means that every route inside the user.php file requires web middleware, that the user is authenticated and that they have a role of user.

so in user.php there is no need to reference the same middleware again

1 like
LaravelFan's avatar

@Snapey Hi, Many thanks for the clear explanation. I'm very grateful for your guidance and support.

Please or to participate in this conversation.