2014-02-18 3 views
0

Я начал изучать ZF-2.2, но имею проблему с ServiceManager.Завод был вызван, но не возвратил экземпляр

module.config.php

'service_manager' => array(
    'abstract_factories' => array(
     'Zend\Cache\Service\StorageCacheAbstractServiceFactory', 
     'Zend\Log\LoggerAbstractServiceFactory', 
), 

module.php

public function getServiceConfig(){ 
    return array(
     'invokables' => array(
      'PostDataMapper' => 'student\Model\PostDataMapper', 
     ), 
     'factories' => array(
      'PostIdentityMap' => function ($sm) { 
     }), 
    ); 
} 

студент \ SRC \ студент \ модель \ PostDataMapper.php

namespace student\Model; 

    class PostDataMapper{ 



     private $dbcon="postgresql"; 
     protected $dbcon1 ="put"; 

    } 

студент \ SRC \ студент \ Модель \ PostIdendityMap.php

class PostIdentityMap { 

    private $datamapper; 

    public function __construct(PostDataMapper $pdm) { 
     $this->datamapper = $pdm; 
    } 
} 

Если я пытался как этот

$pim = $this->getServiceLocator()->get('PostIdentityMap'); 

--------------------------------------------- 

Zend\ServiceManager\Exception\ServiceNotCreatedException 
C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php:911 

Завод был вызван, но не возвращает экземпляр.

#0 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php(1029): Zend\ServiceManager\ServiceManager->createServiceViaCallback(Object(Closure), 'postidentitymap', 'PostIdentityMap') 
#1 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php(601): Zend\ServiceManager\ServiceManager->createFromFactory('postidentitymap', 'PostIdentityMap') 
#2 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php(561): Zend\ServiceManager\ServiceManager->doCreate('PostIdentityMap', 'postidentitymap') 
#3 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php(503): Zend\ServiceManager\ServiceManager->create(Array) 
#4 C:\wamp\www\school\module\student\src\student\Controller\BlogController.php(37): Zend\ServiceManager\ServiceManager->get('PostIdentityMap') 
#5 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\Mvc\Controller\AbstractActionController.php(83): student\Controller\BlogController->postAction() 
#6 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent)) 
#7 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent)) 
#8 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure)) 
#9 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\Mvc\Controller\AbstractController.php(117): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure)) 
#10 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\Mvc\DispatchListener.php(114): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request), Object(Zend\Http\PhpEnvironment\Response)) 
#11 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent)) 
#12 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent)) 
#13 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure)) 
#14 C:\wamp\www\school\vendor\zendframework\zendframework\library\Zend\Mvc\Application.php(309): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure)) 
#15 C:\wamp\www\school\public\index.php(17): Zend\Mvc\Application->run() 
#16 {main} 
+0

Зачем ему что-либо возвращать? У вас нет контента внутри вашего определения 'PostIdentMap' – Sam

ответ

1

Когда вы используете закрытие в качестве фабрики услуг, вам необходимо будет обеспечить создание и возврат требуемого экземпляра.

Например

public function getServiceConfig(){ 
    return array(
     'invokables' => array(
      'PostDataMapper' => 'student\Model\PostDataMapper', 
     ), 
     'factories' => array(
     'PostIdentityMap' => function ($sm) { 
      return new Model\PostIdendityMap(); 
     }), 
    ); 
} 

Рассматривая объект не имеет конструктора; Вы можете переместить определение в конфигурационный ключ invokables. Это означает, что диспетчер службы создаст экземпляр для вас (без необходимости в заводе).

public function getServiceConfig(){ 
    return array(
     'invokables' => array(
      'PostDataMapper' => 'student\Model\PostDataMapper', 
      'PostIdentityMap' => 'student\Model\PostIdendityMap', 
     ), 
    ); 
} 

Также; Попытайтесь следовать за ZF2 skeleton application naming conventions - директория 'student' должна быть заглавной.

+0

, теперь он работает ... – user3322020

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