我可以在Laravel 5.2中创建一个继承自User的新类吗



我对laravel还很陌生(使用5.2,这是迄今为止的最新版本),因此我面临以下困境:我知道laravel附带了一个现成的User类,但我想开发一个系统,在这个系统中,我可以拥有另外两种类型的用户,即ResearcherAdmin

我的主要需求是创建完全不同的用户类别(研究员和管理员),可能继承自User,因为它们之间的业务逻辑几乎100%不同,我不想在数据库中创建一列来分类用户类型。此外,在库存UserAdminResearcher类之间没有太多重叠的字段。

我的主要问题是:如果我为其他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
} 

我认为您真正的问题是:如何在身份验证过程中实例化类ResearcherAdmin,而不是User

如果使用Eloquent作为身份验证驱动程序,默认情况下Laravel将使用IlluminateAuthEloquentUserProvider来创建Model的实例。因此,如果你想创建一个实例,而不是User,你应该覆盖这个提供程序(或者创建一个你自己的),在这里你可以选择实例化的类

我认为使用这个概念的最佳方式是使用角色并保持用户类的完整性。看见https://github.com/spatie/laravel-permission详细信息。

最新更新