1

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

我想拥有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',
    ],
],

我的问题:扩展现有模型的功能是“最佳实践”吗?

4

4 回答 4

1

我通过使用class_alias()php 函数解决了它。

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

public function boot(){   

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

}

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

use ParentModel;

class Agent extends ParentModel {
...

}

希望这对某人有意义

于 2019-11-12T12:34:54.013 回答
1

这将阻止对\Package\Sample\User::class. 任何需要的新方法都会导致包更新。

为什么不在你的包中声明一个包含你的方法的特征,并App\User::class像 laravel 一样使用它们。

namespace App;

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

class User extends Authenticatable
{
    use Notifiable;
于 2018-10-12T08:22:21.533 回答
0

我尝试使用 class_alias,虽然它适用于基本用法,但当事情变得更复杂时,我的用户类无法削减它。例如,我的通知使用本地包用户类型而不显示在应用程序中。

在进行更多研究后,我发现使用特征是其他人提到的正确方法。

我在这里找到了一份综合指南:https ://laravelpackage.com/08-models-and-migrations.html#approach-2-using-a-polymorphic-relationship

要点:

在你的包中创建一个特征:

重要的是,您可以根据您的数据库建模设置您需要的任何关系。

 // 'src/Traits/HasPosts.php'
<?php

namespace JohnDoe\BlogPackage\Traits;

use JohnDoe\BlogPackage\Models\Post;

trait HasPosts
{
  public function posts()
  {
    return $this->morphMany(Post::class, 'author');
  }
}

在应用中适用的任何用户类中添加使用

 // 'App\Models\User.php'
<?php

namespace App\Models;

use JohnDoe\BlogPackage\Traits\HasPosts;

class User extends Authenticatable
{
   use HasPosts;
   ...

最后,您需要在数据库中为您使用 user_id 的 user_type 添加一个额外字段。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddUserTypeToPostTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->tinyText('user_type')
                ->comment('User class type')
                ->nullable();
        });
    }

    /**
    * Reverse the migrations.
    *
    * @return void
    */
    public function down()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->dropColumn('user_type');
        });
    }
}
于 2021-10-25T20:47:36.877 回答
-1

您需要添加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');
    }
}
于 2019-05-17T11:31:18.813 回答