Zendframework2 Внедрение зависимостей Путаница - PullRequest
1 голос
/ 27 октября 2011

Я немного запутался, как DI работает с ZF2.Я провел последние пару дней, пытаясь обдумать это.Хотя я добился определенного прогресса, многое из этого все еще сбивает меня с толку ...

Используя это руководство (http://akrabat.com/getting-started-with-zend-framework-2/)), мне удалось понять, что следующее:

'di' => array('instance' => array(
        'alias' => array(
            'album' => 'Album\Controller\AlbumController',
        ),
        'Album\Controller\AlbumController' => array(
            'parameters' => array(
                'albums' => 'Album\Model\Albums',
            ),
        ),

работает, потому чтов нашем классе Album Controller у нас есть функция setAlbum. Поэтому, когда класс DI вызовет эту функцию setAlbums и передаст ей класс 'Album \ Model \ Albums'.

Теперь давайте посмотрим на это (которое поставляется в скелетном приложении с сайта Zend)

            'Zend\View\HelperLoader' => array(
            'parameters' => array(
                'map' => array(
                    'url' => 'Application\View\Helper\Url',
                ),
            ),
        ),

Теперь я ожидаю, что в Zend \ View \ HelperLoader (или унаследованном классе) будет содержатьсяФункция setMap (), чтобы класс DI передавал массив. Но, похоже, это не так. Поскольку я нигде не могу найти setMap.

Мой первый вопрос: что я не понимаю, как работает DI?с ZF2 ... Но также и то, что на самом деле делает приведенный выше код (о zend \ view \ helper). Я имею в виду то, что делает внедрение 'map' => array ('url' => 'Application \ View \ Helper \ Url') в Zend \ View \ HelperLoader на самом деле?

Спасибо за любую помощь, которую может оказать любой.Я ценю, что это бета-версия, и ответы, которые я могу получить сейчас, не будут применены через несколько месяцев.Но все это кажется довольно фундаментальным, и я просто не понимаю!

1 Ответ

4 голосов
/ 13 декабря 2011

Конфигурация DI ZF2 действительно работает с именами аргументов в подписи.Неважно, если это делается с помощью конструктора или явного сеттера.Однако сеттер должен начинаться с «set», чтобы быть распознанным Zend\Di\Di.

Так что, если у вас есть такой класс:* и $bat:

'di' => array(
    'instance' => array(
        'Foo\Bar' => array(
            'parameters' => array(
                'baz' => 'Something\Here',
                'bat' => 'Something\There',
            ),
        ),
    ),
)

Для Zend\Di не имеет значения, какое именно имя функции, если оно начинается с «set» и имя аргумента является правильным.Вот почему Foo\Bar::setSomethingElse($bat) работает так же, как Foo\Bar::setBat($bat).

Просто убедитесь, что вы правильно назвали свои аргументы.Например, легко сделать что-то вроде этого:

<?php

namespace Foo;

class Bar
{
    public function setCacheForBar ($cache) {}
    public function setCacheForBaz ($cache) {}
}

Но это не будет хорошо работать вместе с Zend\Di.

...