DDD - Где было бы хорошее место для создания экземпляра модели? - PullRequest
0 голосов
/ 29 ноября 2018

Я создаю архитектуру, которая позволяет модели существовать, только если она действительна.Поэтому, если вы попытаетесь создать экземпляр модели с недопустимыми данными, будет сгенерировано исключение ModelException.Мой SomeServiceContract ниже позволяет нам получить репозиторий, который используется этим сервисом (просто для простоты, потому что этот сервис получает репозиторий в своем конструкторе):

interface SomeServiceContract{

    function __constructor(SomeRepositoryContract $repository);

    function getRepository() : SomeRepositoryContrat;

    //option 1
    function addNewUserToCompany(ModelContract $model) : self;

    //option 2
    function addNewUserToCompany(array $data) : self;
}

И этот интерфейс репозитория выглядит следующим образом:

interface SomeRepositoryContract{

    function __contruct(ModelsFactoryContract $factory);

    function makeModel(array $data) : ModelsContract;

}

Так что мне интересно, как лучше всего создать экземпляр моей модели с помощью помощника makeModel(array $data), предоставляемого моим классом хранилища (makeModel(array $data) использует ModelsFactory для созданияновая модель с заданными данными, если она действительна).В настоящее время я создаю экземпляр модели в моем методе контроллера, а затем передаю ее методам Сервиса (поэтому я использую параметр 1 ).Когда я создаю новый ресурс в моей системе (и в моем примере у меня было бы много бизнес-правил для проверки, поэтому я должен создать его внутри службы), я не знаю, должен ли я выполнять инстанцирование внутрисервисный метод или если это нормально для создания экземпляра вне его, например:

class SomeController{
...

    function createResource(Request $request, SomeServiceContract $service){

        try{

            $data = [
                'name' => $request->input('name'),
                ...
            ];

            //Option 1: instantiates the model outside and passes it as argument to the service. The service method would now only rise a ServiceException, because the model is validated at instantiation time.
            $model = $service->getRepository()->makeModel($data);
            $service->addNewUserToCompany($model);

            //Option 2: pass the data as an array and instantiate the model inside the method of the service. The method would now thrown an exception of both ModelException and ServiceException types
            $service->addNewUserToCompany($data);



        }catch(ModelException $e){
            ...
        }catch(ServiceException $e){
            ...
        }

    }

...
}

Боюсь, я, возможно, использую очень простую задачу, чтобы определить более надежное решение, потому что я хочу бытьпоследовательный, поскольку проект становится больше. Примечание: все контракты являются интерфейсами.

...