public function setUp() { parent::setUp(); $resource = new ApiResource('posts', ['entity' => Post::class, 'filter' => PostFilter::class, 'pagination' => ['enabled' => true, 'limit' => 10], 'form_type' => DynamicFormType::class, 'identifier' => 'id']); $resource->setConfigName('posts'); $this->router = $this->client->getContainer()->get('router'); $resource->addAction(new Index($this->router)); $resource->addAction(new Create($this->router)); $this->manager = new ApiManager(); $this->manager->addResource($resource); }
/** * @param ApiResource $apiResource * @return string */ protected function getFormType(ApiResource $apiResource) { if (Kernel::MAJOR_VERSION == 2 && Kernel::MINOR_VERSION == 7 && class_exists($apiResource->getFormTypeClass())) { $formClass = $apiResource->getFormTypeClass(); $refl = new \ReflectionClass($formClass); $formInstance = $refl->newInstanceWithoutConstructor(); $formType = $formInstance->getName(); } else { $formType = $apiResource->getFormTypeClass(); } return $formType; }
/** * @param ApiResource $apiResource * @param Request $request * @return ApiResource[] */ protected function getParentResources(ApiResource $apiResource, Request $request) { $parents = []; if ($parentResource = $apiResource->getParentResource()) { $id = $request->attributes->get($parentResource->getRoutePlaceholder()); $parentResource->setIdentifierValue($id); $parents[] = $parentResource; foreach ($this->getParentResources($parentResource, $request) as $parentsParent) { $id = $request->attributes->get($parentsParent->getRoutePlaceholder()); $parentsParent->setIdentifierValue($id); $parents[] = $parentsParent; } } return $parents; }
/** @test */ public function it_adds_filters_to_query_on_the_parent_resources() { $qb = $this->em->createQueryBuilder()->select('x')->from(Post::class, 'x'); $manager = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->setMethods(['getBundlePrefix'])->getMock(); $manager->method('getBundlePrefix')->willReturn('some.prefix'); $categoryResource = new ApiResource('categories', ['entity' => Category::class, 'filter' => null, 'pagination' => ['enabled' => true, 'limit' => 10], 'form_type' => DynamicFormType::class, 'identifier' => 'id']); $categoryResource->setManager($manager); $postResource = new ApiResource('posts', ['entity' => Post::class, 'filter' => null, 'pagination' => ['enabled' => true, 'limit' => 10], 'form_type' => DynamicFormType::class, 'identifier' => 'id']); $postResource->setParentResource($categoryResource); $filter = new FilterDecorator($postResource); $builder = new FilterBuilder(); $builder->setQueryBuilder($qb); $filter->buildFilter($builder); $filters = $builder->getFilters(); $this->assertCount(1, $filters); $this->assertTrue(isset($filters[FilterDecorator::getFilterName($categoryResource)])); $filter = $filters[FilterDecorator::getFilterName($categoryResource)]; $this->assertEquals(['category.id'], $filter->getFields()); }
/** * @param ApiResource $subResource */ public function addSubResource(ApiResource $subResource) { $this->subResources[$subResource->getConfigName()] = $subResource; }
/** * @param ApiResource $apiResource * @param array $searchParams * @param bool $public * @return array */ private function getParams(ApiResource $apiResource, $searchParams = [], $public = false) { if ($parentResource = $apiResource->getParentResource()) { $key = $public ? $apiResource->getAssocParent() : FilterDecorator::getFilterName($parentResource); $searchParams[$key] = $parentResource->getIdentifierValue(); $searchParams = array_merge($searchParams, $this->getParams($parentResource, $searchParams, $public)); } return $searchParams; }
/** * @param FilterBuilder $builder * @param $entity * @param EntityManager $em * @param ApiResource $parentResource * @param string $prefix */ protected function addFilterForParent(FilterBuilder $builder, $entity, EntityManager $em, ApiResource $parentResource, $prefix = '') { $meta = $em->getClassMetadata($entity); $mappings = $this->getAssociationMappings($meta, $parentResource->getEntityClass()); $builder->add(self::getFilterName($parentResource), EqualFilterType::class, ['fields' => $this->getFields($prefix, $mappings)]); if ($parentsParent = $parentResource->getParentResource()) { $this->addFilterForParent($builder, $parentResource->getEntityClass(), $em, $parentsParent, $parentResource->getAssocSubResource() . '.'); } }
/** * @return string */ public function getControllerAction() { return $this->apiResource->getControllerServiceName() . ':' . $this->action . 'Action'; }
/** * @param $routeName * @param ApiResource $resource * @return string */ private function getSection($routeName, ApiResource $resource) { $prefixPos = strlen($resource->getBundlePrefix() . '.'); $nextDot = strpos($routeName, '.', $prefixPos); $resourceName = substr($routeName, $prefixPos, $nextDot - $prefixPos); $parentResource = $this->manager->getResource($resourceName); return ucwords($parentResource->getName()); }
/** @test */ public function it_returns_the_form_handler_service_name() { $this->assertEquals($this->bundlePrefix . '.form_handler.posts', $this->config->getFormHandlerServiceName()); }
/** * @param ApiResource $apiResource * @return Definition */ protected function getDefinitionForApiResource(ApiResource $apiResource) { return $this->container->getDefinition($apiResource->getResourceServiceName()); }
/** * @param Action $action * @param ApiResource $parentResource * @return mixed */ private function getUrl(Action $action, ApiResource $parentResource = null) { $parent = $parentResource ? $parentResource->getResourceSingleElementUrl() : ''; return $parent . $action->getUrlSchema(); }