软件包中的扩展用户模型

时间:2018-10-12 08:11:51

标签: laravel laravel-5.7 package-development

您能帮助我理解扩展现有模型的正确方法吗?我正在开发一个程序包,并希望与主应用程序尽可能地分开。

我想拥有User模型的所有现有功能,但只添加与另一个模型的关系。在我的包裹User中,我可以有几个(hasManyArticle。我没有在\App\User包中创建新模型,而没有在class User extends \App\User中添加方法:

namespace Package\Sample;

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;

/**
 * Class User
 * @package Package\Sample
 */
class User extends \App\User
{
    use HasApiTokens, Notifiable;

    public function articles()
    {
        return $this->hasMany(Article::class);
    }
}

要使其正常工作,请添加我的软件包auth.php的配置:

'providers' => [
        'users' => [
        'driver' => 'eloquent',
        'model'  => \Package\Sample\User::class,
    ],
],
'guards' => [
        'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

我的问题:扩展现有模型的功能是否是“最佳做法”?

3 个答案:

答案 0 :(得分:1)

这将阻止在\Package\Sample\User::class上进行编辑。任何需要的新方法都将导致软件包更新。

为什么不在包含您的方法的程序包中声明特征,并像laravel所使用的那样在App\User::class中使用它们。

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

答案 1 :(得分:0)

您需要将config(['auth.providers.users.model' => Myname\Myproject\App\Models\User::class]);添加到我的package-service-provider内部的引导方法中。

然后在您的程序包中创建新的类。

namespace Myname\Myproject\App\Models;

class User extends \App\User
{

    public function roles(){
        return $this->belongsToMany('Myname\Myproject\App\Models\Role', 'user_role', 'user_id', 'role_id');
    }
}

答案 2 :(得分:0)

我通过使用class_alias() php函数解决了这个问题。

在我的包裹服务提供商中,我设置了/config/auth.php中为身份验证定义的模型类的别名,如下所示:

public function boot(){   

       class_alias(config("auth.providers.users.model"), 'ParentModel');

}

然后我在需要的地方使用ParentModel类:

use ParentModel;

class Agent extends ParentModel {
...

}

希望对某人有意义