Как CodeIgniter DataMapper ORM узнает, какой набор правил проверки применять?

Я использую ORM CodeIgniter DataMapper, но есть кое-что, чего я не совсем понимаю.

В этом примере http://datamapper.wanwizard.eu/pages/examples/login.html вы можете видеть, что в классе модели User определено несколько $validation правил.

Внутри функции login вы также можете видеть, что она вызывает $this->validate()->get(). Когда функция validation запускается, она должна проверять все правила из $validation.

Чего я не понимаю, так это того, что для варианта использования входа в систему необходимо проверять только имя пользователя и пароль, но вы можете видеть, что в примере есть другие правила проверки, не связанные с этим вариантом использования. В частности, существует правило confirm_password, определенное для $validation, и это правило, очевидно, предназначено только для варианта использования обновления, а не для варианта использования входа.

Поскольку я не вижу в примере никаких кодов, которые обходят эти несвязанные правила, откуда DataMapper ORM узнает, что эти несвязанные правила можно обойти в функции login?

Большое спасибо всем вам.


person bobo    schedule 21.04.2011    source источник


Ответы (4)


Метод проверки Datamapper игнорирует правила для полей, не являющихся частью объекта. Таким образом, правило confirm_password не сработает, если у объекта нет свойства с этим именем поля.

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

Учитывая этот факт, легко определить правила для дополнительных полей, которые также могут быть в ваших CRUD-формах, и хранить все это в одном месте.

person WanWizard    schedule 26.03.2012

Возможно, решение состоит в том, чтобы сделать 2 модели: одну «логин» (для пользователя таблицы), а другую — «зарегистрироваться» (также для пользователя таблицы). Затем, когда вы хотите войти в систему, просто используйте модель входа пользователя. Я думаю, что это истинное предназначение моделей. (теперь у вас 2 набора валидации в 2х моделях)

person TomoMiha    schedule 09.06.2011

Вызов функции validate() объекта — это все, что нужно для применения правил проверки. Обратите внимание, что проверка запускается автоматически всякий раз, когда вы выполняете вызов save() без параметров. Вы также можете запустить или проверить()->get() на объекте, чтобы получить соответствующую запись, используя текущие значения поля объекта.

http://datamapper.wanwizard.eu/pages/validation.html

Я думаю, просто потому, что проверка будет выполняться с использованием текущих полей объектов, а поле «confirm_password» является «полем таблицы, не относящимся к базе данных».

person Matthew    schedule 21.04.2011
comment
если это так, как он узнает, что правило confirm_password должно выполняться для варианта использования обновления? - person bobo; 21.04.2011
comment
Обновление действительно просто сохраняет. Вы просто получаете объект, устанавливаете поля, которые хотите изменить, и снова запускаете save(). - person Matthew; 21.04.2011
comment
да, но когда пользователь хочет обновить свой пароль, DataMapper ORM должен проверять соответствие правилу confirm_password, откуда DataMapper знает, что это правило должно учитываться, когда confirm_password является полем таблицы, не относящимся к базе данных, независимо от того, используется ли это для входа в систему или обновить прецедент? - person bobo; 21.04.2011

Для входа используйте form_validation library и подтвердите только username/password, для registration вы можете использовать DataMapper и в вашей модели добавить правило confirm_password должно совпадать с password но не добавлять правило required в confirm_password.. которое должно это делать

person myohann    schedule 11.02.2012