Инъекция зависимостей ZF2 в объекты Ancesor - PullRequest
1 голос
/ 07 января 2012

Моя цель - использовать DI в объектах-предках с помощью сеттеров, поэтому у меня есть общий DI для объектов-предков. например класс абстрактной модели, от которого унаследованы мои другие модели, с предварительно настроенным менеджером сущностей и т. д.

До сих пор, после настройки предка и успешного его создания с помощью DI, изменения его на абстрактный класс, а затем создания экземпляра предка этого класса, DI для абстрактного (установленного на абстрактный или нет) не запускается.

namespace Stuki;</p> <pre><code>use Doctrine\ORM\EntityManager; # abstract class Model { protected $em; public function setEm(EntityManager $em) { $this->em = $em; } }

DI для этого класса

'di' => array(</p> <pre><code> 'instance' => array( 'Stuki\Model' => array( 'parameters' => array( 'em' => 'doctrine_em' ) ),

Вышеупомянутый класс и DI будут работать. Но я хочу, чтобы он запускался на объектах-предках, поэтому

namespace Stuki\Model;</p> <pre><code>use Stuki\Model as StukiModel; class Authentication extends StukiModel { public function getIdentity() { return 'ħ'; #die('get identity'); } } $auth = $e->getTarget()->getLocator()->get('Stuki\Model\Authentication');

Последняя строка, $ auth =, не запускает DI.

Как настроить DI для объектов-предков, не используя интроспекцию?

1 Ответ

0 голосов
/ 07 января 2012

Извините, мои предположения были неверны, когда я ответил через Meetup;)

Суть вашей проблемы в том, что вы настраиваете Stuki \ Model для использования EntityManager в InstanceManager, но запрашиваете Di для Stuki \ Authentication.

Вы можете переключиться на инъекции конструктора ... это работает, но мне не очень нравится определять конструктор в классе предка:

class EntityManager {

}

# abstract
abstract class Model {
    protected $em;

    public function __construct(EntityManager $em) {
        $this->em = $em;
    }
}

class Authentication extends Model {
    public function getIdentity() {
        return 'ħ'; #die('get identity');
    }
}

$di = new Zend\Di\Di();
$im = new Zend\Di\InstanceManager();
$di->setInstanceManager($im);
$auth = $di->get('Authentication');
var_dump($auth);

Стоит отметить, что в обоих наших примерах Ди по-прежнему необходимо использовать самоанализ для обнаружения таких вещей, как экземпляр, методы и параметры метода. Единственный способ избежать самоанализа во время выполнения - это прекомпилировать: http://packages.zendframework.com/docs/latest/manual/en/zend.di.definition.html#zend.di.definition.compilerdefinition.

...