What to use instead of Twig_Loader_String

前端 未结 7 1856
醉梦人生
醉梦人生 2020-12-25 15:29

I see that the Twig_Loader_String class has been deprecated and will be removed in Twig 2.0. Also, the comments in the source indicate that it should \"NEVE

相关标签:
7条回答
  • 2020-12-25 15:50
    $tplName = uniqid( 'string_template_', true );
    $env = clone $this->getTwig();
    $env->setCache(false);
    $env->setLoader( new \Twig_Loader_Array( [ $tplName => 'Hello, {{ name }}' ] ));
    $html = new Response( $env->render( $tplName, [ 'name' => 'Bob' ] ));
    
    echo $html; // Hello, Bob
    
    0 讨论(0)
  • 2020-12-25 15:50

    This actually seems to work as expected:

    $tplName = uniqid( 'string_template_', true );
    $env = clone $this->getTwig();
    $env->setLoader( new \Twig_Loader_Array( [ $tplName => 'Hello, {{ name }}' ] ));
    $html = new Response( $env->render( $tplName, [ 'name' => 'Bob' ] ));
    $cacheName = $env->getCacheFilename( $tplName );
    if( is_file( $cacheName ) )
    {
      unlink( $cacheName );
    }
    echo $html; // Hello, Bob
    

    I found the hints here: http://twig.sensiolabs.org/doc/recipes.html#using-different-template-sources.

    Note that deleting the cache file would not be desirable if the template string came from a database or something similar. I use this functionality for rendering templates that are created dynamically and have very short life spans, usually when debugging and testing.

    0 讨论(0)
  • 2020-12-25 15:56

    Try it

    $template = $this->container->get('twig')->createTemplate('hello {{ name }}');
    echo $template->render(array('name' => 'Fabien'));
    
    0 讨论(0)
  • 2020-12-25 16:00

    Twig_Environment#createTemplate should be used, as indicated in the issue deprecating Twig_Loader_String:

    // the loader is not important, you can even just
    // use the twig service in Symfony here
    $twig = new \Twig_Environment(...);
    
    $template = $twig->createTemplate('Hello {{ name }}!');
    echo $template->render(['name' => 'Bob']);
    

    This code is the most simple way and bypasses the complete caching system. This means that it doesn't have the bad things of Twig_Loader_String (it doesn't create a new cache entry each time you call render; it doesn't have problems with referencing other templates; etc.), but it still isn't as quick as using Twig_Loader_Array (as shown by @AlainTiemblo's answer) or Twig_Loader_Filesystem.

    0 讨论(0)
  • 2020-12-25 16:00

    The best is: http://twig.sensiolabs.org/doc/2.x/recipes.html#loading-a-template-from-a-string

    As example used by me:

    public function parse($content, $maxLoops = 3, $context = array())
    {
        if (strlen($content) < 1) {
            return null;
        }
    
        for ($i = 0; $i < $maxLoops; $i++) {
            $template = $this->container->get('twig')->createTemplate($content);
            $result = $template->render( $context );
    
            if ($result == $content) {
                break;
            } else {
                $content = $result;
            }
        }
    
        return $content;
    }
    
    0 讨论(0)
  • 2020-12-25 16:03
    $environment = new \Twig_Environment(new \Twig_Loader_Array(array()));
    $template = $environment->createTemplate('{{ template }} {{ replacements }}');
    
    echo $template->render([replacements]);
    
    0 讨论(0)
提交回复
热议问题