public function testFull() { $contract = Contract::make(self::NAME)->extend(new Contract('FirstContract'))->extend(new Contract('SecondContract'))->addConstant(new Constant('FIRST_CONSTANT', '0'))->addConstant(new Constant('SECOND_CONSTANT', "'meh'"))->addMethod(Method::make('firstMethod')->addArgument(new Argument('DateTime', 'firstArgument'))->addArgument(new Argument('array', 'secondArgument'))->addArgument(new Argument('string', 'thirdArgument')))->addMethod(new Method('secondMethod')); $generatedCode = $this->prettyPrinter->generateCode($contract); $this->assertExpectedCode($generatedCode); }
protected function generateRepositoryModel($modulePath, $moduleName, $modelName, array $fields) { $resourceModelName = basename($modelName) . 'Resource'; $resourceModelFqn = str_replace('/', '\\', "{$moduleName}/Model/ResourceModel/{$modelName}"); $collectionFactoryName = 'CollectionFactory'; $collectionFactoryFqn = str_replace('/', '\\', "{$moduleName}/Model/ResourceModel/{$modelName}/CollectionFactory"); $searchResultsFactoryName = basename($modelName) . 'SearchResultsInterfaceFactory'; $searchResultsFactoryFqn = str_replace('/', '\\', "{$moduleName}/Api/Data/{$modelName}SearchResultsInterfaceFactory"); $searchResultsContractName = basename($modelName) . 'SearchResultsInterface'; $searchResultsContractFqn = str_replace('/', '\\', "{$moduleName}/Api/Data/{$modelName}SearchResultsInterface"); $dataContractName = basename($modelName) . 'Interface'; $dataContractFqn = str_replace('/', '\\', "{$moduleName}/Api/Data/{$modelName}Interface"); $dataFactoryName = basename($modelName) . 'InterfaceFactory'; $dataFactoryFqn = str_replace('/', '\\', "{$moduleName}/Api/Data/{$modelName}InterfaceFactory"); $factoryName = basename($modelName) . 'Factory'; $model = Object::make(str_replace('/', '\\', "{$moduleName}/Model/{$modelName}Repository")); $model->implement(Contract::make(str_replace('/', '\\', "{$moduleName}/Api/{$modelName}RepositoryInterface"))); $__constructBody = ' $this->resource = $resource; $this->factory = $factory; $this->collectionFactory = $collectionFactory; $this->searchResultsFactory = $searchResultsFactory; $this->dataFactory = $dataFactory; $this->dataObjectHelper = $dataObjectHelper; $this->dataObjectProcessor = $dataObjectProcessor; $this->storeManager = $storeManager;'; $model->addProperty(Property::make('resource')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($resourceModelName)))); $model->addProperty(Property::make('factory')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($factoryName)))); $model->addProperty(Property::make('collectionFactory')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($collectionFactoryName)))); $model->addProperty(Property::make('searchResultsFactory')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($searchResultsFactoryName)))); $model->addProperty(Property::make('dataFactory')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($dataFactoryName)))); $model->addProperty(Property::make('dataObjectHelper')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag('DataObjectHelper')))); $model->addProperty(Property::make('dataObjectProcessor')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag('DataObjectProcessor')))); $model->addProperty(Property::make('storeManager')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag('StoreManagerInterface')))); $model->addMethod(Method::make('__construct')->setBody($__constructBody)->addArgument(new Argument($resourceModelName, 'resource'))->addArgument(new Argument($factoryName, 'factory'))->addArgument(new Argument($collectionFactoryName, 'collectionFactory'))->addArgument(new Argument($searchResultsFactoryName, 'searchResultsFactory'))->addArgument(new Argument($dataFactoryName, 'dataFactory'))->addArgument(new Argument('DataObjectHelper', 'dataObjectHelper'))->addArgument(new Argument('DataObjectProcessor', 'dataObjectProcessor'))->addArgument(new Argument('StoreManagerInterface', 'storeManager'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag($resourceModelName, 'resource'))->addParameterTag(new ParameterTag($factoryName, 'factory'))->addParameterTag(new ParameterTag($collectionFactoryName, 'collectionFactory'))->addParameterTag(new ParameterTag($searchResultsFactoryName, 'searchResultsFactory'))->addParameterTag(new ParameterTag($dataFactoryName, 'dataFactory'))->addParameterTag(new ParameterTag('DataObjectHelper', 'dataObjectHelper'))->addParameterTag(new ParameterTag('DataObjectProcessor', 'dataObjectProcessor'))->addParameterTag(new ParameterTag('StoreManagerInterface', 'storeManager')))); $model->addMethod(Method::make('getById')->setBody(' $object = $this->factory->create(); $this->resource->load($object, $id); if (!$object->getId()) { throw new NoSuchEntityException("Object not found"); } return $object;')->addArgument(new Argument('int', 'id'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag('int', 'id'))->setReturnTag(new ReturnTag($dataContractName))->addThrowTag(new ThrowTag('NoSuchEntityException')))); $model->addMethod(Method::make('save')->setBody(' $this->resource->save($object); return $object;')->addArgument(new Argument($dataContractName, 'object'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag($dataContractName, 'object'))->setReturnTag(new ReturnTag($dataContractName)))); $getListBody = ' $searchResults = $this->searchResultsFactory->create(); $searchResults->setSearchCriteria($criteria); $collection = $this->collectionFactory->create(); foreach ($criteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ?: \'eq\'; $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); } } $searchResults->setTotalCount($collection->getSize()); $sortOrders = $criteria->getSortOrders(); if ($sortOrders) { /** @var SortOrder $sortOrder */ foreach ($sortOrders as $sortOrder) { $collection->addOrder( $sortOrder->getField(), ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? \'ASC\' : \'DESC\' ); } } $collection->setCurPage($criteria->getCurrentPage()); $collection->setPageSize($criteria->getPageSize()); $objects = []; /** @var ' . $dataContractName . ' $object */ foreach ($collection as $object) { $data = $this->dataFactory->create(); $this->dataObjectHelper->populateWithArray( $data, $object->getData(), \'' . $dataContractFqn . '\' ); $objects[] = $this->dataObjectProcessor->buildOutputDataArray( $data, \'' . $dataContractFqn . '\' ); } $searchResults->setItems($objects); return $searchResults;'; $model->addMethod(Method::make('getList')->setBody($getListBody)->addArgument(new Argument('SearchCriteriaInterface', 'criteria'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag('SearchCriteriaInterface', 'criteria'))->setReturnTag(new ReturnTag($searchResultsContractName)))); $model->addMethod(Method::make('delete')->setBody(' $this->resource->delete($object); return true;')->addArgument(new Argument($dataContractName, 'object'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag($dataContractName, 'object'))->setReturnTag(new ReturnTag('bool')))); $model->addMethod(Method::make('deleteById')->setBody(' return $this->resource->delete($this->getById($id));')->addArgument(new Argument('int', 'id'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag('int', 'id'))->setReturnTag(new ReturnTag('bool')))); $this->dumpObject($model, "{$modulePath}/Model/{$modelName}Repository.php", [[$resourceModelName => $resourceModelFqn], $collectionFactoryFqn, $searchResultsFactoryFqn, $dataFactoryFqn, $dataContractFqn, $searchResultsContractFqn, 'Magento\\Framework\\Api\\DataObjectHelper', 'Magento\\Framework\\Reflection\\DataObjectProcessor', 'Magento\\Framework\\Api\\SortOrder', 'Magento\\Store\\Model\\StoreManagerInterface', 'Magento\\Framework\\Exception\\NoSuchEntityException', 'Magento\\Framework\\Api\\SearchCriteriaInterface']); return $this; }