跳至主要内容

vardump in twig

in a former post i give a solution to make var_dump in twig, the main idea is set twig into debug mode and debug a variable, but Symfony2 or such kind of framework make it impossible, the circle of reference make the dump infinitive. So we need to don in another way:
First , we need to create a service which can be called by a twig file, the tutorial can see here : symfony2 offical service creatation for twig extension
in your service.xml
        
          
        

and then :
/**
 * TVarDumper class.
 *
 * TVarDumper is intended to replace the buggy PHP function var_dump and print_r.
 * It can correctly identify the recursively referenced objects in a complex
 * object structure. It also has a recursive depth control to avoid indefinite
 * recursive display of some peculiar variables.
 *
 * TVarDumper can be used as follows,
 * 
 *   echo TVarDumper::dump($var);
 * 
 *
 * @author Qiang Xue qiang.xue@gmail.com
 * @version $Id$
 * @package System.Util
 * @since 3.0
 * @modifiedby: ferdinandfly@gmail.com
 */
namespace Acme\UserBundle\ExtraFunctions;
use Symfony\Component\HttpKernel\KernelInterface;

use Twig_Extension;
class TVarDumper extends Twig_Extension
{
        private $_objects;
        private $_output;
        private $_depth;

        
        
        public function __construct()
        {
        }
        
        
        /**
         * {@inheritdoc}
         */
        public function getFunctions()
        {
         return array(
           'mydump' => new \Twig_Function_Method($this, 'dump')
         );
        }
        /**
         * Converts a variable into a string representation.
         * This method achieves the similar functionality as var_dump and print_r
         * but is more robust when handling complex objects such as PRADO controls.
         * @param mixed variable to be dumped
         * @param integer maximum depth that the dumper should go into the variable. Defaults to 10.
         * @return string the string representation of the variable
         */
        public function dump($var,$depth=10,$highlight=false)
        {
                $this->_output='';
                $this->_objects=array();
                $this->_depth=$depth;
                $this->dumpInternal($var,0);
                if($highlight)
                {
                        $result=highlight_string("_output,true);
                        return preg_replace('/<\\?php
/','',$result,1);
                }
                else
                        return $this->_output;
        }

        private function dumpInternal($var,$level)
        {
                switch(gettype($var))
                {
                        case 'boolean':
                                $this->_output.=$var?'true':'false';
                                break;
                        case 'integer':
                                $this->_output.="$var";
                                break;
                        case 'double':
                                $this->_output.="$var";
                                break;
                        case 'string':
                                $this->_output.="'$var'";
                                break;
                        case 'resource':
                                $this->_output.='{resource}';
                                break;
                        case 'NULL':
                                $this->_output.="null";
                                break;
                        case 'unknown type':
                                $this->_output.='{unknown}';
                                break;
                        case 'array':
                                if($this->_depth<=$level)
                                        $this->_output.='array(...)';
                                else if(empty($var))
                                        $this->_output.='array()';
                                else
                                {
                                        $keys=array_keys($var);
                                        $spaces=str_repeat(' ',$level*4);
                                        $this->_output.="array\n".$spaces.'(';
                                        foreach($keys as $key)
                                        {
                                                $this->_output.="\n".$spaces."    [$key] => ";
                                                $this->_output.=$this->dumpInternal($var[$key],$level+1);
                                        }
                                        $this->_output.="\n".$spaces.')';
                                }
                                break;
                        case 'object':
                                if(($id=array_search($var,$this->_objects,true))!==false)
                                        $this->_output.=get_class($var).'#'.($id+1).'(...)';
                                else if($this->_depth<=$level)
                                        $this->_output.=get_class($var).'(...)';
                                else
                                {
                                        $id=array_push($this->_objects,$var);
                                        $className=get_class($var);
                                        $members=(array)$var;
                                        $keys=array_keys($members);
                                        $spaces=str_repeat(' ',$level*4);
                                        $this->_output.="$className#$id\n".$spaces.'(';
                                        foreach($keys as $key)
                                        {
                                                $keyDisplay=strtr(trim($key),array("\0"=>':'));
                                                $this->_output.="\n".$spaces."    [$keyDisplay] => ";
                                                $this->_output.=$this->dumpInternal($members[$key],$level+1);
                                        }
                                        $this->_output.="\n".$spaces.')';
                                }
                                break;
                }
        }
        /**
         * Returns the name of the extension.
         *
         * @return string The extension name
         */
        public function getName()
        {
         return 'user_bundle';
        }
}

Then you can use this extension in your twig template:
 {{ mydump(object)}}

评论

此博客中的热门博文

My childhood

"Each person's life is like a book; some people prefer to savor it slowly, while others like to gradually forget it. Looking back, I want to see if I can discern the trajectory of the world from my seemingly insignificant life. I am a child from the countryside, and perhaps most people cannot understand what my so-called countryside looks like. Indeed, the impressions of the countryside can be very different depending on the country, and moreover, more than 40 years have passed, during these 40 years of rapid development in China. A phrase suddenly comes to mind, 'I see him building tall buildings, I see him feasting, I see everything collapsing.' The place where I was born is a small town in the southwest of China, a town so small that it only has one street, and the widest part is only 3 meters. Paved with stone slabs, worn by many years of use, the slabs are not flat but rather filled with small bumps and hollows, yet strangely smooth. At the end of the street is a ...

youtube script covid

[INTRO - Soft Music Playing] Narrator: "In August 2020, during the COVID-19 pandemic in China, I experienced a series of events that revealed the overbearing, unreasonable, and ignorant aspects of government policies. This story unfolds my observations and experiences in Xinjiang since April, presented in a neutral and factual manner." [Scene Transition - Music Shifts to a More Reflective Tone] Narrator: "April 8th marked the end of my nearly three-month-long home quarantine in Wuhan, as the lockdown was finally lifted. With Xinjiang gradually reopening since March, my work required me to return there as soon as possible." [Visuals: Scenes of Empty Streets in Wuhan, Transitioning to Busy Airports] Narrator: "My journey back to Xinjiang was fraught with delays. The direct flight on China Southern Airlines kept getting postponed. Reluctantly, I had to transit through Xi'an. Before leaving, I reported my health status to the community in Changji City, where I ...

survilliance in china

  Hello everyone, welcome to my YouTube channel. This is my first video, and I'm very happy to meet you all. I come from China, and looking back, time has passed so quickly. I've been in France for almost 20 years. Sometimes, when I chat with friends, I'm surprised at how little the French know about China. What's even more alarming is that the French media follows the narrative of the Chinese official media. This is why I decided to create a YouTube channel to talk to my French friends about the China I know. Since my parents and friends are still in China, and to avoid unnecessary impact on their lives, I've decided not to appear in person for now. This is how I fulfill my long-standing wish. My first episode is about "Digital Surveillance in China.",  Digital Surveillance: In China, using the official App Store is mandatory. Apple's App Store is China-specific, and all data is stored there. Google's App Store is simply inaccessible in China. If ...