Во-первых, я бы не использовал метод register () в модели User. Модель должна представлять собой представление объекта в базе данных и, как правило, содержит только ваши методы «CRUD» (создание, получение, обновление, удаление), методы получения и установки и, возможно, некоторые статические вспомогательные методы, связанные с моделью. Поместив свой метод register () в модель, вы заставляете модель выполнять логику представления, которая должна выполняться контроллером пользователя, поскольку это является ответом на действие пользователя. Контроллер обрабатывает действия пользователя, проверяет эти действия пользователя, а затем обновляет модель, если проверка прошла успешно.
В вашем примере пользователь пытается создать новую учетную запись. Он заполняет форму и нажимает кнопку Отправить. Действие POST формы должно указывать на метод контроллера, например / user / register, и этот метод будет использовать библиотеку проверки для проверки данных формы, отправленных пользователем. Только если эти данные успешно проверены, вы должны создать экземпляр модели User, установить свойства этой модели на то, что вводит пользователь, а затем использовать метод save () модели для сохранения в базе данных. Если проверка не пройдена, вы сообщаете об ошибке пользователю и вообще не создаете модель пользователя, поскольку у вас еще нет действительного набора данных для создания модели.
Далее вы проверяете, вошел ли пользователь в систему. Опять же, это должно быть в контроллере, а не в модели. Кроме того, пользователь не должен иметь возможность попасть в этот процесс регистрации в первую очередь, если он уже вошел в систему. Метод контроллера, который создает представление формы регистрации пользователя, должен проверить, вошел ли пользователь в систему, и если он Затем он должен быть перенаправлен на другую страницу. Даже если пользователь разыгрывает трюки и ему удается отправить форму (возможно, он вошел в систему через другое окно, в то время как форма открыта в старом окне), ваш метод регистрации должен сначала проверить это и еще не создавать объект проверки $ user.
Я вижу в вашем коде, что есть некоторые запутанные элементы, основанные на вашей модели. Например, вы передаете массив $ user в метод, который, как я полагаю, является данными формы. Но вы используете оператор «передать по ссылке» (&), который не нужен в PHP5, поскольку все объекты теперь передаются по ссылке. Но после этого вы переписываете $ user как объект проверки. Используете ли вы объект $ user Validation в другом месте и требует, чтобы он был передан по ссылке? Если это так, то это еще один недостаток в логике, поскольку вся эта обработка должна выполняться в контроллере, и значения $ _POST можно использовать непосредственно в контроллере вместо необходимости передавать объект проверки.
Позже вы проверяете информацию о пользователе с помощью parent :: validate ($ user, $ save). Почему метод validate () вызывается у parent как статический метод? Если это модель, она должна расширять базовый класс Model Коханы, а «родитель» ссылается на класс Model. Ваша модель расширяет класс валидации? Кроме того, почему вы передаете объект $ user Validation в метод validation ()? Это необходимо, если вам нужно выполнить рекурсию (чтобы снова проверить элементы после внесения изменений из предыдущих фильтров), но похоже, что вы ничего не делаете, чтобы требовать рекурсию. Вы должны вызывать validate () для объекта проверки $ user:
$user->validate();
без аргументов. Ошибки проверки станут частью объекта $ user, поэтому вы можете проверить наличие ошибок, используя
$user->errors();
Наконец, хотя Kohana позволяет вам использовать цепочку методов, я бы не стал использовать одну длинную цепочку для настройки правил и других элементов для проверки. Это сбивает с толку и может затруднить отладку. Разместите каждый из них в отдельной строке и выполните каждый непосредственно на объекте $ user.