Валидация и Exception

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
chandler
Сообщения: 145
Зарегистрирован: 2011.10.13, 21:33

Валидация и Exception

Сообщение chandler »

Привет.
Есть кусок кода.

Код: Выделить всё

        if(isset($_POST['Docs']))
        {
            $transaction = Yii::app()->db->beginTransaction();
            try
            {
                $a = $this->saveA();
                $b = $this->saveB($a->id);
                $transaction->commit();
            }
            catch(SaveException $e)
            {
                $transaction->rollBack();
            }
        }
$this->render('edit',array(
            'a' => $a,
            'b' => $b
        ));
 
В методах save*

Код: Выделить всё

        if(isset($_POST['B']))
        {
            $limits->attributes = $_POST['B'];
            if(!$limits->saveArchive())
                throw new SaveException();

            return $limits;
        }

        return false;
 
Тоесть, если валидация не проходи, кидаеться исключене, которое отлавливаеться и исполняеться rollBack.
Все работает, но ошибки валдиации не получаеться отобразить, потому что модель с ошибками не возвращаеться, так как кинуто исключение.
Нужно передать както модель или отдельно ошибки.
Есть вариант присвоить их члену класа, и проверять есть ли они, но методов save* много и не красиво ето смотриться :)
Есть у когото варианты?

Еще очень важно: метод возвращает ид сохраненного елемента и он используеться при сохранении второго

Код: Выделить всё

                $a = $this->saveA();
                $b = $this->saveB($a->id);
Поетому конструкции типа

Код: Выделить всё

            try
            {

                $result = array();

                foreach($this->models as $key => $item)
                {
                    if($item->save())
                        throw new SaveException();
                }
            }
не подойдут.
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Валидация и Exception

Сообщение lancecoder »

в исключение передавай модель
chandler
Сообщения: 145
Зарегистрирован: 2011.10.13, 21:33

Re: Валидация и Exception

Сообщение chandler »

в исключение можно только стринг передавать
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Валидация и Exception

Сообщение lancecoder »

зачем ты его тогда расширил что тебе это дало?
chandler
Сообщения: 145
Зарегистрирован: 2011.10.13, 21:33

Re: Валидация и Exception

Сообщение chandler »

ага, тупанул :)
расширил чтоб можна было отловить именно етот тип.

Но вот что получаеться. В блоке catch, я не знаю какая модел бросила исключение. Делать instanceof или get_class тоже не хочеться, а переменной которая передаеться в вюху нужно присвоить именно етот инстанс класа.
Плюс другуие ошибки передаваться не будут, так как исключение отсанавливает подальшее виполение кода ><

Может у когото есть более изящное решение сохранения связаных моделей? (без екстеншенов и переопределений)
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Валидация и Exception

Сообщение lancecoder »

Код: Выделить всё

class ModelException extends CException{
    private $_model;
    public function __construct(CActiveRecord $model, $message = "", $code = 0, Exception $previous = null) {
        $this->_model=$model;
        parent::__construct($message, $code, $previous);
    }
    public function getModel(){ return $this->_model; }
}
chandler
Сообщения: 145
Зарегистрирован: 2011.10.13, 21:33

Re: Валидация и Exception

Сообщение chandler »

lancecoder писал(а):

Код: Выделить всё

class ModelException extends CException{
    private $_model;
    public function __construct(CActiveRecord $model, $message = "", $code = 0, Exception $previous = null) {
        $this->_model=$model;
        parent::__construct($message, $code, $previous);
    }
    public function getModel(){ return $this->_model; }
}
да, но в catch, чтоб было видно ошибки, нужно присвоить ету модель, нужной переменной, т.к ошибки в ней. появляеться проблема присваивание нужной переменной нужную модель :)
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Валидация и Exception

Сообщение lancecoder »

Код: Выделить всё

...
catch(ModelException $e)
{
var_dump($e->getModel()->getErrors());
} 
Ответить