Я создаю архитектуру, которая позволяет модели существовать, только если она действительна.Поэтому, если вы попытаетесь создать экземпляр модели с недопустимыми данными, будет сгенерировано исключение 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){
...
}
}
...
}
Боюсь, я, возможно, использую очень простую задачу, чтобы определить более надежное решение, потому что я хочу бытьпоследовательный, поскольку проект становится больше. Примечание: все контракты являются интерфейсами.