Улучшение моего кода вызова Zend хранимой процедуры - PullRequest
3 голосов
/ 29 апреля 2010

Мне интересно, как я могу улучшить свой Zend-код, который вызывает хранимую процедуру. В данный момент я использую MySQL DB, и функция действия в моем контроллере ниже работает, но это кажется неприятным.

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 Ответ

3 голосов
/ 29 апреля 2010

Я бы предпочел использовать модели для доступа к вашим данным. Кроме того, я бы посоветовал вам определить адаптер db в файле конфигурации вашего приложения, чтобы он был прозрачен для кода вашего приложения, и использовать 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
}

Я думаю, что этот путь более понятен, ваш контроллер отвечает только за вызов метода в модели, но модель обрабатывает доступ к данным. Поэтому, если что-либо, связанное с доступом к данным, необходимо реорганизовать, изменить или что-то еще, вы знаете, к какой модели следует обратиться, вместо того чтобы изменять какие-либо действия контроллера, которые могут повлиять на любые другие вещи.

Надеюсь, это поможет;)

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...