Skip to content

Commit 6744a48

Browse files
committed
Merge pull request #1355 from FriendsOfSymfony/SENSION
Fix #1354
2 parents 1baeb0f + 8f9973b commit 6744a48

File tree

3 files changed

+74
-47
lines changed

3 files changed

+74
-47
lines changed

Controller/Annotations/View.php

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,6 @@ class View extends Template
4646
*/
4747
protected $serializerEnableMaxDepthChecks;
4848

49-
/**
50-
* Returns the annotation alias name.
51-
*
52-
* @return string
53-
*
54-
* @see Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface
55-
*/
56-
public function getAliasName()
57-
{
58-
return 'view';
59-
}
60-
6149
/**
6250
* Sets the template var name to be used for templating formats.
6351
*

EventListener/ViewResponseListener.php

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111

1212
namespace FOS\RestBundle\EventListener;
1313

14+
use FOS\RestBundle\Controller\Annotations\View as ViewAnnotation;
1415
use FOS\RestBundle\FOSRestBundle;
1516
use FOS\RestBundle\View\View;
1617
use FOS\RestBundle\View\ViewHandlerInterface;
18+
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
1719
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
1820
use Symfony\Component\HttpFoundation\Response;
1921
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
@@ -58,55 +60,48 @@ public function onKernelView(GetResponseForControllerResultEvent $event)
5860
return false;
5961
}
6062

61-
/** @var \FOS\RestBundle\Controller\Annotations\View $configuration */
62-
$configuration = $request->attributes->get('_view');
63+
$configuration = $request->attributes->get('_template');
6364

6465
$view = $event->getControllerResult();
65-
$customViewDefined = true;
6666
if (!$view instanceof View) {
67-
if (!$configuration && !$this->forceView) {
67+
if (!$configuration instanceof ViewAnnotation && !$this->forceView) {
6868
return;
6969
}
7070

7171
$view = new View($view);
72-
$customViewDefined = false;
7372
}
7473

75-
if ($configuration) {
74+
if ($configuration instanceof ViewAnnotation) {
7675
if ($configuration->getTemplateVar()) {
7776
$view->setTemplateVar($configuration->getTemplateVar());
7877
}
79-
if ($configuration->getStatusCode() && (null === $view->getStatusCode() || Response::HTTP_OK === $view->getStatusCode())) {
78+
if (null !== $configuration->getStatusCode() && (null === $view->getStatusCode() || Response::HTTP_OK === $view->getStatusCode())) {
8079
$view->setStatusCode($configuration->getStatusCode());
8180
}
8281

8382
$context = $view->getContext();
84-
if ($configuration->getSerializerGroups() && !$customViewDefined) {
83+
if ($configuration->getSerializerGroups()) {
8584
$context->addGroups($configuration->getSerializerGroups());
8685
}
8786
if ($configuration->getSerializerEnableMaxDepthChecks()) {
8887
$context->setMaxDepth(0);
8988
}
9089

91-
$populateDefaultVars = $configuration->isPopulateDefaultVars();
90+
list($controller, $action) = $configuration->getOwner();
91+
$vars = $this->getDefaultVars($configuration, $controller, $action);
9292
} else {
93-
$populateDefaultVars = true;
93+
$vars = null;
9494
}
9595

9696
if (null === $view->getFormat()) {
9797
$view->setFormat($request->getRequestFormat());
9898
}
9999

100-
$vars = $request->attributes->get('_template_vars');
101-
if (!$vars && $populateDefaultVars) {
102-
$vars = $request->attributes->get('_template_default_vars');
103-
}
104-
105100
if ($this->viewHandler->isFormatTemplating($view->getFormat())
106101
&& !$view->getRoute()
107102
&& !$view->getLocation()
108103
) {
109-
if (!empty($vars)) {
104+
if (null !== $vars && 0 !== count($vars)) {
110105
$parameters = (array) $this->viewHandler->prepareTemplateParameters($view);
111106
foreach ($vars as $var) {
112107
if (!array_key_exists($var, $parameters)) {
@@ -116,10 +111,7 @@ public function onKernelView(GetResponseForControllerResultEvent $event)
116111
$view->setData($parameters);
117112
}
118113

119-
$template = null !== $configuration && $configuration->getTemplate()
120-
? $configuration->getTemplate()
121-
: $request->attributes->get('_template');
122-
if ($template && !$view->getTemplate()) {
114+
if ($configuration && ($template = $configuration->getTemplate()) && !$view->getTemplate()) {
123115
if ($template instanceof TemplateReferenceInterface) {
124116
$template->set('format', null);
125117
}
@@ -135,8 +127,37 @@ public function onKernelView(GetResponseForControllerResultEvent $event)
135127

136128
public static function getSubscribedEvents()
137129
{
130+
// Must be executed before SensioFrameworkExtraBundle's listener
138131
return array(
139-
KernelEvents::VIEW => 'onKernelView',
132+
KernelEvents::VIEW => array('onKernelView', 30),
140133
);
141134
}
135+
136+
/**
137+
* @param Request $request
138+
* @param Template $template
139+
* @param object $controller
140+
* @param string $action
141+
*
142+
* @return array
143+
*
144+
* @see \Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::resolveDefaultParameters()
145+
*/
146+
private function getDefaultVars(Template $template = null, $controller, $action)
147+
{
148+
if (0 !== count($arguments = $template->getVars())) {
149+
return $arguments;
150+
}
151+
152+
if (!$template instanceof ViewAnnotation || $template->isPopulateDefaultVars()) {
153+
$r = new \ReflectionObject($controller);
154+
155+
$arguments = array();
156+
foreach ($r->getMethod($action)->getParameters() as $param) {
157+
$arguments[] = $param->getName();
158+
}
159+
160+
return $arguments;
161+
}
162+
}
142163
}

Tests/EventListener/ViewResponseListenerTest.php

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,14 @@ public function testOnKernelView()
9797
->method('set')
9898
->with('format', null);
9999

100+
$annotation = new ViewAnnotation([]);
101+
$annotation->setOwner([new FooController(), 'onKernelViewAction']);
102+
$annotation->setTemplate($template);
103+
100104
$request = new Request();
101-
$request->attributes->set('_template_default_vars', ['foo', 'halli']);
102105
$request->attributes->set('foo', 'baz');
103106
$request->attributes->set('halli', 'galli');
104-
$request->attributes->set('_template', $template);
107+
$request->attributes->set('_template', $annotation);
105108
$response = new Response();
106109

107110
$view = $this->getMockBuilder('FOS\RestBundle\View\View')
@@ -160,11 +163,12 @@ public function testStatusCode($annotationCode, $viewCode, $expectedCode)
160163
$this->createViewResponseListener(['json' => true]);
161164

162165
$viewAnnotation = new ViewAnnotation([]);
166+
$viewAnnotation->setOwner([$this, 'statusCodeProvider']);
163167
$viewAnnotation->setStatusCode($annotationCode);
164168

165169
$request = new Request();
166170
$request->setRequestFormat('json');
167-
$request->attributes->set('_view', $viewAnnotation);
171+
$request->attributes->set('_template', $viewAnnotation);
168172

169173
$this->templating->expects($this->any())
170174
->method('render')
@@ -230,36 +234,33 @@ public function testSerializerEnableMaxDepthChecks($enableMaxDepthChecks, $expec
230234
public function getDataForDefaultVarsCopy()
231235
{
232236
return [
233-
[true, false, false],
234-
[true, true, true],
235-
[false, null, true],
237+
[false],
238+
[true],
236239
];
237240
}
238241

239242
/**
240243
* @dataProvider getDataForDefaultVarsCopy
241244
*/
242-
public function testViewWithNoCopyDefaultVars($createAnnotation, $populateDefaultVars, $shouldCopy)
245+
public function testViewWithNoCopyDefaultVars($populateDefaultVars)
243246
{
244247
$this->createViewResponseListener(['html' => true]);
245248

246249
$request = new Request();
247-
$request->attributes->set('_template_default_vars', ['customer']);
248250
$request->attributes->set('customer', 'A person goes here');
249251
$view = View::create();
250252

251-
if ($createAnnotation) {
252-
$viewAnnotation = new ViewAnnotation([]);
253-
$viewAnnotation->setPopulateDefaultVars($populateDefaultVars);
254-
$request->attributes->set('_view', $viewAnnotation);
255-
}
253+
$viewAnnotation = new ViewAnnotation([]);
254+
$viewAnnotation->setOwner([new FooController(), 'viewAction']);
255+
$viewAnnotation->setPopulateDefaultVars($populateDefaultVars);
256+
$request->attributes->set('_template', $viewAnnotation);
256257

257258
$event = $this->getResponseEvent($request, $view);
258259

259260
$this->listener->onKernelView($event);
260261

261262
$data = $view->getData();
262-
if ($shouldCopy) {
263+
if ($populateDefaultVars) {
263264
$this->assertArrayHasKey('customer', $data);
264265
$this->assertEquals('A person goes here', $data['customer']);
265266
} else {
@@ -282,3 +283,20 @@ private function createViewResponseListener($formats = null)
282283
$this->listener = new ViewResponseListener($this->viewHandler, false);
283284
}
284285
}
286+
287+
class FooController
288+
{
289+
/**
290+
* @see testOnKernelView()
291+
*/
292+
public function onKernelViewAction($foo, $halli)
293+
{
294+
}
295+
296+
/**
297+
* @see testViewWithNoCopyDefaultVars()
298+
*/
299+
public function viewAction($customer)
300+
{
301+
}
302+
}

0 commit comments

Comments
 (0)