我对laravel很新(使用5.2是迄今为止的最新版本),因此我遇到了以下困境:我知道Laravel开箱即用了User
类,但我想要开发一个系统,我可以有另外两种类型的用户Researcher
和Admin
。
我主要需要创建完全不同的用户类(Researcher和Admin),可能继承自User
,因为业务逻辑几乎100%不同,我不想在数据库中创建一个列分类用户的类型。此外,库存User
,Admin
和Researcher
类之间的字段不重叠。
我的主要问题是:如果我从User
继承我的其他2个类,那么一切都会一样吗(Auth Controller,中间件启用等等)?我知道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 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
&amp; 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框架。
干杯!
答案 0 :(得分:1)
是的,您可以扩展课程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
} class
事实上,如果您办理登机手续:
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
创建模型的实例。因此,如果要创建一个类而不是User
的实例,则应覆盖此提供程序(或创建自己的一个),在这里您可以选择要实例化的类
答案 1 :(得分:0)
我认为,使用此概念的最佳方法是使用角色并保持用户类完好无损。有关详细信息,请参见https://github.com/spatie/laravel-permission。