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

laracasts9924's avatar

Laravel Route Invalid Argument Exception Error

I am running Laravel 5.3.30. I am trying to create and admin section using an admin folder placing controllers and views. For some reason, I keep getting this error even though the routes are in my route file. Here is an example of Messages: I have multiple other pieces of data types such as links, users, widget and all of these that are in the admin folder are acting the same.

Messages Controller which is in app\Http\Controllers\admin\MessageController.php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request; use App\Http\Controllers\Controller;

use App\Message; use Redirect;

class MessageController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $messages = Message::all();

    return view('admin.message.index', compact('messages'));
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    return view('admin.message.create');
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
    $this->validate($request, [

      'name'          => 'required|string|max:30',
      'message_text'  => 'required',

    ]);

    $message = Message::create(['name'           => $request->name,
                                'message_text' => $request->message_text,
                              ]);

    $message->save();

    alert()->success('Congrats!', 'You made a Message');

    return Redirect::route('admin.message.index');
}

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
 public function show($id)
 {
     $message = Message::findOrFail($id);
     return view('admin.message.show', compact('message'));
 }

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id)
{
  $message = Message::findOrFail($id);
  return view('admin.message.edit', compact('message'));
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id)
{
  $this->validate($request, [
    'name'              => 'required|string|max:30',
    'message_text'  => 'required',
  ]);

  $message = Message::findOrFail($id);

  $message->update(['name'              => $request->name,
                    'message_text'  => $request->message_text,
                    ]);

  $message->save();

  alert()->success('Congrats!', 'You updated a message');

  return Redirect::route('admin.message.index');
}

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
  Message::destroy($id);

  alert()->overlay('Attention!', 'You deleted a message', 'error');

  return Redirect::route('admin.message.index');
}

}

my Message Index View in resources\views\admin\message\index.blade.php @extends('layouts.app')

@section('title')

<title>Messages</title>

@endsection

@section('content')

<ol class='breadcrumb'>
    <li><a href='{{ url('/') }}'>Home</a></li>
    <li><a href='{{ url('/') }}/admin/message'>Messages</a></li>
    <li class='active'>Create</li>
</ol>

<h2>Messages</h2>

<hr/>

@if($messages->count() > 0)

    <table class="table table-hover table-bordered table-striped">

     <thead>
     <th>Id</th>
     <th>Name</th>
     <th>Message</th>
     <th>Date Created</th>
     </thead>

        <tbody>

        @foreach($messages as $message)

            <tr>
                <td>{{ $message->id }}</td>
                <td><a href="{{ url('/') }}/admin/message/{{ $message->id }}">{{ $message->name }}</a></td>

                <td>{{ $message->message_text }}</td>
                <td>{{ $message->created_at }}</td>
            </tr>

            @endforeach

        </tbody>

    </table>


@else

Sorry, no Messages

@endif
<div> <a href="{{ url('/') }}/admin/message/create">
<button type="button" class="btn btn-lg btn-primary">
Create New
</button></a>
</div>

@endsection

my route for Message:

Route::group(['prefix' => 'admin', 'namespace' => 'admin', 'middleware' => 'admin'], function() {

/** Message **/ Route::resource('message', 'MessageController');

});

I have created an admin middlware and added a new column to the user table is_admin.

namespace App\Http\Middleware;

use Closure; use Illuminate\Contracts\Auth\Guard; use Illuminate\Http\RedirectResponse;

class AdminAuthentication { protected $auth;

public function __construct(Guard $auth)
{
    $this->auth = $auth;
}

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if ($this->auth->check())
    {
        if ($this->auth->user()->is_admin == true)
        {
            return $next($request);
        }
    }
    return new RedirectResponse(url('/'));
}

}

and added it to Kernel.hp protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'admin' => \App\Http\Middleware\AdminAuthentication::class, ];

here is a copt of my php artisan route list for messages:

| POST | admin/message | message.store | App\Http\Controllers\admin\MessageController@store | web,admin | | | GET|HEAD | admin/message | message.index | App\Http\Controllers\admin\MessageController@index | web,admin | | | GET|HEAD | admin/message/create | message.create | App\Http\Controllers\admin\MessageController@create | web,admin | | | GET|HEAD | admin/message/{message} | message.show | App\Http\Controllers\admin\MessageController@show | web,admin | | | PUT|PATCH | admin/message/{message} | message.update | App\Http\Controllers\admin\MessageController@update | web,admin | | | DELETE | admin/message/{message} | message.destroy | App\Http\Controllers\admin\MessageController@destroy | web,admin | | | GET|HEAD | admin/message/{message}/edit | message.edit | App\Http\Controllers\admin\MessageController@edit | web,admin |

and then the original ones are there:

| POST | api/messages | messages.store | App\Http\Controllers\MessagesapiController@store | web | | | GET|HEAD | api/messages | messages.index | App\Http\Controllers\MessagesapiController@index | web | | | GET|HEAD | api/messages/create | messages.create | App\Http\Controllers\MessagesapiController@create | web | | | DELETE | api/messages/{message} | messages.destroy | App\Http\Controllers\MessagesapiController@destroy | web | | | PUT|PATCH | api/messages/{message} | messages.update | App\Http\Controllers\MessagesapiController@update | web | | | GET|HEAD | api/messages/{message} | messages.show | App\Http\Controllers\MessagesapiController@show | web | | | GET|HEAD | api/messages/{message}/edit | messages.edit | App\Http\Controllers\MessagesapiController@edit | web |

so when I first created my Laravel project I did not have an admin area. I just added it. So I am thinking with the original routes and now the new admin routes the confusion is happening. So is there a command to flush out the original routes??? How do I get rid of the original routes so only my admin/messages routes are the only one.

Am I wrong in thinking that having original message routes and the admin routes are not the issue??

Any help would be greatly appreciated!!

Thanks,

Darren

0 likes
2 replies
laracasts9924's avatar

Please ignore my first though. The original messages routes are my routes for the api which I use for React JS.

So here is my routes that deal with admin messages:

| POST | admin/message | message.store | App\Http\Controllers\admin\MessageController@store | web,admin | | | GET|HEAD | admin/message | message.index | App\Http\Controllers\admin\MessageController@index | web,admin | | | GET|HEAD | admin/message/create | message.create | App\Http\Controllers\admin\MessageController@create | web,admin | | | GET|HEAD | admin/message/{message} | message.show | App\Http\Controllers\admin\MessageController@show | web,admin | | | PUT|PATCH | admin/message/{message} | message.update | App\Http\Controllers\admin\MessageController@update | web,admin | | | DELETE | admin/message/{message} | message.destroy | App\Http\Controllers\admin\MessageController@destroy | web,admin | | | GET|HEAD | admin/message/{message}/edit | message.edit | App\Http\Controllers\admin\MessageController@edit | web,admin |

and I keep getting error that admin.messages.index is not defined

laracasts9924's avatar
laracasts9924
OP
Best Answer
Level 5

Never mind figured out my issues. Here is what was going on for any future users who might run into this issues. in my messages controller, I was confusing return view('admin.message.index') and Redirect::route('admin.message.index'). I was using the view in the Redirect::route() which was the problem. So to fix the issue I had to change the following from

return Redirect::route('admin.message.index');

to

return Redirect::route('message.index');

Please or to participate in this conversation.