/** * @param ViewHandler $handler * @param View $view * @param Request $request * * @return \Symfony\Component\HttpFoundation\Response */ public function createResponse(ViewHandler $handler, View $view, Request $request) { $format = $view->getFormat() ?: $request->getRequestFormat(); $data = $view->getData(); if ($data instanceof Cursor) { $view->setData(iterator_to_array($data, false)); $view->getResponse()->headers->set('X-Total-Count', $data->count()); return $handler->createResponse($view, $request, $view->getFormat()); } if ($data instanceof Form && Codes::HTTP_BAD_REQUEST === $view->getStatusCode()) { $view->setData($this->formatFormErrors($data)); return $handler->createResponse($view, $request, $format); } return $handler->createResponse($view, $request, $format); }
/** * @param ViewHandler $viewHandler * @param View $view * @param Request $request * @param string $format * * @return Response */ public function handleExtension(ViewHandler $handler, View $view, Request $request, $format) { if (in_array("application/vnd.bpi.api+xml", $request->getAcceptableContentTypes())) { $view->setHeader("Content-Type", "application/vnd.bpi.api+xml"); } return $handler->createResponse($view, $request, "xml"); }
/** * Deserialize Hal object using Nocarrier's Hal library instead of using JMS Serializer * * @param ViewHandler $viewHandler * @param View $view * @param Request $request * @param string $format * * @return Response */ public function createResponse(ViewHandler $handler, View $view, Request $request, $format) { $hal = $view->getData(); //if not hal object process it with default view handler if (!$hal instanceof Hal) { return $handler->createResponse($view, $request, $format); } switch ($format) { case 'json': $content = $hal->asJson(); break; case 'xml': $content = $hal->asXml(); break; default: throw new HttpException(500, 'Custom HalViewHandler is misconfigured. Formats for deserializing HAL objects should be json or xml.'); } $response = $view->getResponse(); $response->setContent($content); $response->setStatusCode($this->getStatusCode($view)); if (!$response->headers->has('Content-Type')) { $response->headers->set('Content-Type', $request->getMimeType($format)); } return $response; }
/** * Handles wrapping a JSON response into a JSONP response. * * @param ViewHandler $handler * @param View $view * @param Request $request * @param string $format * * @return Response */ public function createResponse(ViewHandler $handler, View $view, Request $request, $format) { $response = $handler->createResponse($view, $request, 'json'); if ($response->isSuccessful()) { $callback = $this->getCallback($request); $response->setContent(sprintf('/**/%s(%s)', $callback, $response->getContent())); $response->headers->set('Content-Type', $request->getMimeType($format)); } return $response; }
/** * @param ViewHandler $viewHandler * @param View $view * @param Request $request * @param string $format * * @return Response */ public function createResponse(ViewHandler $handler, View $view, Request $request, $format) { $format = $request->get('_format') ?: 'json'; if ($view->getData() instanceof ImageInterface && $format != 'json') { $image = $view->getData(); $content = $this->manager->getImageSource($image); $headers = ['Content-Type' => $image->getMimeType()]; return new Response($content, 200, $headers); } return $handler->createResponse($view, $request, 'json'); }
/** * @dataProvider createSerializeNullDataProvider */ public function testSerializeNull($expected, $serializeNull) { $viewHandler = new ViewHandler(array('json' => false), 404, 200, $serializeNull); $container = $this->getMock('\\Symfony\\Component\\DependencyInjection\\Container', array('get', 'getParameter')); $viewHandler->setContainer($container); $serializer = $this->getMockBuilder('\\JMS\\Serializer\\Serializer')->setMethods(array('serialize', 'setExclusionStrategy'))->disableOriginalConstructor()->getMock(); if ($serializeNull) { $serializer->expects($this->once())->method('serialize')->will($this->returnValue(json_encode(null))); $container->expects($this->once())->method('get')->with('fos_rest.serializer')->will($this->returnValue($serializer)); } else { $serializer->expects($this->never())->method('serialize'); $container->expects($this->never())->method('get'); } $response = $viewHandler->createResponse(new View(), new Request(), 'json'); $this->assertEquals($expected, $response->getContent()); }
/** * @dataProvider createResponseWithoutLocationDataProvider */ public function testCreateResponseWithoutLocation($format, $expected, $createViewCalls = 0, $formIsValid = false, $form = false) { $viewHandler = new ViewHandler(array('html' => true, 'json' => false)); $container = $this->getMock('\\Symfony\\Component\\DependencyInjection\\Container', array('get', 'getParameter')); if ('html' === $format) { $templating = $this->getMockBuilder('\\Symfony\\Bundle\\FrameworkBundle\\Templating\\PhpEngine')->setMethods(array('render'))->disableOriginalConstructor()->getMock(); $templating->expects($this->once())->method('render')->will($this->returnValue(var_export($expected, true))); $container->expects($this->once())->method('get')->with('fos_rest.templating')->will($this->returnValue($templating)); } else { $serializer = $this->getMock('\\stdClass', array('serialize', 'setVersion')); $serializer->expects($this->once())->method('serialize')->will($this->returnValue(var_export($expected, true))); $serializer->expects($this->once())->method('setVersion')->will($this->returnValue('1.0')); $container->expects($this->once())->method('get')->with('fos_rest.serializer')->will($this->returnValue($serializer)); $container->expects($this->any())->method('getParameter')->will($this->onConsecutiveCalls('version', '1.0')); } $viewHandler->setContainer($container); if ($form) { $data = $this->getMock('\\Symfony\\Component\\Form\\Form', array('createView', 'getData', 'isValid'), array(), '', false); $data->expects($this->exactly($createViewCalls))->method('createView')->will($this->returnValue(array('bla' => 'toto'))); $data->expects($this->exactly($createViewCalls))->method('getData')->will($this->returnValue(array('bla' => 'toto'))); $data->expects($this->any())->method('isValid')->will($this->returnValue($formIsValid)); } else { $data = array('foo' => 'bar'); } $view = new View($data); $response = $viewHandler->createResponse($view, new Request(), $format); $this->assertEquals(var_export($expected, true), $response->getContent()); }
/** * @dataProvider exceptionWrapperSerializeResponseContentProvider * @param string $format */ public function testCreateResponseWithFormErrorsAndSerializationGroups($format) { $form = Forms::createFormFactory()->createBuilder()->add('name', 'text')->add('description', 'text')->getForm(); $form->get('name')->addError(new FormError('Invalid name')); $exceptionWrapper = new ExceptionWrapper(array('status_code' => 400, 'message' => 'Validation Failed', 'errors' => $form)); $view = new View($exceptionWrapper); $view->getSerializationContext()->setGroups(array('Custom')); $wrapperHandler = new ExceptionWrapperSerializeHandler(); $translatorMock = $this->getMock('Symfony\\Component\\Translation\\TranslatorInterface', array('trans', 'transChoice', 'setLocale', 'getLocale')); $translatorMock->expects($this->any())->method('trans')->will($this->returnArgument(0)); $formErrorHandler = new FormErrorHandler($translatorMock); $serializer = SerializerBuilder::create()->configureHandlers(function (HandlerRegistry $handlerRegistry) use($wrapperHandler, $formErrorHandler) { $handlerRegistry->registerSubscribingHandler($wrapperHandler); $handlerRegistry->registerSubscribingHandler($formErrorHandler); })->build(); $container = $this->getMock('Symfony\\Component\\DependencyInjection\\Container', array('get')); $container->expects($this->once())->method('get')->with('fos_rest.serializer')->will($this->returnValue($serializer)); $viewHandler = new ViewHandler(array()); $viewHandler->setContainer($container); $response = $viewHandler->createResponse($view, new Request(), $format); $serializer2 = SerializerBuilder::create()->configureHandlers(function (HandlerRegistry $handlerRegistry) use($wrapperHandler, $formErrorHandler) { $handlerRegistry->registerSubscribingHandler($formErrorHandler); })->build(); $container2 = $this->getMock('Symfony\\Component\\DependencyInjection\\Container', array('get')); $container2->expects($this->once())->method('get')->with('fos_rest.serializer')->will($this->returnValue($serializer2)); $viewHandler = new ViewHandler(array()); $viewHandler->setContainer($container2); $view2 = new View($exceptionWrapper); $response2 = $viewHandler->createResponse($view2, new Request(), $format); $this->assertEquals($response->getContent(), $response2->getContent()); }
/** * @dataProvider exceptionWrapperSerializeResponseContentProvider * * @param string $format */ public function testCreateResponseWithFormErrorsAndSerializationGroups($format) { $form = Forms::createFormFactory()->createBuilder()->add('name', 'text')->add('description', 'text')->getForm(); $form->get('name')->addError(new FormError('Invalid name')); $exceptionWrapper = new ExceptionWrapper(['status_code' => 400, 'message' => 'Validation Failed', 'errors' => $form]); $view = new View($exceptionWrapper); $view->getSerializationContext()->addGroups(['Custom']); $wrapperHandler = new ExceptionWrapperSerializeHandler(); $translatorMock = $this->getMock('Symfony\\Component\\Translation\\TranslatorInterface', ['trans', 'transChoice', 'setLocale', 'getLocale']); $translatorMock->expects($this->any())->method('trans')->will($this->returnArgument(0)); $formErrorHandler = new FormErrorHandler($translatorMock); $serializer = SerializerBuilder::create()->configureHandlers(function (HandlerRegistry $handlerRegistry) use($wrapperHandler, $formErrorHandler) { $handlerRegistry->registerSubscribingHandler($wrapperHandler); $handlerRegistry->registerSubscribingHandler($formErrorHandler); })->build(); $adapter = $this->getMock('FOS\\RestBundle\\Context\\Adapter\\SerializationContextAdapterInterface'); $container = $this->getMock('Symfony\\Component\\DependencyInjection\\Container', ['get']); $container->expects($this->any())->method('get')->with($this->logicalOr($this->equalTo('fos_rest.serializer'), $this->equalTo('fos_rest.context.adapter.chain_context_adapter')))->will($this->returnCallback(function ($method) use($serializer, $adapter) { switch ($method) { case 'fos_rest.serializer': return $serializer; case 'fos_rest.context.adapter.chain_context_adapter': return $adapter; } })); $viewHandler = new ViewHandler([]); $viewHandler->setSerializationContextAdapter($this->getMock('FOS\\RestBundle\\Context\\Adapter\\SerializationContextAdapterInterface')); $viewHandler->setContainer($container); $response = $viewHandler->createResponse($view, new Request(), $format); $serializer2 = SerializerBuilder::create()->configureHandlers(function (HandlerRegistry $handlerRegistry) use($wrapperHandler, $formErrorHandler) { $handlerRegistry->registerSubscribingHandler($formErrorHandler); })->build(); $container2 = $this->getMock('Symfony\\Component\\DependencyInjection\\Container', ['get']); $container2->expects($this->any())->method('get')->with($this->logicalOr($this->equalTo('fos_rest.serializer'), $this->equalTo('fos_rest.context.adapter.chain_context_adapter')))->will($this->returnCallback(function ($method) use($serializer2, $adapter) { switch ($method) { case 'fos_rest.serializer': return $serializer2; case 'fos_rest.context.adapter.chain_context_adapter': return $adapter; } })); $viewHandler = new ViewHandler([]); $viewHandler->setSerializationContextAdapter($this->getMock('FOS\\RestBundle\\Context\\Adapter\\SerializationContextAdapterInterface')); $viewHandler->setContainer($container2); $view2 = new View($exceptionWrapper); $response2 = $viewHandler->createResponse($view2, new Request(), $format); $this->assertEquals($response->getContent(), $response2->getContent()); }