我对laravel还很陌生(使用5.2,这是迄今为止的最新版本),因此我面临以下困境:我知道laravel附带了一个现成的User
类,但我想开发一个系统,在这个系统中,我可以拥有另外两种类型的用户,即Researcher
和Admin
。
我的主要需求是创建完全不同的用户类别(研究员和管理员),可能继承自User
,因为它们之间的业务逻辑几乎100%不同,我不想在数据库中创建一列来分类用户类型。此外,在库存User
、Admin
和Researcher
类之间没有太多重叠的字段。
我的主要问题是:如果我为其他2个类继承User
,那么所有东西都能正常工作吗?我知道OOP的原理,凭直觉,我认为如果我做以下事情,我应该没事:
//'Stock' User class:
//
class User extends Authenticatable{
//Any overlapping logic between Researcher and Admin.
}
class Researcher extends User{
//My class definition here.
}
class Admin extends User{
//My class definition here.
}
然后使用这两个类,就像我通常使用类User
的实例一样。我的意思是使用所有的方法和开箱即用的User
功能。
问题扩展:在写问题的时候,我意识到User
类默认情况下是这样的:
<?php
namespace App;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
我不能只做以下事情而不是从User
继承来创建我的其他两个类(Researcher
&Admin
)吗:
//Researcher Class:
namespace App;
use IlluminateFoundationAuthUser as Authenticatable;
class Researcher extends Authenticatable
{
//Class definition...
}
...
//Admin Class:
namespace App;
use IlluminateFoundationAuthUser as Authenticatable;
class Admin extends Authenticatable
{
//Class definition
}
在这种方法中,我试图"模仿"User
类。问题是,我不知道内核中是否有任何逻辑是硬编码的,并且被隐式引用到User
类。
任何想法和帮助都将不胜感激。对不起,如果这对你来说很傻。我刚开始使用laravel框架。
干杯!
是的,您可以扩展类IlluminateFoundationAuthUser
:
use IlluminateFoundationAuthUser as Authenticatable;
class Researcher extends Authenticatable {
//My class definition here.
}
如果你看一下User
类:
class User extends Model implements
AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword;
}
您可以看到,它扩展了Model
类,并实现了用于身份验证处理的所有其他有用接口
您可以安全地扩展User
类,因为Laravel足够好,可以使用IlluminateContractsAuthAuthenticatable
接口来处理身份验证,而不是直接使用User
类
事实上,如果你办理登机手续:
Illuminate/Auth/SessionGuard.php
这是身份验证处理的主要类,您将看到所有的身份验证操作都是针对IlluminateContractsAuthAuthenticatable
接口进行的,即:
/**
* Log a user into the application.
*
* @param IlluminateContractsAuthAuthenticatable $user
* @param bool $remember
* @return void
*/
public function login(AuthenticatableContract $user, $remember = false)
{
//other code
}
我认为您真正的问题是:如何在身份验证过程中实例化类Researcher
和Admin
,而不是User
?
如果使用Eloquent作为身份验证驱动程序,默认情况下Laravel将使用IlluminateAuthEloquentUserProvider
来创建Model的实例。因此,如果你想创建一个实例,而不是User
,你应该覆盖这个提供程序(或者创建一个你自己的),在这里你可以选择实例化的类
我认为使用这个概念的最佳方式是使用角色并保持用户类的完整性。看见https://github.com/spatie/laravel-permission详细信息。