改进我的 Zend 存储过程调用代码

Posted

技术标签:

【中文标题】改进我的 Zend 存储过程调用代码【英文标题】:Improve my Zend Stored Procedure calling code 【发布时间】:2010-04-29 12:15:06 【问题描述】:

我想知道如何改进调用存储过程的 Zend 代码。目前我正在使用 mysql 数据库,并且下面控制器中的操作功能有效,但看起来很讨厌。

public function callSPAction()

    $param = $this->_request->getParam('param', 0);

    $bootstrap = $this->getInvokeArg('bootstrap');
    $config = $bootstrap->getOptions();

    $mysqli = new mysqli(
        $config['resources']['db']['params']['host'],
        $config['resources']['db']['params']['root']['username'],
        $config['resources']['db']['params']['root']['password'],
        $config['resources']['db']['params']['dbname']);

    $rs = $mysqli->query(sprintf('CALL mystoredprocedure(%d)',$param));
    if(mysqli_error($mysqli))
     
        throw new exception(mysqli_error($mysqli), mysqli_errno($mysqli)); 
     
    $this->_helper->redirector('index', 'index');

我更喜欢使用 Zend_DB 类来调用存储过程,但我不确定如何做到这一点?

由于我调用了许多存储过程,我认为最好创建一个帮助类来包装连接到数据库的逻辑。它将公开包装底层存储过程的方法。然后我的控制器代码可以调用

StoredProcedureHelper::callMyStoredProdecure($this->_request->getParam('param', 0);

这可能甚至推荐吗?

【问题讨论】:

【参考方案1】:

我赞成使用模型来访问您的数据。另外,我建议您在应用程序的配置文件中定义您的数据库适配器,以便它对您的应用程序代码透明,并使用 PDO,以便您的应用程序不绑定到特定的数据库管理器,以防您需要指向不同的数据库未来。

例如,与其在控制器的操作中包含所有数据访问逻辑,不如将其简化如下:

//within some controller action
$model = MyUbberCoolSuperModel();
$model->myUbberCoolMethod($params);

//And in your model, which can extend Zend_Db_Table_Abstract
public function myUbberCoolMethod($params)

   $pdo = $this->getAdapter()->prepare("CALL myProcedure(:param)");
   $pdo->bindParam(':param', $param, PDO::PARAM_STR); 
   $pdo->execute();
   // Any additional logic you might want to do

我觉得这种方式比较清晰,你的控制器只负责调用模型上的方法,而模型处理数据访问。因此,如果与数据访问相关的任何事情需要重构、更改或其他任何事情,您都知道必须采用哪种模型,而不是更改任何可能影响其他事情的控制器操作。

希望对你有帮助;)

干杯。

【讨论】:

以上是关于改进我的 Zend 存储过程调用代码的主要内容,如果未能解决你的问题,请参考以下文章

存储过程zend framework 2.2 tablegateway中的多选问题

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

从另一个存储过程 oracle 调用存储过程

oracle 存储过程调用