【问题标题】:Laravel 7 Muti Auth using Laravel UILaravel 7 Muti Auth 使用 Laravel UI
【发布时间】:2020-12-18 17:02:01
【问题描述】:

我正在为我叔叔的商店开发一个小型食品网站。网店可以有不同类型的用户:管理员、客户和送货员。

每个用户在数据库中都有不同的表。我也相应地更新了 config/auth.php 但仍然无法正常工作。当我尝试注册客户时,它会抛出错误:

Argument 2 passed to Illuminate\Auth\SessionGuard::__construct() must implement interface Illuminate\Contracts\Auth\UserProvider, null given, called in /var/www/html/pizzaShop/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 125

配置/auth.php

return [

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'customers',
    ],

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
        'customer' => [
            'driver' => 'session',
            'provider' => 'customers',
        ],
        'delivery_boy' => [
            'driver' => 'session',
            'provider' => 'delivery_boys',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'customers',
            'hash' => false,
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

        'admin' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
        'customer' => [
            'driver' => 'eloquent',
            'model' => App\Customer::class,
        ],
        'delivery_boy' => [
            'driver' => 'eloquent',
            'model' => App\DeliveryBoy::class,
        ],

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


    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],

    'password_timeout' => 10800,

];

在 COntroller/Auth 下注册控制器

class RegisterController extends Controller
{
    
    use RegistersUsers;
    protected $redirectTo = RouteServiceProvider::HOME;
    public function __construct()
    {
        $this->middleware('guest');
        $this->middleware('guest:admin');
        $this->middleware('guest:customer');
        $this->middleware('guest:delivery_boy');
    }
    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'],
        ]);
    }
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
    public function viewRegisterForm() {
        return View('frontend.customer.auth-view', ['authType'=>'register']);
    }
    public function registerUser(Request $request) {
        dd($request);
        return View('frontend.customer.auth-view', ['authType'=>'register']);
    }
}

我注册的网络路由

Route::get('/auth/', function () {
    return view('frontend.customer.auth-view');
});
Route::group(['prefix' => 'auth'], function () {
    Route::get('register/', 'Auth\RegisterController@viewRegisterForm');
    Route::post('register/', 'RegisterController@registerUser');

    Route::get('login/', 'Auth\LoginController@viewLoginForm');
    Route::post('login/', 'LoginController@loginUser');

});
Auth::routes();

我使用的是我自己的视图,而不是由 Laravel UI 创建的,但我的视图的表单路由是 action="{{ route('login') }}"action="{{ route('register') }}"。我希望这应该不是问题。

通过浏览器导航注册的网址:

http://localhost:8000/auth/register

和错误

我正在使用 laravel 7 和 php7.4。

【问题讨论】:

    标签: php laravel laravel-7 laravel-ui


    【解决方案1】:

    您没有名为adminscustomersdelivery_boys 的用户提供程序,因为某些警卫正在寻找'provider'。你用单数命名它们:

    'providers' => [
        'users' => [...],
        'admin' => [...],
        'customer' => [...],
        'delivery_boy' => [...],
    ]
    

    【讨论】:

    • 感谢您的回答,但是如何覆盖 laravel UI 的路由?目前我的注册路线是auth/register,但如果用户在我的主机上输入www.example.com/register,laravel 应用程序会将其带到由 laravel UI 创建的www.example.com/register
    • 覆盖哪些路由?你不能打电话给Auth::routes()
    • 如何修改Auth::routes()中的路由?
    • 你不能修改它们,你唯一能做的就是将选项传递给Auth::routes() 以阻止它注册某些路由集......否则只需注册你自己想要的路由并不要不要打电话给Auth::routes()
    猜你喜欢
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2015-11-16
    • 2016-12-01
    • 2020-07-05
    • 2023-03-27
    相关资源
    最近更新 更多