/**
  * @param EntityManager $em
  * @param ApiResource $apiResource
  * @param FormHandler $formHandler
  * @param FilterInterface $filter
  */
 function __construct(EntityManager $em, ApiResource $apiResource, FormHandler $formHandler, FilterInterface $filter = null)
 {
     $repository = $em->getRepository($apiResource->getEntityClass());
     $this->repository = $this->getRepository($repository);
     $this->formHandler = $formHandler;
     $this->filter = $filter;
 }
 /**
  * @param ApiResource $apiResource
  * @param RouteCollection $routes
  * @param ApiResource $parentResource
  */
 private function addRoute(ApiResource $apiResource, RouteCollection $routes, $parentResource = null)
 {
     foreach ($apiResource->getActions() as $action) {
         if (!$parentResource && !$apiResource->isMainResource()) {
             continue;
         }
         $route = new Route($this->getUrl($action, $parentResource));
         $route->setDefault('_api_resource', $apiResource->getName())->setDefault('_controller', $action->getControllerAction())->setDefault('_entity', $apiResource->getEntityClass())->setDefault('_security', $this->expressionsToSecurity($action->getSecurityExpression()))->setDefault('_identifier', $apiResource->getIdentifier())->setMethods($action->getMethods());
         if ($action instanceof Index) {
             $route->setDefault('_indexGetterMethod', $action->getResourceGetterMethod());
             $route->setDefault('_limit', $action->getDefaultLimit());
         }
         $routes->add($action->getRouteName($parentResource), $route);
     }
     foreach ($apiResource->getSubResources() as $subResource) {
         $this->addRoute($subResource, $routes, $apiResource);
     }
 }
 /**
  * @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() . '.');
     }
 }
 /**
  * @param ApiDoc $annotation
  * @param ApiResource $resource
  */
 private function setOutput(ApiDoc $annotation, ApiResource $resource)
 {
     $refl = new \ReflectionClass($annotation);
     $prop = $refl->getProperty('output');
     $prop->setAccessible(true);
     $prop->setValue($annotation, $resource->getEntityClass());
     $prop->setAccessible(false);
 }
 /** @test */
 public function it_returns_the_entity_namespace()
 {
     $this->assertEquals(Post::class, $this->config->getEntityClass());
 }