2010-04-29 94 views
3

我在想如何改進我的調用存儲過程的Zend代碼。目前我使用的是MySQL數據庫,下面我的控制器中的動作函數可以工作,但似乎令人討厭。改進我的Zend存儲過程調用代碼

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); 

這是可能的甚至是推薦的嗎?

回答

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 
} 

我覺得這種方式更清晰,控制器僅用於調用負責方法,但模型處理數據訪問。因此,如果與數據訪問相關的任何事情需要重構,更改或其他任何事情,那麼您就知道必須去哪個模型,而不是更改任何可能影響其他任何事情的控制器操作。

希望它有幫助;)

乾杯。