0

我在我的项目中使用 Kohana 3.3,我正在尝试让用户注册和登录工作。我正在使用 ORM 的 Auth 和 Kostache 来管理我的布局/模板。

我如何能:

  • 检查用户名是否已经存在?如果它确实返回 error_msg.mustache 一条消息“用户已存在”
  • 根据我的模型规则检查用户名和电子邮件是否有效?如果不返回错误消息到 error_msg.mustache 指示验证失败

在我的控制器中,我有:

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'),
            ),
        );
    }
}

提前非常感谢!

4

2 回答 2

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);
}
于 2013-02-14T21:14:37.133 回答
1

不幸的是,我无法帮助您使用 Kostache,但是为了检查用户名是否已经存在,您必须实际尝试加载它:

$user = ORM::factory('User')->where('username', '=', $this->request->post('username'));

if ($user->loaded())
{
    // The username already exists
}

try/catch您可能希望在实际打开块之前执行此操作。

要使用正确的错误消息,您需要在/application/messages文件夹中定义它们,如ORM 验证指南中所述。

于 2013-02-13T17:49:49.130 回答