laravel 如何 new php 类,关于php:我可以在Laravel 5.2中创建一个从User继承的新类吗?...

我对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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值