zf2 Создание простого сервиса и доступ к нему через viewhelper

Я пытаюсь создать простой сервис в zf2, к которому я могу получить доступ, используя viewhelper.

Шаг 1. Я создал класс в src/Application/Service/Service1.php следующим образом.

namespace Application\Service;
    use Zend\ServiceManager\ServiceLocatorAwareInterface;
    use Zend\ServiceManager\ServiceLocatorInterface;

    class Service1 implements ServiceLocatorAwareInterface
    {

        public function __construct()
        {

        }

        public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
        {

        }    

        public function getServiceLocator()
        {

        }

    }

Шаг 2. Я настроил это в файле module.php, как показано ниже.

public function getServiceConfig()
{    
     return array(
        'factories' => array(
            'Application\Service\Service1' => function ($sm) {
                return new \Application\Service\Service1($sm);
            },
        )
    );   
}

public function onBootstrap($e)
{        
   $serviceManager = $e->getApplication()->getServiceManager();

    $serviceManager->get('viewhelpermanager')->setFactory('Abc', function ($sm) use ($e) {
        return new \Application\View\Helper\Abc($sm); 
    });
}

Шаг 3, наконец, я получаю это в моем вспомогательном методе src/Application/View/Helper/Abc.php test(), подобном этому, я прокомментирую эту строку $this->sm->get('Application\Service\Service1'); ошибки нет, должно быть что-то, что Я пропал без вести?

namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;

    class Abc extends AbstractHelper 
    {
       protected $sm;

       public function test()
        {
            $this->sm->get('Application\Service\Service1');
        }
        public function __construct($sm) {
            $this->sm = $sm;

        }
    }

Шаг 4, затем я вызываю помощник тестового представления в одном из представлений, подобных этому.

$this->Abc()->test();

Я получаю следующую ошибку.

Fatal error: Call to undefined method Application\Service\Service1::setView() in vendor/zendframework/zendframework/library/Zend/View/HelperPluginManager.php on line 127 Call Stack:

что мне не хватает?


person Developer    schedule 24.09.2012    source источник
comment
Пожалуйста, покажите еще немного (реального) кода. Похоже, вы возвращаете экземпляр Service1 где-то вместо Abc. Таким образом, вспомогательный механизм представления пытается внедрить экземпляр представления в экземпляр Service1.   -  person Daniel M    schedule 24.09.2012
comment
Я изменил имя и каждую ссылку с Service1 на My1serve, но по-прежнему получаю ту же ошибку. Вызов неопределенного метода My1serve::setView(). Я не использовал имя My1serve где-либо еще в своем коде, кроме того, которое я уже показал в вопросе.   -  person Developer    schedule 24.09.2012
comment
Идеально подходит к проблеме. Без дополнительной информации мы не сможем вам помочь.   -  person Daniel M    schedule 24.09.2012
comment
Нет проблем, я нашел решение. см. ответ ниже. спасибо за ваше время в любом случае.   -  person Developer    schedule 24.09.2012


Ответы (2)


Альтернативой, только в PHP 5.4, без специальной настройки, может быть использование traits:

выдержка из module.config.php:

'view_helpers' => array(
    'invokables' => array(
        'myHelper' => 'Application\View\Helper\MyHelper',
    ),  

Мой помощник.php:

<?php
namespace Application\View\Helper;

use Zend\ServiceManager\ServiceLocatorAwareInterface;  

class HeadScript extends \Zend\View\Helper\MyHelper implements ServiceLocatorAwareInterface
{
    use \Zend\ServiceManager\ServiceLocatorAwareTrait;

    public function __invoke()
    {
        $config = $this->getServiceLocator()->getServiceLocator()->get('Config');
        // do something with retrived config
    }

}
person PowerKiKi    schedule 15.02.2013

измените строку $this->sm->getServiceLocator()->get('Application\Service\Service1'); в методе ниже

class Abc extends AbstractHelper 
{
   protected $sm;

   public function test()
    {
        $this->sm->getServiceLocator()->get('Application\Service\Service1');
    }
    public function __construct($sm) {
        $this->sm = $sm;

    }
}
person Developer    schedule 24.09.2012