Как вызвать пользовательскую службу для объекта локатора службы из Module#getViewHelperConfig() в Zend Framewok 2?

У меня есть ViewHelper и я хочу инициализировать его в Module#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:

Неустранимая ошибка: необработанное исключение «Zend\ServiceManager\Exception\ServiceNotFoundException» с сообщением «Zend\ServiceManager\ServiceManager::get не удалось получить или создать экземпляр для SearchFormCourseSearchForm» в /var/www/bar/foo/vendor/zendframework/ zendframework/library/Zend/ServiceManager/ServiceManager.php в строке 456

Как мне использовать сервисные фабрики, полученные от Module#getServiceConfig(), создавая ViewHelper в Module#getViewHelperConfig()?


person automatix    schedule 10.04.2013    source источник


Ответы (1)


Вам нужно получить основной локатор службы. $serviceManager в getViewHelperConfig() — это локатор службы 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;
            }
        )
    );
}

Есть довольно много постов, объясняющих эту стратегию более подробно, я поищу их.

Изменить

См. раздел Использование менеджеров служб Zend Framework в вашем приложении. за хорошее описание менеджеров/локаторов сервисов в ZF2.

person Aydin Hassan    schedule 10.04.2013
comment
Спасибо, работает! Хм, я ничего не знал об основном Service Locator. Я думал, что для всего приложения есть только один центральный локатор сервисов... - person automatix; 10.04.2013
comment
Я думаю, что этот блог пост хорошо объясняет это :) - person Aydin Hassan; 10.04.2013