Модель отношений Laravel между пакетами - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь реорганизовать мой проект, чтобы весь код из папки App был в отдельных пакетах для композиторов.Однако я столкнулся с блокировщиком, который я мог бы использовать для ввода:

Для упрощения я хотел бы создать 2 пакета, Core и Customers.Я хочу, чтобы Core был полностью отделен, не имея ссылок ни на какие другие мои пакеты.Внутри Core есть модель с именем Business, а в Customer есть модель с именем Customer.Между моделями существует отношение «многие к одному».Проблема возникает, когда я хочу создать методы отношений Eloquent.Customer зависит от Core, так что это не проблема, $this->belongsTo(Business::class).Однако, чтобы получить обратное значение Core, необходимо знать о модели Customer, $this->hasMany(Customer::class).

Есть ли способ обойти это?Как, например, регистрация метода на модели Business из моего пакета Customer?Или я получил все это задом наперед?

EDIT

Для тех, кто не знаком с Laravel, отношение определяется как функция в классе модели

class Business extends Model {
   public function customers() {
       return $this->hasMany(Customer::class);
   }
}

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Два возможных решения:

  1. Просто объявите отношение напрямую и сгенерируйте исключение, если класс не существует:

    public function customers() {
        if (class_exists(Customer::class)) {
            throw new \SomeException();
        }
    
        return $this->hasMany(Customer::class);
    }
    

    ::class не запускает автозагрузку, поэтомуего можно использовать, даже если класс недоступен.Это все равно создаст зависимость от Customers, но, по крайней мере, будет необязательным.

  2. Customers пакет может предоставить Business с правильным отношением.Поэтому, если вы хотите использовать Business класс с Customers, вы должны использовать Customers\Models\Business вместо Core\Models\Business:

    class Business extends \Core\Models\Business {
    
        public function customers() {
            return $this->hasMany(Customer::class);
        }
    }
    

    Это позволит сохранить Core свободным от зависимости от Customers,но он не масштабируется вообще (у вас не может быть второго пакета, который будет делать то же самое с классом Business).

0 голосов
/ 08 октября 2018

Как это делают большинство людей, это внедрение зависимостей, но это больше относится к типу службы, а не к типу отношения модели.Теперь, когда у вас есть это, я могу придумать пару вариантов.

  1. Перевести бизнес-класс из ядра или клиентов в ядро.Это зависит от того, насколько «ядро» эти модели для ваших приложений.
  2. Зависимость введите ваши отношения, используя перечисление или реестр

       class Business extends Model {
           public function customers() {
               return $this->hasMany(ModelEnum::byName('Customers')->class());
           }
       }
    

или

 class Business extends Model {
       public function customers() {
           $models = collect(get_declared_classes())->filter(function ($item) {
               $item == 'YOURPACKAGENAME\Models\\Customers' ? $item : throw new Exception();

               return $item
           });

           return $this->hasMany($item);
       }
    }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...