Я пытаюсь создать чистый сервисный уровень, в котором уровень сервиса действует на один или несколько репозиториев, и каждый репозиторий действует по своей собственной красноречивой модели.Как отделить красноречие от уровня обслуживания?
Например, я могу иметь:
ForumService
|
+-- PostRepo extends PostInterface
| |
| +-- Post (Eloquent)
|
+-- UserRepo extends UserInterface
|
+-- User (Eloquent)
Каждая служба определяет это требуется зависимостей с помощью ioc
. Так, что-то вроде:
// MessageService
// ..
public function __construct(UserInterface $userRepository,
MessageInterface $messageRepository) {
// ..
}
Моих хранилищ разрешаются с помощью их привязки в своих поставщиках услуг, такие как:
class UserRepositoryServiceProvider extends ServiceProvider
{
public function register()
{
$this->app>bind(
'App\Models\Repositories\User\UserInterface',
'App\Models\Repositories\User\UserRepository');
}
}
Это все работает просто отлично. Каждая служба получает требуемые репозитории.
Чтобы сохранить уровень обслуживания без какой-либо конкретной зависимости от красноречия, все, что оставляет репо, является простым, неизменным объектом данных.
Ключевые моменты в повседневном языке:
- Только разговоры РЬИХ на свои собственные модели непосредственно
- объектов возвращают простой, неизменный, данные репо
- услуг действуют, чтобы связать множественные репо вместе и настоящими упрощенные объекты обратно к контроллерам и, в конечном счете, к представлениям.
Однако я не могу придумать чистый шаблон для associate
выразительных моделей друг с другом на уровне услуг или репо.
У модели Post
есть отношение belongsTo(User::class)
, как я могу создать эти отношения на уровне репозитория Post
.
Я пробовал:
public function associate($authorId)
{
$post->author()->associate($authorId);
}
Но associate
ожидает user
красноречивого объекта, а не просто идентификатор. Я мог бы сделать:
public function associate($authorId)
{
$post->from()->associate($userRepo->findEloquent($authorId));
}
Но я чувствую, что я всплывать на красноречивую модель вверх в репо, что не должно быть действующей на него.
у вас есть еще вопросы? или ответ был тем, что вы спросили? –