debugging-and-complex-use-cases.md 2.69 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
# Debugging & Complex Use Cases

## Debugging a DiC

It is possible to dump the information contained within both the `Definition`
and `InstanceManager` for a `Zend\Di\Di` instance.

The easiest way is to do the following:

```php
Zend\Di\Display\Console::export($di);
```

If you are using a `RuntimeDefinition` where upon you expect a particular
definition to be resolve at the first-call, you can see that information to the
console display to force it to read that class:

```php
Zend\Di\Display\Console::export($di, ['A\ClassIWantTo\GetTheDefinitionFor']);
```

## Complex Use Cases

### Interface Injection

```php
namespace Foo\Bar
{
    class Baz implements BamAwareInterface
    {
        public $bam;

        public function setBam(Bam $bam)
        {
            $this->bam = $bam;
        }
    }

    class Bam
    {
    }

    interface BamAwareInterface
    {
        public function setBam(Bam $bam);
    }
}

namespace {
    include 'zf2bootstrap.php';
    $di = new Zend\Di\Di;
    $baz = $di->get('Foo\Bar\Baz');
}
```

### Setter Injection with Class Definition

```php
namespace Foo\Bar
{
    class Baz
    {
        public $bam;

        public function setBam(Bam $bam)
        {
            $this->bam = $bam;
        }
    }

    class Bam {
    }
}

namespace {
    $di = new Zend\Di\Di;
    $di->configure(new Zend\Di\Config([
        'definition' => [
            'class' => [
                'Foo\Bar\Baz' => [
                    'setBam' => ['required' => true],
                ],
            ],
        ],
    ]));
    $baz = $di->get('Foo\Bar\Baz');
}
```

### Multiple Injections To A Single Injection Point

```php
namespace Application
{
    class Page
    {
        public $blocks;

        public function addBlock(Block $block)
        {
            $this->blocks[] = $block;
        }
    }

    interface Block
    {
    }
}

namespace MyModule {
    class BlockOne implements \Application\Block {}
    class BlockTwo implements \Application\Block {}
}

namespace {
    include 'zf2bootstrap.php';
    $di = new Zend\Di\Di;
    $di->configure(new Zend\Di\Config([
        'definition' => [
            'class' => [
                'Application\Page' => [
                    'addBlock' => [
                        'block' => [
                            'type' => 'Application\Block',
                            'required' => true
                        ],
                    ],
                ],
            ],
        ],
        'instance' => [
            'Application\Page' => [
                'injections' => [
                    'MyModule\BlockOne',
                    'MyModule\BlockTwo',
                ],
            ],
        ],
    ]));
    $page = $di->get('Application\Page');
}
```