Php Zend Framework 2,使模型查询成为web服务

Php Zend Framework 2,使模型查询成为web服务,php,web-services,rest,model-view-controller,zend-framework2,Php,Web Services,Rest,Model View Controller,Zend Framework2,我是Zend framework的新手(虽然我已经使用过Symfony2,听说它们很相似),我已经开始了一个项目,在这个项目中我必须升级一个使用Zend 1.11创建的站点(该站点已经功能齐全) 我升级的目的是让数据(最初存储在数据库中,现在将存储在nosql中,以及一个数据库,将来可能存储在其他地方)更易于构建,与Zend模型的耦合性也更低。(模型与MVC中的M相同) 为了实现这一点,我被要求使用一个与数据交互的web服务,以及Zend的模型。 这样,当数据结构被修改时,Zend网站不会受到

我是Zend framework的新手(虽然我已经使用过Symfony2,听说它们很相似),我已经开始了一个项目,在这个项目中我必须升级一个使用Zend 1.11创建的站点(该站点已经功能齐全)

我升级的目的是让数据(最初存储在数据库中,现在将存储在nosql中,以及一个数据库,将来可能存储在其他地方)更易于构建,与Zend模型的耦合性也更低。(模型与MVC中的M相同)

为了实现这一点,我被要求使用一个与数据交互的web服务,以及Zend的模型。 这样,当数据结构被修改时,Zend网站不会受到直接影响(而且仍然可以工作!),我们只需重新安排web服务

有没有什么优雅的方法可以让Zend的模型与web服务而不是数据库交互

我希望我的问题是可以理解的

祝你今天愉快

M.G.

您可以使用。作为参考,您可以看到模块是如何运行的

您可以为每个实体创建mapper接口,并根据数据存储创建实现。 比如说,

产品实体
class Product
{
    /**
     * @var int
     */
    protected $id;

    /**
     * @var string
     */
    protected $name;


    /**
     * Get id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set id.
     *
     * @param int $id
     * @return UserInterface
     */
    public function setId($id)
    {
        $this->id = (int) $id;
        return $this;
    }

    /**
     * Get name.
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set name.
     *
     * @param string $name
     * @return UserInterface
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }       
}
产品映射器

class Product
{
    /**
     * @var int
     */
    protected $id;

    /**
     * @var string
     */
    protected $name;


    /**
     * Get id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set id.
     *
     * @param int $id
     * @return UserInterface
     */
    public function setId($id)
    {
        $this->id = (int) $id;
        return $this;
    }

    /**
     * Get name.
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set name.
     *
     * @param string $name
     * @return UserInterface
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }       
}
<?php

<?php
namespace Product\Mapper;

interface ProductMapperInterface
{
    /**
     * @var int $id
     * @returns \Product\Entity\Product
     */ 
    public function findById($id);

    /**
     * @var array $criteria
     * @returns \Product\Entity\Product[]
     */ 
    public function find(array $criteria, .....);

    /**
     * @var \Product\Entity\Product $product
     */ 
    public function insert($product);

    /**
     * @var \Product\Entity\Product $product
     */     
    public function update($product);
}

对不起,我忘了说这个网站是用Zend 1.11版制作的。我尝试的是将所有扩展Zend_Db_Table_Abstract的模型类更改为“经典”类(如您的第一个代码示例)。然后我计划使用另一个类“sendRestRequest”,它将管理与web服务的通信(从而创建每个“经典”模型类的实体)。你认为这是一个好主意,还是有更好的方法来实现我的目标,这就是通过Web服务而不是数据库使这个Zend网站工作……如果你想使用这个模式,它不会映射你正在使用哪个版本的Zend。您需要确保所有其他类仅依赖MapperInterface来获取和操作数据。创建一个实现MapperInterface(示例WebServiceStorageApper)的类,并在其中包含管理与web服务通信的逻辑。为了减少冗余,您可以创建一个类,如
WebServiceStorage
(或
sendRestRequest
),所有使用web服务的映射程序都将依赖于WebServiceStorage。非常感谢您的回答,我将尝试一下(目前我不确定我是否理解了所有内容)如果我有更多问题,请回到这里:psorry。我的最后一条评论中有一个拼写错误。“如果要使用此模式,则使用哪个版本的zend并不重要。”