/** @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 $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; }