是否可以在打印前更改变量名称?

时间:2015-04-22 12:30:28

标签: php arrays variables printing echo

register.php文件

<?php
    if(Input::exists()) {

        if(Token::check(Input::get('token'))) {
            $validate = new Validate();
            $validation = $validate->check($_POST, array(
                'username' => array(
                    'required' => true,
                    'min' => 2,
                    'max' => 20,
                    'unique' => 'users'),
                'password' => array(
                    'required' => true,
                    'min' => 6),
                'password_again' => array(
                    'required' => true,
                    'matches' => 'password'),
                'name' => array(
                    'required' => false,
                    'min' => 2,
                    'max' => 50)
            ));

            if($validation->passed()) {
                $user = new User();

                $salt = Hash::salt(32);

                try {
                    $user->create(array(
                        'username'  => Input::get('username'),
                        'password'  => Hash::make(Input::get('password'), $salt),
                        'salt'      => $salt,
                        'name'      => Input::get('name'),
                        'joined'    => date('Y-m-d H:i:s'),
                        'group'     => 1
                    ));

                    Session::flash('home', 'You have been registered and can now log in!');
                    Redirect::to('index.php');

                } catch(Exception $e) {
                    die($e->getMessage());
                }

            } else {
                foreach($validate->errors() as $error) {
                    echo $error, '<br>';
                }
            }
        }
    }

        ?>

Validate.php文件

<?php
class Validate {
    private $_passed = false,
            $_errors = array(),
            $_db = null;

    public function __construct() {
        $this->_db = DB::getInstance();
    }

    public function check($source, $items = array()) {
        foreach($items as $item => $rules) {
            foreach($rules as $rule => $rule_value) {

                $value = trim($source[$item]);

                if($rule === 'required' && $rule_value === true && empty($value)) {
                    $this->addError("{$item} is required.");
                } else if (!empty($value)) {

                    switch($rule) {
                        case 'min':
                            if(strlen($value) < $rule_value) {
                                $this->addError("{$item} must be a minimum of {$rule_value} characters.");
                            }
                        break;
                        case 'max':
                            if(strlen($value) > $rule_value) {
                                $this->addError("{$item} must be a maximum of {$rule_value} characters.");
                            }
                        break;
                        case 'matches':
                            if($value != $source[$rule_value]) {
                                $this->addError("{$rule_value} must match {$item}.");
                            }
                        break;
                        case 'unique':
                            $check = $this->_db->get('users', array($item, '=', $value));
                            if($check->count()) {
                                $this->addError("{$item} is already taken.");
                            }
                        break;
                    }

                }

            }
        }

        if(empty($this->_errors)) {
            $this->_passed = true;
        }

        return $this;
    }

    protected function addError($error) {
        $this->_errors[] = $error;
    }

    public function passed() {
        return $this->_passed;
    }

    public function errors() {
        return $this->_errors;
    }
}

这是我用来检查密码长度,用户名和名称是否正确的代码。如果用户输入的密码不正确,则会输出错误。例如“password_again不匹配”。是否有可能以任何方式更改此变量名称?我希望它输出像=“密码再次不正确”或“用户名已经是使用”。使用大写字母并且没有下划线会更好看。

我希望你理解我的问题

期待您的回答。

3 个答案:

答案 0 :(得分:1)

可以在表单定义中的某处嵌入错误消息,以便在发生特定类型的错误时显示自定义消息。

'password_again' => array(
    'error_message' => 'Your custom error message here!'
    'required' => true
)

或者可能有一个查找文件,用于显示特定字段的文本。

$error_messages = array(
    'password_again' => 'We need a better password'
);

请参阅Laravel的Validation部分,了解如何存储自定义错误消息。

答案 1 :(得分:0)

最终编辑:

对不起。我没有看到你的Validator.php课程。

这就是你想要的:

Validate.php

<?php
class Validate {
private $_passed = false,
        $_errors = array(),
        $_db = null;

public function __construct() {
    $this->_db = DB::getInstance();
}

public function check($source, $items = array()) {
    foreach($items as $item => $rules) {
        foreach($rules as $rule => $rule_value) {

            $itemName = $item;

            if ($rule == "display_name") {
                continue;
            } else {
                if (array_key_exists("display_name", $rules)) $itemName = $rules["display_name"];
            }

            $value = trim($source[$item]);

            if($rule === 'required' && $rule_value === true && empty($value))    {
                $this->addError("{$itemName} is required.");
            } else if (!empty($value)) {

                switch($rule) {
                    case 'min':
                        if(strlen($value) < $rule_value) {
                            $this->addError("{$itemName} must be a minimum of {$rule_value} characters.");
                        }
                    break;
                    case 'max':
                        if(strlen($value) > $rule_value) {
                            $this->addError("{$itemName} must be a maximum of {$rule_value} characters.");
                        }
                    break;
                    case 'matches':
                        if($value != $source[$rule_value]) {
                            $this->addError("{$rule_value} must match {$itemName}.");
                        }
                    break;
                    case 'unique':
                        $check = $this->_db->get('users', array($item, '=', $value));
                        if($check->count()) {
                            $this->addError("{$itemName} is already taken.");
                        }
                    break;
                }

            }

        }
    }

    if(empty($this->_errors)) {
        $this->_passed = true;
    }

    return $this;
}

protected function addError($error) {
    $this->_errors[] = $error;
}

public function passed() {
    return $this->_passed;
}

public function errors() {
    return $this->_errors;
}
}

刚编辑了check()方法,将$ item(键名)替换为键的值&#34; display_name&#34;如果存在。如果不存在,只需使用$ item本身。此外,当遍历数组时,如果当前$规则是&#34; display_name&#34;,那么它将继续下一次迭代的循环。这样你就不会处理&#34; display_name&#34;键。

如果我没有错,现在你只需要在规则旁边传递另一个密钥&#34; display_name&#34;以及要表示该项目的显示字符串。例如:

$validation = $validate->check($_POST, array(
            'username' => array(
                'required' => true,
                'min' => 2,
                'max' => 20,
                'unique' => 'users',
                'display_name' => 'Username'),
            'password' => array(
                'required' => true,
                'min' => 6,
                'display_name' => 'Password'),
            'password_again' => array(
                'required' => true,
                'matches' => 'password',
                'display_name' => 'Password Again'),
            'name' => array(
                'required' => false,
                'min' => 2,
                'max' => 50,
                'display_name' => 'Name')
        ));

对所有以前的修改感到抱歉。

答案 2 :(得分:0)

要将some_string变为Some String,您可以这样做:

echo ucwords(str_replace('_', ' ', 'password_again')); // "Password Again"

validate.php文件中,您可以使用此方法在获取值后修改$item的值:

...
$value = trim($source[$item]);
$item = ucwords(str_replace('_', ' ', $item));
...

然后消息将自动像“密码再次必须至少2个字符”。您还可以根据需要修改任何错误消息:

...
case 'matches':
    if($value != $source[$rule_value]) {
        // Old: $this->addError("{$rule_value} must match {$item}.")
        $this->addError("{$item} is not correct.");
    }
    break;
case 'unique':
    $check = $this->_db->get('users', array($item, '=', $value));
    if($check->count()) {
        // Old: $this->addError("{$item} is already taken.");
        $this->addError("{$item} is already in use.");
    }
break;
...

等等。