1

我有一個ViewHelper並希望在Module#getViewHelperConfig()將其初始化:如何在Zend Framewok 2中的模塊#getViewHelperConfig()調用服務定位器對象上的自定義服務?

<?php 
namespace Search; 

use statements... 

class Module implements 
    ConfigProviderInterface, 
    ServiceProviderInterface, 
    AutoloaderProviderInterface, 
    ViewHelperProviderInterface { 

    public function getConfig() ... 

    public function getAutoloaderConfig() ... 

    public function getServiceConfig() { 
     $breakpoint = null; 
     try { 
      return array (
       'factories' => array(
        ... 
        'SearchFormCourseSearchForm' => function ($serviceManager) { 
         $cacheService = $serviceManager->get('Cache\Model\CityStorage'); 
         $cities = $cacheService->getCities(); 
         $searchForm = new Form\CourseSearchForm($cities); 
         return $searchForm; 
        }, 
       ) 
      ); 
     } ... 
    } 

    public function getViewHelperConfig() { 
     $breakpoint = null; 
     return array(
      'factories' => array(
       'searhForm' => function($serviceManager) { 
        $helper = new View\Helper\SearchForm(array('render' => true, 'redirect' => false)); 
        $helper->setViewTemplate('search/search/search-courses'); 
        $searchForm = $serviceManager->get('SearchFormCourseSearchForm'); 
        $helper->setSearchForm($searchForm); 
        return $helper; 
       } 
      ) 
     ); 
    } 

但ZF不叫我的工廠。取而代之的是它試圖創建一個新的SearchFormCourseSearchForm實例:

Fatal error: Uncaught exception 'Zend\ServiceManager\Exception\ServiceNotFoundException' with message 'Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for SearchFormCourseSearchForm' in /var/www/bar/foo/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php on line 456

我應該如何使用服務工廠從Module#getServiceConfig()創造了在Module#getViewHelperConfig()一個ViewHelper

回答

2

您需要獲取主服務定位器。在getViewHelperConfig()中的$serviceManager是View Helper服務定位器。

讓主服務定位在getViewHelperConfig()功能,請執行下列操作:

$maimSm = $serviceManager->getServiceLocator();

因此:

public function getViewHelperConfig() { 
    return array(
     'factories' => array(
      'searhForm' => function($serviceManager) { 
       $helper = new View\Helper\SearchForm(array('render' => true, 'redirect' => false)); 
       $helper->setViewTemplate('search/search/search-courses'); 
       $maimSm = $serviceManager->getServiceLocator(); 
       $searchForm = $maimSm->get('SearchFormCourseSearchForm'); 
       $helper->setSearchForm($searchForm); 
       return $helper; 
      } 
     ) 
    ); 
} 

有相當多的職位多一點解釋這一戰略細節,我會去追捕他們。

編輯

服務經理/在ZF2定位器的一個很好的說明,請參見Using Zend Framework service managers in your application

+0

謝謝,作品!嗯,我對「主」服務定位器一無所知。我認爲,整個應用程序只有一個「中央」服務定位器... – automatix 2013-04-10 13:47:15

+1

我認爲[this](http://juriansluiman.nl/en/article/120/using-zend-framework-service-managers-在你的應用程序)博客文章做了很好的解釋:) – 2013-04-10 13:52:23