您能帮助我理解扩展现有模型的正确方法吗?我正在开发一个程序包,并希望与主应用程序尽可能地分开。
我想拥有User
模型的所有现有功能,但只添加与另一个模型的关系。在我的包裹User
中,我可以有几个(hasMany
)Article
。我没有在\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',
],
],
我的问题:扩展现有模型的功能是否是“最佳做法”?
答案 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 {
...
}
希望对某人有意义