Symfony2 / Twig : Generate Alternate Absolute URL

2020-05-21 04:38发布

问题:

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.

回答1:

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')


回答2:

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.