Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony2 / Twig : Generate Alternate Absolute URL Path for use with CDN?

This stackoverflow solution almost answers my question. But I want to generate CDN urls in Twig to more than just resources. I'd like to generate them for dynamic content. So I don't think an Assetic tweak is the right area to be looking.

For now, I can set CDN_url in parameters.ini and use that in my urls. My code would look like this : {{CDN_Url}}{{url('route',{'param1':'value'}} .. Code maintenance is one major reason I don't like this option. Then you could do things like check the route for /cdn/ to generate the CDN url and everything else to be based on the domain. I wouldn't have to run around changing a lot of variables. AND if I wanted to stop the CDN url from generating. I could just modify the route. So there's a lot of benefits to figuring out if there's a clean solution to this.

If, there's not a solution already - how would I start to extend the {{ url() }} functionality so that I could use it like path and url.

like image 582
JustinP Avatar asked Mar 17 '12 10:03

JustinP


2 Answers

You can do it with the help of the question you linked by following way

{{ asset(path('route',{'param1':'value'})) }}

If you need to handle multiple CDN domains you can do it by following way

In app/config.yml

# app/config.yml
#....
templating:       
  engines: ['twig'] 
  packages:
    cdn1:
      base_urls: ["http://cdn1.domain.com"]
    cdn2:
      base_urls: ["http://cdn2.domain.com"]

And then in your twig template file

{{ asset('path/of/file', 'cdn1')

OR

{{ asset('path/of/file', 'cdn2')
like image 191
Mun Mun Das Avatar answered Oct 21 '22 07:10

Mun Mun Das


I don't know about the CDN stuff but as far as extending the url function, take a look at:

Symfony\Bridge\Twig\Extension\RoutingExtension

public function __construct(UrlGeneratorInterface $generator)
{
    $this->generator = $generator;
}
public function getFunctions()
{
    return array(
        'url'  => new \Twig_Function_Method($this, 'getUrl'),
        'path' => new \Twig_Function_Method($this, 'getPath'),
    );
}
public function getPath($name, $parameters = array())
{
    return $this->generator->generate($name, $parameters, false);
}

public function getUrl($name, $parameters = array())
{
    return $this->generator->generate($name, $parameters, true);
}

So you could get at getUrl there or you could insert you own UrlGenerator. Not sure which would be easier in your specific case. Probably making your own UrlGenerator.

like image 24
Cerad Avatar answered Oct 21 '22 08:10

Cerad