-1

我需要对我的 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 垃圾

4

1 回答 1

-1

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

您可能想从探索如何在模型中实现身份映射开始。

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 的外部缓存工具。

于 2012-11-03T07:25:24.123 回答