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

时间:2010-04-29 12:15:07

标签: php mysql zend-framework stored-procedures

我想知道如何改进调用存储过程的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 个答案:

答案 0 :(得分:3)

我赞成使用模型进行数据访问。另外,我建议您在应用程序的配置文件中定义数据库适配器,以便它对您的应用程序代码透明,并使用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
}

我认为这种方式更清晰,您的控制器只负责调用模型上的方法,但模型处理数据访问。因此,如果需要对与数据访问相关的任何内容进行重构,更改或其他任何内容,您就知道必须使用哪种模型,而不是更改可能影响任何其他内容的任何控制器操作。

希望它有所帮助;)

干杯。