I'm trying to make an authentication in laravel with multiple tables to separate user roles, is an academic exercise, so I can't do it any other way.
BadMethodCallException
Method App\Http\Controllers\Auth\RegisterController::create does not exist.
This error comes up when I try to register a user in the database. I understand that this is when the redirection occurs.
So... these are my routes from web.php:
use Illuminate\Support\Facades\Route;
use App\Http\Controllers;
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/login/admin', [App\Http\Controllers\Auth\LoginController::class,'showAdminLoginForm']);
Route::get('/login/user', [App\Http\Controllers\Auth\LoginController::class,'showUserLoginForm']);
Route::get('/register/admin', [App\Http\Controllers\Auth\RegisterController::class,'showAdminRegisterForm']);
Route::get('/register/user', [App\Http\Controllers\Auth\RegisterController::class,'showUserRegisterForm']);
Route::post('/login/admin', [App\Http\Controllers\Auth\LoginController::class,'adminLogin']);
Route::post('/login/user', [App\Http\Controllers\Auth\LoginController::class,'userLogin']);
Route::post('/register/admin', [App\Http\Controllers\Auth\RegisterController::class,'createAdmin']);
Route::post('/register/user', [App\Http\Controllers\Auth\RegisterController::class,'createUser']);
Route::view('/home', 'home')->middleware('auth');
Route::view('/admin', 'admin');
Route::view('/user', 'user');
This is the RegisterController from App\Controllers\Auth\RegisterController:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Models\User;
use App\Models\Admin;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
class RegisterController extends Controller
{
use RegistersUsers;
protected $redirectTo = RouteServiceProvider::HOME;
public function __construct()
{
$this->middleware('guest');
$this->middleware('guest:admin');
$this->middleware('guest:user');
}
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
//USER STUFF
protected function createUser(Request $request)
{
$this->validator($request->all())->validate();
$user = User::create([
'username' => $request['username'],
'name' => $request['name'],
'email' => $request['email'],
'password' => Hash::make($request['password']),
]);
return redirect()->intended('login/user');
}
public function showUserRegisterForm()
{
return view('auth.register', ['url' => 'user']);
}
//ADMIN STUFF
protected function createAdmin(Request $request)
{
$this->validator($request->all())->validate();
$admin = Admin::create([
'username' => $request['username'],
'name' => $request['name'],
'email' => $request['email'],
'password' => Hash::make($request['password']),
]);
return redirect()->intended('login/admin');
}
public function showAdminRegisterForm()
{
return view('auth.register', ['url' => 'admin']);
}
}
Also I think that this is necessary, the auth.php file, where guards are defined:
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
'hash' => false,
],
'user' => [
'driver' => 'session',
'provider' => 'users',
'hash' => false,
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
Models for user and admin:
User:
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
protected $guard = 'user';
protected $fillable = [
'username',
'name',
'email',
'password',
];
protected $hidden = [
'password',
'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
}
Admin:
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
protected $guard = 'admin';
protected $fillable = [
'username',
'name',
'email',
'password',
];
protected $hidden = [
'password',
'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
}
I'm not sure if I forgot something, but I've been stuck in the same error for several hours and I can't see what I'm doing wrong... In any case I will edit this with the necessary information if I have forgotten something.
In case it is necessary and to provide more information that I think is important, I'll add the link to the tutorial that I've been following, if someone knows how to fix it, or finds the bug. https://pusher.com/tutorials/multiple-authentication-guards-laravel