Advanced Usage of the VarDumper Component

The dump() function is just a thin wrapper and a more convenient way to call VarDumper::dump(). You can change the behavior of this function by calling VarDumper::setHandler($callable). Calls to dump() will then be forwarded to $callable.

dump() 関数は単純なラッパーであり、VarDumper::dump() を呼び出すためのより便利な方法です。この関数の動作は、VarDumper::setHandler($callable) を呼び出すことで変更できます。その後、dump() への呼び出しが転送されます。 $callable に。

By adding a handler, you can customize the Cloners, Dumpers and Casters as explained below. A simple implementation of a handler function might look like this:

ハンドラーを追加することで、以下で説明する Cloners、Dumpers、および Casters をカスタマイズできます。ハンドラー関数の単純な実装は次のようになります。
1
2
3
4
5
6
7
8
9
10
11
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
use Symfony\Component\VarDumper\VarDumper;

VarDumper::setHandler(function ($var) {
    $cloner = new VarCloner();
    $dumper = 'cli' === PHP_SAPI ? new CliDumper() : new HtmlDumper();

    $dumper->dump($cloner->cloneVar($var));
});

Cloners

A cloner is used to create an intermediate representation of any PHP variable. Its output is a Data object that wraps this representation.

クローナーは、任意の PHP 変数の中間表現を作成するために使用されます。その出力は、この表現をラップする Dataobject です。

You can create a Data object this way:

この方法で Data オブジェクトを作成できます。
1
2
3
4
5
6
7
use Symfony\Component\VarDumper\Cloner\VarCloner;

$cloner = new VarCloner();
$data = $cloner->cloneVar($myVar);
// this is commonly then passed to the dumper
// see the example at the top of this page
// $dumper->dump($data);

Whatever the cloned data structure, resulting Data objects are always serializable.

複製されたデータ構造がどうであれ、結果の Data オブジェクトは常にシリアライズ可能です。

A cloner applies limits when creating the representation, so that one can represent only a subset of the cloned variable. Before calling cloneVar(), you can configure these limits:

クローン作成者は表現を作成するときに制限を適用するため、複製された変数のサブセットのみを表すことができます。cloneVar() を呼び出す前に、これらの制限を構成できます。
setMaxItems()
Configures the maximum number of items that will be cloned past the minimum nesting depth. Items are counted using a breadth-first algorithm so that lower level items have higher priority than deeply nested items. Specifying -1 removes the limit.
最小のネストの深さを超えて複製される項目の最大数を構成します。下位レベルのアイテムが深くネストされたアイテムよりも高い優先度を持つように、アイテムは幅優先アルゴリズムを使用してカウントされます。 -1 を指定すると、制限が解除されます。
setMinDepth()
Configures the minimum tree depth where we are guaranteed to clone all the items. After this depth is reached, only setMaxItems items will be cloned. The default value is 1, which is consistent with older Symfony versions.
すべてのアイテムをクローンすることが保証される最小のツリーの深さを構成します。この深さに達すると、setMaxItemsitems のみが複製されます。デフォルト値は 1 で、これは Symfony の古いバージョンと一致しています。
setMaxString()
Configures the maximum number of characters that will be cloned before cutting overlong strings. Specifying -1 removes the limit.
長すぎる文字列をカットする前に複製される文字の最大数を構成します。-1 を指定すると、制限が解除されます。

Before dumping it, you can further limit the resulting Data object using the following methods:

ダンプする前に、次のメソッドを使用して、resultingData オブジェクトをさらに制限できます。
withMaxDepth()
Limits dumps in the depth dimension.
深さ次元でのダンプを制限します。
withMaxItemsPerDepth()
Limits the number of items per depth level.
深度レベルごとのアイテム数を制限します。
withRefHandles()
Removes internal objects' handles for sparser output (useful for tests).
スパース出力用に内部オブジェクトのハンドルを削除します (テストに役立ちます)。
seek()
Selects only sub-parts of already cloned arrays, objects or resources.
既に複製された配列、オブジェクト、またはリソースのサブパーツのみを選択します。

Unlike the previous limits on cloners that remove data on purpose, these can be changed back and forth before dumping since they do not affect the intermediate representation internally.

意図的にデータを削除するクローン作成者に対する以前の制限とは異なり、これらは中間表現に内部的に影響を与えないため、ダンプする前に前後に変更できます。

Note

ノート

When no limit is applied, a Data object is as accurate as the native serialize function, and thus could be used for purposes beyond debugging.

制限が適用されない場合、Dataobject はネイティブのシリアル化関数と同じくらい正確であるため、デバッグ以外の目的にも使用できます。

Dumpers

A dumper is responsible for outputting a string representation of a PHP variable, using a Data object as input. The destination and the formatting of this output vary with dumpers.

ダンパーは、Data オブジェクトを入力として使用して、PHP 変数の文字列表現を出力します。この出力の出力先とフォーマットは、ダンパーによって異なります。

This component comes with an HtmlDumper for HTML output and a CliDumper for optionally colored command line output.

このコンポーネントには、HTML 出力用の HtmlDumper と、オプションで色付けされたコマンド ライン出力用の CliDumper が付属しています。

For example, if you want to dump some $variable, do:

たとえば、$変数をダンプしたい場合は、次のようにします。
1
2
3
4
5
6
7
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;

$cloner = new VarCloner();
$dumper = new CliDumper();

$dumper->dump($cloner->cloneVar($variable));

By using the first argument of the constructor, you can select the output stream where the dump will be written. By default, the CliDumper writes on php://stdout and the HtmlDumper on php://output. But any PHP stream (resource or URL) is acceptable.

コンストラクターの最初の引数を使用して、ダンプが書き込まれる出力ストリームを選択できます。デフォルトでは、CliDumper は php://stdout に書き込み、HtmlDumper は php://output に書き込みます。ただし、任意の PHPstream (リソースまたは URL) を使用できます。

Instead of a stream destination, you can also pass it a callable that will be called repeatedly for each line generated by a dumper. This callable can be configured using the first argument of a dumper's constructor, but also using the setOutput() method or the second argument of the dump() method.

ストリーム宛先の代わりに、ダンパーによって生成された行ごとに繰り返し呼び出される callable を渡すこともできます。この callable は、ダンパーのコンストラクターの最初の引数を使用して構成できますが、setOutput() メソッドまたは dump() メソッドの 2 番目の引数を使用することもできます。

For example, to get a dump as a string in a variable, you can do:

たとえば、ダンプを変数の文字列として取得するには、次のようにします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;

$cloner = new VarCloner();
$dumper = new CliDumper();
$output = '';

$dumper->dump(
    $cloner->cloneVar($variable),
    function ($line, $depth) use (&$output) {
        // A negative depth means "end of dump"
        if ($depth >= 0) {
            // Adds a two spaces indentation to the line
            $output .= str_repeat('  ', $depth).$line."\n";
        }
    }
);

// $output is now populated with the dump representation of $variable

Another option for doing the same could be:

同じことを行うための別のオプションは次のとおりです。
1
2
3
4
5
6
7
8
9
10
11
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;

$cloner = new VarCloner();
$dumper = new CliDumper();
$output = fopen('php://memory', 'r+b');

$dumper->dump($cloner->cloneVar($variable), $output);
$output = stream_get_contents($output, -1, 0);

// $output is now populated with the dump representation of $variable

Tip

ヒント

You can pass true to the second argument of the dump() method to make it return the dump as a string:

dump() メソッドの 2 番目の引数に true を渡して、ダンプを文字列として返すようにすることができます。
1
$output = $dumper->dump($cloner->cloneVar($variable), true);

Dumpers implement the DataDumperInterface interface that specifies the dump(Data $data) method. They also typically implement the DumperInterface that frees them from re-implementing the logic required to walk through a Data object's internal structure.

ダンプは、dump(Data $data) メソッドを指定する DataDumperInterface インターフェイスを実装します。また、通常は、Data オブジェクトの内部構造をウォークスルーするために必要なロジックを再実装する必要がないようにする DumperInterface も実装します。

The HtmlDumper uses a dark theme by default. Use the setTheme() method to use a light theme:

HtmlDumper はデフォルトでダークテーマを使用します。ライト テーマを使用するには、setTheme() メソッドを使用します。
1
2
// ...
$htmlDumper->setTheme('light');

The HtmlDumper limits string length and nesting depth of the output to make it more readable. These options can be overridden by the third optional parameter of the dump(Data $data) method:

HtmlDumper は、出力の文字列の長さとネストの深さを制限して、読みやすくします。これらのオプションは、dump(Data $data) メソッドの 3 番目のオプション パラメータでオーバーライドできます。
1
2
3
4
5
6
7
8
9
10
use Symfony\Component\VarDumper\Dumper\HtmlDumper;

$output = fopen('php://memory', 'r+b');

$dumper = new HtmlDumper();
$dumper->dump($var, $output, [
    // 1 and 160 are the default values for these options
    'maxDepth' => 1,
    'maxStringLength' => 160,
]);

The output format of a dumper can be fine tuned by the two flags DUMP_STRING_LENGTH and DUMP_LIGHT_ARRAY which are passed as a bitmap in the third constructor argument. They can also be set via environment variables when using assertDumpEquals($dump, $data, $filter, $message) during unit testing.

ダンパーの出力形式は、3 番目のコンストラクター引数でビットマップとして渡される DUMP_STRING_LENGTH と DUMP_LIGHT_ARRAY の 2 つのフラグによって微調整できます。単体テスト中に assertDumpEquals($dump, $data, $filter, $message) を使用する場合は、環境変数を介して設定することもできます。

The $filter argument of assertDumpEquals() can be used to pass a bit field of Caster::EXCLUDE_* constants and influences the expected output produced by the different casters.

assertDumpEquals() の $filter 引数は、Caster::EXCLUDE_* 定数の abit フィールドを渡すために使用でき、異なるキャスターによって生成される期待出力に影響を与えます。

If DUMP_STRING_LENGTH is set, then the length of a string is displayed next to its content:

DUMP_STRING_LENGTH が設定されている場合、文字列の長さがその内容の横に表示されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\AbstractDumper;
use Symfony\Component\VarDumper\Dumper\CliDumper;

$varCloner = new VarCloner();
$var = ['test'];

$dumper = new CliDumper();
echo $dumper->dump($varCloner->cloneVar($var), true);

// array:1 [
//   0 => "test"
// ]

$dumper = new CliDumper(null, null, AbstractDumper::DUMP_STRING_LENGTH);
echo $dumper->dump($varCloner->cloneVar($var), true);

// (added string length before the string)
// array:1 [
//   0 => (4) "test"
// ]

If DUMP_LIGHT_ARRAY is set, then arrays are dumped in a shortened format similar to PHP's short array notation:

DUMP_LIGHT_ARRAY が設定されている場合、配列は PHP の短い配列表記と同様の短縮形式でダンプされます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\AbstractDumper;
use Symfony\Component\VarDumper\Dumper\CliDumper;

$varCloner = new VarCloner();
$var = ['test'];

$dumper = new CliDumper();
echo $dumper->dump($varCloner->cloneVar($var), true);

// array:1 [
//   0 => "test"
// ]

$dumper = new CliDumper(null, null, AbstractDumper::DUMP_LIGHT_ARRAY);
echo $dumper->dump($varCloner->cloneVar($var), true);

// (no more array:1 prefix)
// [
//   0 => "test"
// ]

If you would like to use both options, then you can combine them by using the logical OR operator |:

両方のオプションを使用する場合は、論理 OR 演算子 | を使用してそれらを組み合わせることができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\AbstractDumper;
use Symfony\Component\VarDumper\Dumper\CliDumper;

$varCloner = new VarCloner();
$var = ['test'];

$dumper = new CliDumper(null, null, AbstractDumper::DUMP_STRING_LENGTH | AbstractDumper::DUMP_LIGHT_ARRAY);
echo $dumper->dump($varCloner->cloneVar($var), true);

// [
//   0 => (4) "test"
// ]

Casters

Objects and resources nested in a PHP variable are "cast" to arrays in the intermediate Data representation. You can customize the array representation for each object/resource by hooking a Caster into this process. The component already includes many casters for base PHP classes and other common classes.

PHP 変数にネストされたオブジェクトとリソースは、中間データ表現の配列に「キャスト」されます。キャスターをこのプロセスにフックすることにより、各オブジェクト/リソースの配列表現をカスタマイズできます。このコンポーネントには、ベース PHP クラスおよびその他の共通クラス用の manycasters が既に含まれています。

If you want to build your own Caster, you can register one before cloning a PHP variable. Casters are registered using either a Cloner's constructor or its addCasters() method:

独自の Caster を構築する場合は、PHP 変数を複製する前に登録できます。キャスターは、Cloner のコンストラクターまたはその addCasters() メソッドを使用して登録されます。
1
2
3
4
5
6
7
8
use Symfony\Component\VarDumper\Cloner\VarCloner;

$myCasters = [...];
$cloner = new VarCloner($myCasters);

// or

$cloner->addCasters($myCasters);

The provided $myCasters argument is an array that maps a class, an interface or a resource type to a callable:

提供された $myCasters 引数は、クラス、インターフェース、またはリソース タイプを callable にマップする配列です。
1
2
3
4
$myCasters = [
    'FooClass' => $myFooClassCallableCaster,
    ':bar resource' => $myBarResourceCallableCaster,
];

As you can notice, resource types are prefixed by a : to prevent colliding with a class name.

お気づきのように、クラス名との衝突を防ぐために、リソース タイプには : がプレフィックスとして付けられています。

Because an object has one main class and potentially many parent classes or interfaces, many casters can be applied to one object. In this case, casters are called one after the other, starting from casters bound to the interfaces, the parents classes and then the main class. Several casters can also be registered for the same resource type/class/interface. They are called in registration order.

オブジェクトには 1 つのメイン クラスと潜在的に多くの親クラスまたはインターフェイスがあるため、多くのキャスターを 1 つのオブジェクトに適用できます。この場合、キャスターは、インターフェイス、親クラス、メイン クラスにバインドされたキャスターから開始して、次々に呼び出されます。複数のキャスターを同じリソース タイプ/クラス/インターフェイスに登録することもできます。登録順に呼び出されます。

Casters are responsible for returning the properties of the object or resource being cloned in an array. They are callables that accept five arguments:

キャスターは、複製されたオブジェクトまたはリソースのプロパティを配列で返す責任があります。これらは、5 つの引数を受け入れる callable です。
  • the object or resource being casted;
    キャストされるオブジェクトまたはリソース。
  • an array modeled for objects after PHP's native (array) cast operator;
    PHP のネイティブ (配列) キャスト演算子に基づいてオブジェクト用にモデル化された配列。
  • a Stub object representing the main properties of the object (class, type, etc.);
    オブジェクトの主なプロパティ (クラス、タイプなど) を表すスタブ オブジェクト。
  • true/false when the caster is called nested in a structure or not;
    キャスターが構造体にネストされて呼び出されるかどうかは true/false。
  • A bit field of Caster ::EXCLUDE_* constants.
    Caster ::EXCLUDE_*定数のビットフィールド。

Here is a simple caster not doing anything:

以下は、何もしない単純なキャスターです。
1
2
3
4
5
6
7
8
use Symfony\Component\VarDumper\Cloner\Stub;

function myCaster($object, $array, Stub $stub, $isNested, $filter)
{
    // ... populate/alter $array to your needs

    return $array;
}

For objects, the $array parameter comes pre-populated using PHP's native (array) casting operator or with the return value of $object->__debugInfo() if the magic method exists. Then, the return value of one Caster is given as the array argument to the next Caster in the chain.

オブジェクトの場合、$array パラメーターは、PHP のネイティブ (配列) キャスト演算子を使用するか、マジック メソッドが存在する場合は $object->__debugInfo() の戻り値を使用して事前に入力されます。次に、1 つの Caster の戻り値が配列引数としてチェーン内の次の Caster に渡されます。

When casting with the (array) operator, PHP prefixes protected properties with a \0*\0 and private ones with the class owning the property. For example, \0Foobar\0 will be the prefix for all private properties of objects of type Foobar. Casters follow this convention and add two more prefixes: \0~\0 is used for virtual properties and \0+\0 for dynamic ones (runtime added properties not in the class declaration).

(array) 演算子を使用してキャストすると、PHP は保護されたプロパティの前に \0*\0 を付け、非公開のプロパティにはそのプロパティを所有するクラスを付けます。たとえば、\0Foobar\0 は、タイプ Foobar のオブジェクトのすべてのプライベート プロパティのプレフィックスになります。キャスターはこの規則に従い、さらに 2 つのプレフィックスを追加します。\0~\0 は仮想プロパティに使用され、\0+\0 は動的プロパティに使用されます (実行時にクラス宣言にないプロパティが追加されます)。

Note

ノート

Although you can, it is advised to not alter the state of an object while casting it in a Caster.

可能ですが、Caster でキャストしている間はオブジェクトの状態を変更しないことをお勧めします。

Tip

ヒント

Before writing your own casters, you should check the existing ones.

独自のキャスターを作成する前に、既存のものを確認する必要があります。

Adding Semantics with Metadata

Since casters are hooked on specific classes or interfaces, they know about the objects they manipulate. By altering the $stub object (the third argument of any caster), one can transfer this knowledge to the resulting Data object, thus to dumpers. To help you do this (see the source code for how it works), the component comes with a set of wrappers for common additional semantics. You can use:

キャスターは特定のクラスまたはインターフェースに引っかかっているため、操作するオブジェクトについて知っています。 $stub オブジェクト (任意のキャスターの 3 番目の引数) を変更することにより、この知識を結果の Data オブジェクト、つまりダンパーに転送できます。これを行うのに役立つように (どのように機能するかについてはソース コードを参照してください)、コンポーネントには共通の追加セマンティクス用の一連のラッパーが付属しています。以下を使用できます。
  • ConstStub to wrap a value that is best represented by a PHP constant;
    ConstStub は、PHP 定数によって最も適切に表現される値をラップします。
  • ClassStub to wrap a PHP identifier (i.e. a class name, a method name, an interface, etc.);
    PHP 識別子 (クラス名、メソッド名、インターフェースなど) をラップする ClassStub;
  • CutStub to replace big noisy objects/strings/etc. by ellipses;
    大きなノイジー オブジェクト/文字列などを置き換える CutStub。楕円で;
  • CutArrayStub to keep only some useful keys of an array;
    CutArrayStub を使用して、配列の一部の有用なキーのみを保持します。
  • ImgStub to wrap an image;
    画像をラップする ImgStub;
  • EnumStub to wrap a set of virtual values (i.e. values that do not exist as properties in the original PHP data structure, but are worth listing alongside with real ones);
    仮想値のセットをラップする EnumStub (つまり、元の PHP データ構造にはプロパティとして存在しないが、実際の値と一緒にリストする価値がある値)。
  • LinkStub to wrap strings that can be turned into links by dumpers;
    LinkStub は、ダンパーによってリンクに変換できる文字列をラップします。
  • TraceStub and their
    TraceStub とその
  • FrameStub and
    FrameStub と
  • ArgsStub relatives to wrap PHP traces (used by ExceptionCaster).
    PHPtraces をラップするための ArgsStub 関連 (ExceptionCaster で使用)。

For example, if you know that your Product objects have a brochure property that holds a file name or a URL, you can wrap them in a LinkStub to tell HtmlDumper to make them clickable:

たとえば、Product オブジェクトにファイル名または URL を保持するパンフレット プロパティがあることがわかっている場合は、それらを LinkStub でラップして、HtmlDumper にクリック可能にするように指示できます。
1
2
3
4
5
6
7
8
9
use Symfony\Component\VarDumper\Caster\LinkStub;
use Symfony\Component\VarDumper\Cloner\Stub;

function ProductCaster(Product $object, $array, Stub $stub, $isNested, $filter = 0)
{
    $array['brochure'] = new LinkStub($array['brochure']);

    return $array;
}