0

已编辑(代码已更新并为他人工作)
对于正在发生的事情的总体想法。

我正在尝试从控制器中的视图访问发布数据,而不刷新页面。

为此,我通过使用ViewHelper调用下面的服务来执行页面控制器,然后将其转发回控制器;之后我可以在页面控制器中管理发布的数据。

一切正常,除了最后一步forward(),我收到错误 Call to undefined methodAlbumModule\Service\postAlbumService::forward()

我知道我必须实现ServiceLocatorAwareInterface才能使用forward()该类,但我所写的似乎不起作用。

            <?php
            namespace AlbumModule\Service;

            use Zend\ServiceManager\ServiceLocatorAwareInterface;
            use Zend\ServiceManager\ServiceLocatorInterface;

            class postAlbumService implements
                ServiceLocatorAwareInterface
            {
                protected $services;

                public function __construct() {
                    echo '<script>console.log("postAlbumService is Started")</script>';
                }

                public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
                {
                    $this->services = $serviceLocator;
                }

                public function getServiceLocator()
                {
                    return $this->services;
                }

                public function test(){
                    $cpm = $this->getServiceLocator()->get('controllerpluginmanager');
                    $fwd = $cpm->get('forward');
                    echo '<script>console.log("postAlbumService TEST() is Started")</script>';
                    return $fwd->dispatch('newAlbum', array('action' => 'submitAlbum'));
                }
            }

好像我只是对 forward() 类有依赖问题,但我不确定问题是什么。


编辑-这是我postAlbumService从 viewHelper调用的方式

            <?php
            namespace AlbumModule\View\Helper;

            use Zend\View\Helper\AbstractHelper;

            class invokeIndexAction extends AbstractHelper
            {
             protected $sm;

                   public function test()
                    {
                        $this->sm->getServiceLocator()->get('AlbumModule\Service\postAlbumService')->test();
                    }

                    public function __construct($sm) {
                        $this->sm = $sm;
                    }
            }

在将依赖项注入服务后,有什么方法可以调用所请求的服务中的特定类?

4

1 回答 1

2

你做错了一些事情,你误解了一些事情......

首先,forward()是一个ControllerPlugin。您将通过ServiceLocator访问所述管理器来访问此方法。一个例子可能是这样的:

$cpm = $serviceLocator->get('controllerpluginmanager');
$fwd = $cpm->get('forward');
return $fwd->dispatch('foo/bar');

现在,要将ServiceLocator放入您的任何服务类中,您需要依赖注入。其中一种方法是实施ServiceLocatorAwareInterface. ZF2的ServiceManager有所谓的Listeners。这些监听器检查实现的接口和类似的东西。每当找到匹配项时,它都会通过给定函数的接口注入所需的依赖项。工作流程如下所示:

ServiceManager get('FooBar');
    $ret = new FooBar();
    foreach (Listener) 
        if $ret instanceof Listener
             doInjectDependenciesInto($ret)
        end
    end
    return $ret

现在这告诉你什么。这告诉您,在__construct()您的任何类中,您所需的依赖项实际上都不存在。它们只有在类/服务被实例化后才会被注入。

最后一点,给定的代码示例并没有多大意义;)无论我想访问什么 ServiceAction,你总是让我回到“newAlbum”操作......

于 2013-10-19T20:32:15.663 回答