2010-04-29 11 views
3

Je me demande comment je peux améliorer mon code Zend qui appelle une procédure stockée. En ce moment j'utilise une base de données MySQL, et la fonction d'action dans mon contrôleur ci-dessous fonctionne, mais il semble méchant.Améliorer mon code d'appel Zend procédure stockée

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

Je préfère utiliser les classes Zend_Db pour appeler la procédure stockée, mais je ne sais pas comment cela peut être fait?

Depuis que j'appelle un certain nombre de procédures stockées, je pense qu'il serait préférable de créer une classe d'aide qui enveloppe la logique pour se connecter à la base de données. Cela exposerait des méthodes qui encapsuleraient la procédure stockée sous-jacente. Mon code de contrôleur pourrait alors simplement appeler

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

Est-ce possible ou même recommandé?

Répondre

3

Je serais favorable à l'utilisation de modèles pour votre accès aux données. De plus, je vous conseille de définir votre adaptateur db dans le fichier de configuration de votre application afin qu'il soit transparent pour votre code d'application et d'utiliser PDO pour que votre application ne soit pas liée à un gestionnaire de base de données particulier. avenir.

Par exemple, au lieu d'avoir tous votre logique d'accès aux données dans l'action de votre contrôleur, il pourrait être simplifié comme suit:

//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 
} 

Je pense que cette façon est plus claire, votre contrôleur est seul responsable pour invoquer la méthode sur le modèle, mais le modèle gère l'accès aux données. Donc, si quelque chose en rapport avec l'accès aux données doit être refactorisé, modifié ou autre, vous savez à quel modèle vous devez aller au lieu de changer les actions du contrôleur qui pourraient avoir un impact sur d'autres choses.

Espérons que cela aide;)

Cheers.