使用Zend Framework 1.11执行内部请求

时间:2012-10-30 18:11:52

标签: zend-framework

我需要在我的zend框架项目中向其他控制器发出内部请求。

我已经调查了动作助手,但似乎都没有。

我的项目是一个API。此API有时会复制其输出。

实施例: /client.json:返回用户可以访问的客户端列表 /client/tree.json返回客户树

要减少模型代码和额外查询重新绑定数据/client/tree.json,最好对/client.json进行内部调用,以便在那里获取已清理的客户端列表。

Zends文档说的是这样的:

    $request = clone $this->getRequest();
    $request->setActionName('get')
        ->setControllerName('tree')
        ->setParams(array('bar' => 'baz'));
$this->_helper->actionStack($request);

但是它没有说明如何从该请求中提取数据。如果我

print_r($this->_helper->actionStack($request)); 

我只是得到了大量的Zend垃圾

1 个答案:

答案 0 :(得分:-1)

这不应该在控制器中完成。它应该在模型中处理。该模型提供数据,在这种情况下是客户端列表或客户端树。只有模型才能提供该数据。你想要实现的是一种缓存形式。您可以在模型或应用程序的内部和外部以多种不同的方式缓存该数据。

您可能希望首先探索如何在模型中实现identity map

class someBaseMapper
//an identity map can be as simple as a protected class variable with accessors
 protected $map = array();

 /**
     * Set value and name of entity in identity map.
     *
     * @param string $id
     * @param object $entity
     */
 protected function setMap($id, $entity)
    {
        $this->map[$id] = $entity;
    }

    /**
     * Get value of entity id from identity map.
     *
     * @param string $id
     * @return string
     */
    protected function getMap($id)
    {
        if (array_key_exists($id, $this->map)) {
            return $this->map[$id];
        }
    }

然后使用你的地图:

//later in the same mapper
public function findById($id)
{
    //check map requested id
    if ($this->getMap($id)) {
        return $this->getMap($id);
    }
    //if no map match
    $select = $this->getGateway()->select();
    $select->where('id = ?', $id);

    $row = $this->getGateway()->fetchRow($select);
    //create entity
    $entity = $this->createEntity($row);
    //add new entity to map
    $this->setMap($row->id, $entity);

    return $entity;
}

您也可以查看Zend_cache数据库或页面缓存。 还有一些可用于PHP的外部缓存工具,您可能会感兴趣。