Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel身份验证上的BadMethodCallException_Php_Laravel_Authentication - Fatal编程技术网

Php laravel身份验证上的BadMethodCallException

Php laravel身份验证上的BadMethodCallException,php,laravel,authentication,Php,Laravel,Authentication,我正在尝试在laravel中使用多个表来分离用户角色进行身份验证,这是一个学术性的练习,所以我不能用任何其他方法来做 BadMethodCallException Method App\Http\Controllers\Auth\RegisterController::create does not exist. 当我尝试在数据库中注册用户时,会出现此错误。我知道这是重定向发生的时候 所以。。。以下是我从web.php的路线: use Illuminate\Support\Facades\R

我正在尝试在laravel中使用多个表来分离用户角色进行身份验证,这是一个学术性的练习,所以我不能用任何其他方法来做

BadMethodCallException
Method App\Http\Controllers\Auth\RegisterController::create does not exist. 
当我尝试在数据库中注册用户时,会出现此错误。我知道这是重定向发生的时候

所以。。。以下是我从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');
这是来自App\Controller\Auth\RegisterController的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']);
    }

}
用户和管理员的模型:

用户:

管理员:

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

您的控制器包含一个特性:
使用注册表用户检查其中的方法,查看其中是否有一个调用了
create()
method。您在这里部分包含的错误消息也有发生错误的行号……最初我在RegisterUsers()中没有看到任何create()方法,除了在第34行中有
事件(new registed($user=$this->create($request->all())。它位于函数寄存器(Request$Request){[…]}
中,您需要重写RegisterController中registerUsers trait中的
register()
方法。trait中的register方法调用RegisterController上的create()方法。因为你有createUser和createAdmin而不是create,你需要在你的controllerI中重写register方法。我认为这不是解决方案,如果你看我最后的教程,它没有任何方法的重写,用户的创建是通过
User::create([…])中的一个模型完成的好的。只需从路由文件中删除
Auth::routes()
Auth::routes()
的路由声明位于自定义注册路由之前,因此优先。这就是为什么要使用create()方法。删除Auth::routes,它应该按照

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