Hi,

I think the _format routing magic needs a bit of tweaking to be really useful.

Summary:
1) Make it possible to load index_content.twig (rather than 
index_content.json.twig) during a .json request when using the _format route 
magic with the following syntax:
{% include 'FooBundle:Default:index_content.twig' with ['_format': 'html'] %}

2) Make it possible to define some format specific view logic (json_encode(), 
generate pdf/image etc)

3) Also make sure that there is an automatic fallback in case the format 
specific template is missing. This is important since for example there is no 
form.json.twig/widget.json.twig bundled with Symfony2 and without them an error 
is raised when Twig loads the form extension when _format is something else 
than html.

Details for 1) and 2):

foo:
  pattern:  /foo.:_format
  defaults: { _controller: fooDefault:indexAction, _format: html }

With this route if a controller calls the following:
return $this->render('FooBundle:Default:index.twig');

Then if the user calls "foo.html" then Symfony2 will look for an index.twig 
template like the following:
{% extends "FooBundle::layout.twig" %}

{% block content %}
    {% include "FooBundle:Default:index_content.twig" %}
{% endblock content %}

However if the user calls "foo.json" then Symfony2 will look for an 
index.json.twig template and it will also automatically set the content type to 
application/json. But here we have the problem 1) and 2):
{% extends "FooBundle::layout.php" %}

{% block content %}
{# Note that since php templates to not have access to twig blocks we have to 
capture this as a slot #}
{{ _view.slots.start('content') }}
    {% include 'FooBundle:Default:index_content.twig' %}
{{ _view.slots.stop() }}
{% endblock content %}

Neither can I load index_content.twig (as twig will automatically load 
index_content.json.twig) nor can I extend a twig template with a PHP template. 
The first I need to be able to get the actual HTML content I am trying to 
return in the JSON response and the second is necessary so that I can call 
json_encode()

Example layout.json.php:
<?php

echo json_encode(
    array(
         'html' => $view['slots']->output('content'),
         'status' => 'success',
    )
);

Obviously for 2) I could add some twig helper or special token so that I can 
also do json_encode() inside twig, but it would be nice to be able to fallback 
to php in case its necessary rather than having to bloat twig (especially when 
doing more complex things like generating a PDF or image). Not sure if it would 
be wise to add support for PHP sections inside a twig template as an 
alternative. A third alternative is to put this json_encode() somewhere into 
the template engine maybe via some callback when using something else than 
'html' as the _format. Yet another approach is going with the Agavi approach of 
having a "real" view layer inbetween the controller and the templates.

For 1) I propose that in case a '_format' parameter is set in the include that 
it overrides the current magic _format handling for finding a template
{% include 'FooBundle:Default:index_content.twig' with ['_format': 'html'] %}

regards,
Lukas Kahwe Smith
[email protected]



-- 
If you want to report a vulnerability issue on symfony, please send it to 
security at symfony-project.com

You received this message because you are subscribed to the Google
Groups "symfony developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/symfony-devs?hl=en

Reply via email to