Расширенная пользовательская модель в пакете - PullRequest
0 голосов
/ 12 октября 2018

Не могли бы вы помочь мне понять, как правильно расширить существующие модели?Я разрабатываю пакет и хочу сделать как можно больше отдельно от основного приложения.

Я хочу иметь все существующие функциональные возможности модели 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',
    ],
],

Мой вопрос : Является ли это «наилучшей практикой» для расширения функциональности существующих моделей?

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Вам необходимо добавить config(['auth.providers.users.model' => Myname\Myproject\App\Models\User::class]); к способу загрузки внутри моего поставщика услуг пакета.

И создать новый класс в вашем пакете.

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');
    }
}
0 голосов
/ 12 октября 2018

, что предотвратит редактирование на \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;
...