Исключение Badmethod callexception при проверке подлинности laravel

#php #laravel #authentication

#php #laravel #проверка подлинности

Вопрос:

Я пытаюсь выполнить аутентификацию в laravel с несколькими таблицами для разделения ролей пользователей, это академическое упражнение, поэтому я не могу сделать это другим способом.

 BadMethodCallException
Method AppHttpControllersAuthRegisterController::create does not exist. 
 

Эта ошибка возникает, когда я пытаюсь зарегистрировать пользователя в базе данных. Я понимаю, что именно тогда происходит перенаправление.

Итак … это мои маршруты из web.php:

 use IlluminateSupportFacadesRoute;
use AppHttpControllers;


Route::get('/', function () {
    return view('welcome');
}); 

Auth::routes();

Route::get('/home', [AppHttpControllersHomeController::class, 'index'])->name('home');


Route::get('/login/admin', [AppHttpControllersAuthLoginController::class,'showAdminLoginForm']);
Route::get('/login/user', [AppHttpControllersAuthLoginController::class,'showUserLoginForm']); 
Route::get('/register/admin', [AppHttpControllersAuthRegisterController::class,'showAdminRegisterForm']);
Route::get('/register/user', [AppHttpControllersAuthRegisterController::class,'showUserRegisterForm']);

Route::post('/login/admin', [AppHttpControllersAuthLoginController::class,'adminLogin']);
Route::post('/login/user', [AppHttpControllersAuthLoginController::class,'userLogin']);
Route::post('/register/admin', [AppHttpControllersAuthRegisterController::class,'createAdmin']);
Route::post('/register/user', [AppHttpControllersAuthRegisterController::class,'createUser']);

Route::view('/home', 'home')->middleware('auth');
Route::view('/admin', 'admin');
Route::view('/user', 'user');
 

Это RegisterController из App Controllers Auth RegisterController:

 <?php

namespace AppHttpControllersAuth;

use AppHttpControllersController;
use AppProvidersRouteServiceProvider;
use AppModelsUser;
use AppModelsAdmin;
use IlluminateFoundationAuthRegistersUsers;
use IlluminateSupportFacadesHash;
use IlluminateSupportFacadesValidator;
use IlluminateHttpRequest;

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']);
    }

}
 

Также я думаю, что это необходимо, auth.php файл, в котором определены охранники:

     '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' => AppModelsUser::class,
        ],

        'admins' => [
            'driver' => 'eloquent',
            'model' => AppModelsAdmin::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],
 

Models for user and admin:

User:

 
namespace AppModels;

use IlluminateContractsAuthMustVerifyEmail;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;

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',
    ];
}
 

Администратор:

 <?php

namespace AppModels;

use IlluminateContractsAuthMustVerifyEmail;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;

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',
    ];
}
 

Я не уверен, что я что-то забыл, но я застрял в одной и той же ошибке в течение нескольких часов, и я не вижу, что я делаю неправильно… В любом случае я отредактирую это с необходимой информацией, если я что-то забыл.

В случае необходимости и для предоставления дополнительной информации, которая, на мой взгляд, важна, я добавлю ссылку на руководство, которому я следую, если кто-то знает, как это исправить, или обнаружит ошибку. https://pusher.com/tutorials/multiple-authentication-guards-laravel

Комментарии:

1. Ваш контроллер включает в себя функцию: use RegistersUsers; проверьте методы в нем, чтобы увидеть, вызывает ли один из них create() метод. Сообщение об ошибке, которое вы частично включаете здесь, также содержит номер строки, в которой произошла ошибка…

2. изначально я не вижу никакого метода create() в RegisterUsers(), за исключением строки 34, где есть event(new Registered($user = $this->create($request->all()))); . который находится внутри function register(Request $request){ [...] }

3. Вам нужно будет переопределить register() метод из признака RegistersUsers в вашем RegisterController. Метод register в черте вызывает метод create() в RegisterController. Поскольку у вас есть CreateUser и createAdmin вместо create, вам нужно будет переопределить метод register в вашем контроллере

4. Я думаю, что это не решение, если вы посмотрите на учебник, который я привел в конце, в нем нет никакого переопределения какого-либо метода, создание пользователей выполняется с помощью модели в User::create([...]);

5. Хорошо. Просто удалите Auth::routes() из файла routes. Объявления маршрута с помощью Auth::routes() находится перед вашими пользовательскими маршрутами регистрации и, следовательно, имеют приоритет. Вот почему вы нажимаете метод create(). Удалите Auth::routes, и он должен работать в соответствии с туром