我在我的项目中使用Kohana 3.3并且我正在尝试使用户注册和登录。我正在使用ORM的Auth和Kostache来管理我的布局/模板。
我如何:
在我的控制器中我有:
class Controller_User extends Controller {
public function action_signup()
{
$renderer = Kostache_Layout::factory();
$this->response->body($renderer->render(new View_FrontEnd_User, 'frontend/signup'));
}
public function action_createuser()
{
try {
$user = ORM::factory('User');
$user->username = $this->request->post('username');
$user->password = $this->request->post('password');
$user->email = $this->request->post('email');
// How do I:
// Check if Username already exists? If it does return to error_msg.mustache a message "User already Exists"
// Check if email is valid? If not return error message to error_msg.mustache indicating "email is not valid"
$user->save();
}
catch (ORM_Validation_Exception $e)
{
$errors = $e->errors();
}
}
}
在我的模型中:
<?php
class Model_User extends Model_Auth_User
{
public function rules()
{
return array(
'username' => array(
array('not_empty'),
array('min_length', array(':value', 4)),
array('max_length', array(':value', 32)),
array('regex', array(':value', '/^[-\pL\pN_.]++$/uD')),
),
'email' => array(
array('not_empty'),
array('min_length', array(':value', 4)),
array('max_length', array(':value', 127)),
array('email'),
),
);
}
}
提前多多感谢!
答案 0 :(得分:2)
您可以使用验证和已编写的回调进行唯一性检查。这样做的好处是可以将验证逻辑保持在一起,并且非常简洁:
public function rules()
{
return array(
'username' => array(
array(array($this, 'unique'), array(':field', ':value')),
// ...
就这么简单!
我最初使用我自己的解决方案回答了这个问题,这与预卷版本略有不同,但现在我明白了,显然我会用它而不是这个:
public function rules()
{
return array(
'username' => array(
// ...
array('Model_User::unique_field', array(':field', ':value', $this->pk())),
),
// ...
);
}
public static function unique_field($field, $value, $user_id = NULL)
{
return (ORM::factory('User')->where($field, '=', $value)->find()->pk() === $user_id);
}
答案 1 :(得分:1)
不幸的是我无法帮助您使用Kostache,但为了检查用户名是否已经存在,您必须尝试加载它:
$user = ORM::factory('User')->where('username', '=', $this->request->post('username'));
if ($user->loaded())
{
// The username already exists
}
您可能希望在实际打开try/catch
块之前执行此操作。
要使用正确的错误消息,您需要在/application/messages
文件夹中定义它们,如ORM Validation guide中所述。