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

时间:2016-01-07 10:59:07

标签: php oop laravel laravel-5 laravel-5.2

我对laravel很新(使用5.2是迄今为止的最新版本),因此我遇到了以下困境:我知道Laravel开箱即用了User类,但我想要开发一个系统,我可以有另外两种类型的用户ResearcherAdmin

我主要需要创建完全不同的用户类(Researcher和Admin),可能继承自User,因为业务逻辑几乎100%不同,我不想在数据库中创建一个列分类用户的类型。此外,库存UserAdminResearcher类之间的字段不重叠。

我的主要问题是:如果我从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框架。

干杯!

2 个答案:

答案 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
} 

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

如果您使用Eloquent作为身份验证驱动程序,默认情况下Laravel将使用Illuminate\Auth\EloquentUserProvider创建模型的实例。因此,如果要创建一个类而不是User的实例,则应覆盖此提供程序(或创建自己的一个),在这里您可以选择要实例化的类

答案 1 :(得分:0)

我认为,使用此概念的最佳方法是使用角色并保持用户类完好无损。有关详细信息,请参见https://github.com/spatie/laravel-permission