如何从zf2中的控制器全局设置服务管理器



按照正常方式,我可以通过在配置文件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`

通过应用

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

我的要求是,我需要在一个控制器中设置服务,并在另一个模块中检索

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

$this->getServiceLocator()->get('mycollection')->addItem('testvalue28','test8');

在另一个模块中,学生IndexController称为

//var_dump($this->getServiceLocator()->get('mycollection')->getItem("test8"));//  

我如何才能在控制器中实现我在global.php中设置的相同功能。或者更清楚地说,我需要在所有模块中的一个实例上将集合值存储到整个应用程序

已编辑

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

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

namespace ApplicationController;
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
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);
}
}

在用户模块索引操作中,我需要获取索引操作中应用程序模块内部设置的键值对。我知道这可以通过使用会话、数据库或cookie来实现,但我想通过应用程序中的singleton实例来实现。我不知道在oops中定义正确的术语,所以定义情况//用户控制器

namespace UserController;
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
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;
}
),
),
);

//用户定义的集合引用:http://www.sitepoint.com/collection-classes-in-php/

namespace ApplicationAdapter;
class Collection 
{
private $items = array();
public function addItem($obj, $key = null)
{
if ($key == null)
{
$this->items[] = $obj;
}
else {
if (isset($this->items[$key])) 
{
throw new Exception("Key $key already in use.");
}
else
{
$this->items[$key] = $obj;
}
}
}
public function getItem($key)
{
if (isset($this->items[$key]))
{
return $this->items[$key];
}
else
{
throw new Exception("Invalid key $key.");
}
}
} 

如果您在同一个请求中(即用户没有关注链接,或者页面没有刷新),服务经理将保持Collection的活动状态,并且您正在尝试的操作应该有效。

但是,如果你将用户重定向到另一个控制器/操作,或者用户已经关注了一个链接、提交了一个表单,或者其他导致加载新页面的内容,那么在上一个页面中创建的所有值都将不复存在。如果你需要持久化它们,你应该使用会话、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');
}

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

最新更新