Zendframework2 Путаница с внедрением зависимостей

Я немного смущен тем, как 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',
            ),
        ),

работает, потому что в нашем классе контроллера альбомов есть функция 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?

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


person james    schedule 27.10.2011    source источник
comment
Я думаю, что разобрался с этим сейчас (ну, в основном ..) func_get_args используется для получения имени параметра конструктора (которое равно $map=null). Итак, в моем коде выше ('map' => array('url' => 'Application\View\Helper\Url',) говорится, что конструктор $map будет массивом (array('url' => 'Application\ View\Helper\Url') Я проверил это, внеся изменения в параметр конструктора в $map1, что привело к прекращению работы вышеперечисленного. Затем я изменил его на 'map1' => массив, и все снова заработало.   -  person james    schedule 27.10.2011


Ответы (1)


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

Итак, если у вас есть такой класс:

<?php

namespace Foo;

class Bar
{
    public function __construct ($baz) {}
    public function setSomethingElse ($bat) {}
}

Вы можете ввести как $baz, так и $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.

person Jurian Sluiman    schedule 13.12.2011