我对laravel相当陌生(使用5.2是迄今为止的最新版本),因此我面临以下难题:我知道Laravel附带了一个User类,但是我想开发一个系统来我可以有另外两种类型的用户,分别称为Researcher和Admin。
我的主要需求是创建完全不同的用户类(Researcher和Admin),可能从User继承,因为业务逻辑之间几乎有100%的差异,并且我不想在数据库中创建列来对类型进行分类用户。此外,股票User,Admin和Researcher类之间没有太多重叠的字段。
我的主要问题是:如果我从其他两个类的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看起来像这样:
namespace App;
use Illuminate\Foundation\Auth\User 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继承来创建其他2个类(Researcher和Admin):
//Researcher Class:
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Researcher extends Authenticatable
{
//Class definition...
}
...
//Admin Class:
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
//Class definition
}
在这种方法中,我试图"模仿" User类。问题是我不知道内核中是否有任何逻辑经过硬编码并隐式引用到User类。
任何想法和帮助将不胜感激。抱歉,这对您来说很愚蠢。我刚刚开始使用laravel框架。
干杯!
如果您正在寻找要认证的多个类,请阅读以下主题:stackoverflow.com/questions/34490600/希望对您有所帮助!
是的,您可以扩展类Illuminate\Foundation\Auth\User:
use Illuminate\Foundation\Auth\User 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足以与Illuminate\Contracts\Auth\Authenticatable接口一起使用来处理身份验证,而不是直接与User类一起使用
实际上,如果您签入:
Illuminate/Auth/SessionGuard.php
这是auth处理的主要类,您会看到所有auth操作都是针对Illuminate\Contracts\Auth\Authenticatable接口执行的,即:
/**
* Log a user into the application.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param bool $remember
* @return void
*/
public function login(AuthenticatableContract $user, $remember = false)
{
//other code
}
我认为您真正的问题是:如何在身份验证过程中实例化类Researcher和Admin而不是User类?
如果您使用Eloquent作为身份验证驱动程序,则默认情况下,Laravel将使用Illuminate\Auth\EloquentUserProvider创建Model的实例。因此,如果要创建一个实例而不是User,则应该重写此提供程序(或创建自己的实例),然后在此处可以选择要实例化的类
我认为最好的办法就是采用您的方法。 我唯一想知道的是我将在哪里注册该新提供商? 我假设在App\config\app.php下对吗? 我的第一个想法是同时在Illuminate\Auth` as EloquentAdminProvider`和EloquentResearcherProvider下创建,但是由于它不是Illuminates软件包的一部分,因此没有太大意义。 我想我会在自定义目录" App Custom Providers"下创建这两个提供程序。
@JackGal:您可以创建一个自定义服务提供商,同时可以注册新的EloquentResearcherProvider。 并让应用使用它代替默认的EloquentUserProvider。 您永远不要在vendor文件夹下编写代码
我认为,使用此概念的最佳方法是使用角色并保持用户类完整。有关详细信息,请参见https://github.com/spatie/laravel-permission。