Search
Write a publication
Pull to refresh

Comments 9

Так и не понял, зачем CustomError нужен модели вместо стандартного addError(), он ведь не обязательно должен работать в паре с валидацией. На ум приходит разьве что случай, когда у нас класс не является предком CModel
Проблема в том, что addError имеет сигнатуру: addError($attribute,$error) а если у вас метод не связан с каким то определенным атрибутом, то его использование некорректно.
Атрибут это не только столбцы таблицы ведь, поэтому ничего не мешает использовать виртуальный атрибут.
class Blog extends CActiveRecord {
    public function checkPrivacyCreate() { // Проверяем, может ли пользователь написать коммент
           ...
            $parent_post = $this->getPost($this->parent_post_id);
            if (empty($parent_post)) {
                $this->addError('privacy', Yii::t('blog', 'post_not_found'));
                return false;
            }
           ...
        return true;
    }
}

// использование в контроллере
public function actionAddPost() {
      ....
      if (!$model->addPost())
                Tools::jsonError($model->getErrors()); // или конкретные ошибки $model->getErrors('privacy');
      ...
}

KISS!
Как было сказано выше, атрибут может быть не существующий, я в таких случаях error использую
1. Тут не нужен трейт, достаточно бихейвера.
2. Используйте исключения, для удобства можно сделать базовый класс аля AccessDeniedException, и либо использовать его, либо дальше строить иерархию. Тогда не будет неоднозначностей — функция всегда возвращает bool, а в случае ошибки возвращает exception, который мы можем обработать и что-то сделать, или ничего не делать и позволить yii показать 403.*-ю ошибку. Если же речь идет о формах — то там тоже все уже предусмотрено.
С исключениями довольно не просто. Метод может не обязательно вернуть ошибку связанную только с доступом, причин для ошибки может быть очень много и писать под каждый исключение и их обработку довольно затруднительно, но соглашусь, что в теории это правильнее и стоит подумать о переходе на обработку исключений.
Чем лучше бехайверы?
phpStorm не умеет их распознавать, нет автодополнения. В нашем проекте мы отказались от использования этого механизма.
бехайверы не лучше, но я предпочитаю в трейты выносить только какие-то обертки, которые не делают ничего больше чем проксируют вызовы к сторонним компонентам и скрывают простыню кода. У вас же в трейте хранится именно какая-никакая но логика.

и еще — по поводу ваших изменений в миграциях, не проще ли разные окружения настраивать через конфиг? Да и по поводу ключей — у вас же должно быть все автоматизированно, зачем что-то делать вручную?
Да, конечно, окружение настроено через конфиг. Но как минимум в одном окружение есть 2 коннекта, для рабочей и для тестовой базы.
Постоянно набирать в консоли две команды с разными конфигами довольно нудное занятие, плюс если появится, например 3-й коннект, то всё еще более усложнится. А в нашем случае достаточно вызывать одну команду и она примениться ко всем коннектам.
В команде работают фронт эндщики и заставлять их следить за всеми настройками и правильно вызывать каждый раз миграцию, это, скажем, себе дороже.
Sign up to leave a comment.