How to write own DD() function same as laravel?
Asked Answered
E

16

31

I used laravel for a long time but currently I work with wordpress. I loved using the laravel's DD() function. But in wordpress I can only use these,

   print_r(),
   var_dump(),
   var_export()....

These all are just expand entire array or object. But I need laravel's expand and close mechanism for handling array and object. I use the following as general dd need,

if (!function_exists('dd')) {
 function dd()
  {
      echo '<pre>';
      array_map(function($x) {var_dump($x);}, func_get_args());
      die;
   }
 }

It works well, but I need a styled and organised form of listing.

Is it possible ?

Extinct answered 16/1, 2017 at 4:0 Comment(3)
Why reinvent the wheel? packagist.org/packages/symfony/var-dumperGat
@RajenderJoshi Sometimes you want a rubber tire instead of one made from wood or stone. Laravel uses varDumper only for the formatting - the behaviour is kind of different, because the execution is not stopped after dumping data.Ellmyer
@RajenderJoshi in my case, i need dd() as a static file, not as a Composer package, as the legacy application would otherwise break (as it would call autoloader several times)Microprint
E
43

Laravel's dd uses symfony's VarDump component. It provides a globally available dump function which formats the output. The only difference is that it won`t "die" after the dump, you'll have to do that manually - but in most cases that isn't even something you'd want.

  1. Run composer global require symfony/var-dumper (assuming you have composer in your wordpress project)
  2. Add auto_prepend_file = ${HOME}/.composer/vendor/autoload.php to your php.ini file;
  3. From time to time, run composer global update symfony/var-dumper to have the latest bug fixes.

Here is the documentation for the VarDumper component. https://symfony.com/doc/current/components/var_dumper.html

symfony/var-dumper version >= 4.1:

Since var-dumper version 4.1, dd() is already declared. Loading the library is enough.


symfony/var-dumper version <= 4.0:

Declare a dd function, dumping all arguments and stopping the process:

if (!function_exists('dd')) {
    function dd()
    {
        foreach (func_get_args() as $x) {
            dump($x);
        }
        die;
    }
 }
Ellmyer answered 16/1, 2017 at 7:8 Comment(1)
latest VarDumper versions already have dd function added by default. You don't have to manually create one.Cambridgeshire
S
23

I updated more functions and latest code of d functions below in debug functions package.

(Below answer is about 1 year ago.)

======================================

Below is my own code. It can work in plain PHP (no framework).

function d($data){
    if(is_null($data)){
        $str = "<i>NULL</i>";
    }elseif($data == ""){
        $str = "<i>Empty</i>";
    }elseif(is_array($data)){
        if(count($data) == 0){
            $str = "<i>Empty array.</i>";
        }else{
            $str = "<table style=\"border-bottom:0px solid #000;\" cellpadding=\"0\" cellspacing=\"0\">";
            foreach ($data as $key => $value) {
                $str .= "<tr><td style=\"background-color:#008B8B; color:#FFF;border:1px solid #000;\">" . $key . "</td><td style=\"border:1px solid #000;\">" . d($value) . "</td></tr>";
            }
            $str .= "</table>";
        }
    }elseif(is_resource($data)){
        while($arr = mysql_fetch_array($data)){
            $data_array[] = $arr;
        }
        $str = d($data_array);
    }elseif(is_object($data)){
        $str = d(get_object_vars($data));
    }elseif(is_bool($data)){
        $str = "<i>" . ($data ? "True" : "False") . "</i>";
    }else{
        $str = $data;
        $str = preg_replace("/\n/", "<br>\n", $str);
    }
    return $str;
}

function dnl($data){
    echo d($data) . "<br>\n";
}

function dd($data){
    echo dnl($data);
    exit;
}

function ddt($message = ""){
    echo "[" . date("Y/m/d H:i:s") . "]" . $message . "<br>\n";
}
Selfsatisfaction answered 25/12, 2017 at 0:40 Comment(0)
I
6

For others who might be interested in Laravel like dd(), please check this repo -

https://github.com/wanfeiyy/laravel-dd

Instrumentation answered 21/4, 2017 at 3:52 Comment(1)
If you watch the source code of that library, turns out it's actually quite simple to replicate using the original Symphony components. All the logic seems to be in this file and it's quite simple to copy: github.com/wanfeiyy/laravel-dd/blob/master/src/Dd/Dumper.phpAutomaton
Q
5

The Laravel dd is actually a great function. However, the undergoing mechanism is var_dump and then die.

Example:

$arr = [1,2,3,4,5,6];
var_dump($arr);
die();
Quickel answered 16/1, 2017 at 6:27 Comment(2)
Yah, you are right. But what abt its schema. It won't elaborate entire array. Because in some cases, array may be too big. In that case we couldn't use that. But laravel do some stuff to minimise this issue by fold up.Extinct
you can set the depth that var_dump() will go to. I can't remember how (I think it might be in php.ini)Nicaragua
S
5

composer require --dev symfony/var-dumper

<?php     
if (! function_exists('dd')) {
            /**
             * Dump the passed variables and end the script.
             *
             * @param  mixed
             * @return void
             */
            function dd()
            {
                array_map(function ($value) {
                    if (class_exists(Symfony\Component\VarDumper\Dumper\CliDumper::class)) {
                        $dumper = 'cli' === PHP_SAPI ?
                            new Symfony\Component\VarDumper\Dumper\CliDumper :
                            new Symfony\Component\VarDumper\Dumper\HtmlDumper;
                        $dumper->dump((new Symfony\Component\VarDumper\Cloner\VarCloner)->cloneVar($value));
                    } else {
                        var_dump($value);
                    }
                }, func_get_args());
                die(1);
            }
        }

?>
Skindeep answered 2/11, 2019 at 16:28 Comment(0)
G
3

You can bring in this namespace in your class use Illuminate\Support\Debug\Dumper; and then use it for your variables like this:

(new Dumper)->dump($myVariable);
Granger answered 8/5, 2017 at 14:42 Comment(0)
R
3

it works like a charm.

function dd()
{
   array_map(function($x) { var_dump($x); }, func_get_args()); die;
}
Ramshackle answered 20/11, 2019 at 5:45 Comment(0)
E
2

I do it like this:

function dd($a){
    var_dump($a);
    exit;
}

I use it all the time. Even created a Snippet for it in Sublime.

I also use var_masterpiece Chrome extension to get a nice output, where I can expand and collapse the array keys, etc.

Eggcup answered 7/8, 2018 at 14:44 Comment(0)
L
2

I do like this:

function dd($var){ 
    echo "<pre>";
    print_r($var);
    exit;
}
Lousewort answered 19/8, 2019 at 7:53 Comment(1)
I have a similar function, I would just modify this slightly into echo '<pre>'.print_r($var,true).'</pre>'; exit;Bala
S
1

Most of the time i work with laravel framework, when it came to debugging the dd() helper method become a very handful tool.

But recently i was requested to work on a symfony 3.4 project, at first i use dump($my_vars); die(); to dump and die my vars. But that became quickly very combersome. So i ended up by adding a dd() global helper method to the symfony 3.4 project, here is how:

Inside src/ folder i created Support/ folder, inside of the Support/ folder i created helpers.php file where i added my dump helper functions.

src/Support/helpers.php

if (!function_exists('dd')) {

    /**
     * Dump the passed variables and end the script.
     *
     * @return void
     */
    function dd() {

        $args = func_get_args();

        call_user_func_array('dump', $args);

        die(1);
    }
}

You may need to add the new file (helpers.php) to your composer.json file to be loaded for you automatically, like this:

composer.json

{
    ...

    "autoload": {
        "psr-4": {
            "App\\": "src/"
        },
        "files": [
            "src/Support/helpers.php"
        ]
    },

    ...
}
Spectra answered 11/12, 2019 at 12:40 Comment(0)
O
1

The @coloured-panda answer is not working anymore. Here is the updated code:

use Symfony\Component\VarDumper\VarDumper;

if (! function_exists('dd')) {
    /**
     * Dump the passed variables and end the script.
     *
     * @param  mixed  $vars
     * @return void
     */
    function dd(...$vars)
    {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: *');
        header('Access-Control-Allow-Headers: *');
        http_response_code(500);

        foreach ($vars as $v) {
            VarDumper::dump($v);
        }

        die(1);
    }
}
Olethea answered 11/11, 2020 at 19:15 Comment(0)
R
0

You can use the package mp091689/dump-die and then you can do:

dd($variable);

OR

dd($variable1, $variable2, ..);
Rigadoon answered 30/6, 2019 at 16:16 Comment(0)
J
0

Here is the simplest solution:

if(!function_exists('dd'))
{
    function dd( $result )
    {
        echo '<pre>'; print_r($result); die();
    }
}
Jobe answered 1/11, 2021 at 21:41 Comment(0)
A
0
if(!function_exists('dd')) { 
    function dd($arrayData, $exit=TRUE) {
        echo "<pre>"; print_r($arrayData);
        if($exit===TRUE) die();
    }
}
Araarab answered 5/4, 2022 at 7:42 Comment(0)
P
0
if (!function_exists('dd')) {

    #[NoReturn] function dd(mixed $data):void
    {
        echo "<pre style='background:#1d1d1d; color: greenyellow; position:absolute; left: 0; top: 0; z-index: 9999999; width: 100%; height: 600px'>";
        print_r($data);
        echo '<pre>';
        die();
    }

}
Photofluorography answered 8/3, 2023 at 13:48 Comment(0)
D
0

I use the following one. Learned from Jeffrey Way:

function dd($data)
{
    echo "<pre>";
        var_dump($data);
    echo "</pre>";

    die();
}
Dowling answered 2/8, 2023 at 12:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.