2012-01-06 3 views
1

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

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

namespace Stuki;

use Doctrine\ORM\EntityManager; 

# abstract 
class Model { 
    protected $em; 

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

Д. И. для этого класса

'di' => array(

'instance' => array(

     'Stuki\Model' => array(
      'parameters' => array(
       'em' => 'doctrine_em' 
      )   
     ), 

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

namespace Stuki\Model;

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 для объектов-предков, не используя интроспекцию?

+0

С точки зрения сущности сущности сущности не должны быть осведомленными об объекте. Думаю, вы используете SpiffyDoctrineORM для поддержки доктрины zf2? – Fge

ответ

0

К сожалению мои предположения были неверны, когда я ответил через 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.

 Смежные вопросы

  • Нет связанных вопросов^_^