Php 如何从zf2中的控制器全局设置service manager?

Php 如何从zf2中的控制器全局设置service manager?,php,zend-framework2,Php,Zend Framework2,通常,通过在配置文件global.php中定义服务工厂,我可以在整个应用程序中定义一个对象 我只需调用$this->getServiceLocator()->get('mycollection') 我的代码如下: 在global.php中 service_manager' => array( 'factories' => array( 'mycollection'=> function($sm){

通常,通过在配置文件global.php中定义服务工厂,我可以在整个应用程序中定义一个对象

我只需调用
$this->getServiceLocator()->get('mycollection')

我的代码如下: 在global.php中

service_manager' => array(
        'factories' => array(  
                  'mycollection'=> function($sm){
                        $collectionAdapter = new Collection();
                        $collectionAdapter->addItem("testvalue",'test');
                        return $collectionAdapter;
                    }
通过添加全局文件,我可以检索

//`var_dump($this->getServiceLocator()->get('mycollection')->getItem("test"));// will return testvalue`
完成申请

但我的问题是,我不知道如何从控制器实现服务的设置值

namespace User\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
    public function authenticateAction()
    {
    //----other code---------
    var_dump($this->getServiceLocator()->get('mycollection')->addItem('userkey'));
    //$redirect=module=user  controller action =index
    return $this->redirect()->toRoute($redirect);
    }
}
我的要求是,我需要在一个控制器中设置服务,并在另一个模块中检索

我在我的IndexController相册模块中尝试了以下代码

$this->getServiceLocator()->get('mycollection')->addItem('testvalue28','test8');
在另一个模块中,学生IndexController调用

//var_dump($this->getServiceLocator()->get('mycollection')->getItem("test8"));//  
如何在控制器中实现在global.php中设置的相同功能。或者更清楚地说,我需要在所有模块的一个实例中将集合值存储到整个应用程序

已编辑

1) 函数addItem将仅根据控制器操作进行设置 2) 有没有类似于ZEND_Registry的东西,我可以从一个特定的请求中设置一个值,然后在另一个操作中检索

//应用程序控制器定义了我需要在哪里设置不同的键值对

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
    public function authenticateAction()
    {
    //----other code---------
    var_dump($this->getServiceLocator()->get('mycollection')->addItem('userauthenticationobj','userkey'));
    //$redirect=module=user  controller action =index
    return $this->redirect()->toRoute($redirect);
    }
}
在用户模块索引操作中,我需要获取在索引操作中设置在应用程序模块内部的键值对。我知道这可以通过会话、db或Cookie来实现,但我想通过应用程序的单例实例来实现。我不知道如何在oops中定义正确的术语,所以要定义这种情况 //用户控制器

namespace User\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
    public function authenticateAction()
    {
    //----other code---------
    var_dump($this->getServiceLocator()->get('mycollection')->addItem('userkey'));
    //$redirect=module=user  controller action =index
    return $this->redirect()->toRoute($redirect);
    }
}
//在GLOBAL.PHP中,我定义了

return array(
    'service_manager' => array(
        'factories' => array(
                    'mycollection'=> function($sm){
                    $collectionAdapter = new Collection();
                    $collectionAdapter->addItem("testvalue",'test');
                    return $collectionAdapter;
                }
         ),
    ),
);
//用户定义的集合引用:


如果您在同一个请求中(即,用户没有跟踪链接,或者页面没有刷新),服务管理器将使集合保持活动状态,并且您正在尝试的应该可以工作

但是,如果您正在将用户重定向到另一个控制器/操作,或者用户遵循了链接、提交了表单或导致加载新页面的任何内容,则在上一页中创建的所有值将不再存在。如果需要持久化它们,应该使用会话、cookie、数据库等

如果在操作期间未设置值,即不需要加载控制器,但需要所有控制器才能向应用程序引导上的集合添加值,则无论实际加载的是哪个控制器,都可以在module.php onbootstrap函数中向每个模块添加一些代码。例如,在每个模块的module.pho中,您执行以下操作:

public function onBootstrap(MvcEvent $e) { 

    $sm = $e->getApplication ()->getServiceManager ();
    $collection = $sm->get('mycollection');
    $collection->addItem('testvalue_N','test_N');
}

然后,在执行的每个控制器/操作中,您将拥有包含所有模块添加的所有项的集合

是否要在一个控制器中设置值并在同一请求中从另一个模块访问?如果是的话,你能提供一些关于你的用例的更多信息吗?我详细阐述了内容,这应该使它更清晰。你能浏览我问题的编辑部分吗