文档
Welcome! 安装(Installation) 示例列表(List of examples) 依赖注入与服务定位器(Dependency Injection/Service Location) MVC 架构(The MVC Architecture) 使用控制器(Using Controllers) 使用模型(Working with Models) 模型元数据(Models Meta-Data) 事务管理(Model Transactions) Phalcon 查询语言(Phalcon Query Language (PHQL)) 缓存对象关系映射(Caching in the ORM) 对象文档映射 ODM (Object-Document Mapper) 使用视图(Using Views) 视图助手(View Helpers) 资源文件管理(Assets Management) Volt 模版引擎(Volt: Template Engine) MVC 应用(MVC Applications) 路由(Routing) 调度控制器(Dispatching Controllers) 微应用(Micro Applications) 使用命名空间(Working with Namespaces) 事件管理器(Events Manager) 请求环境 (Request Environment) 返回响应(Returning Responses) Cookie 管理(Cookies Management) 生成 URL 和 路径(Generating URLs and Paths) 闪存消息(Flashing Messages) 使用 Session 存储数据(Storing data in Session) 过滤与清理(Filtering and Sanitizing) 上下文编码(Contextual Escaping) 验证(Validation) 表单(Forms) 读取配置(Reading Configurations) 分页(Pagination) 使用缓存提高性能(Improving Performance with Cache) 安全(Security) 加密/解密( Encryption/Decryption ) 访问控制列表 ACL(Access Control Lists ACL) 多语言支持(Multi-lingual Support) 通用类加载器 ( Universal Class Loader ) 日志记录(Logging) 注释解析器(Annotations Parser) 命令行应用(Command Line Applications) 队列(Queueing) 数据库抽象层(Database Abstraction Layer) 国际化(Internationalization) 数据库迁移(Database Migrations) 调试应用程序(Debugging Applications) Phalcon 开发工具(Phalcon Developer Tools) 提高性能:下一步该做什么?(Increasing Performance: What's next?) 单元测试(Unit testing) 授权(License)
教程

发布于 2015-08-21 15:17:16 | 361 次阅读 | 评论: 0 | 来源: 网络整理

验证(Validation)

PhalconValidation对Phalcon来说是一个相对独立的组件,它可以对任意的数据进行验证。 当然也可以用来对非模型内的数据进行验证。

下面的例子展示了一些基本的使用方法:

<?php

use PhalconValidation;
use PhalconValidationValidatorEmail;
use PhalconValidationValidatorPresenceOf;

$validation = new Validation();

$validation->add(
    'name',
    new PresenceOf(
        array(
            'message' => 'The name is required'
        )
    )
);

$validation->add(
    'email',
    new PresenceOf(
        array(
            'message' => 'The e-mail is required'
        )
    )
);

$validation->add(
    'email',
    new Email(
        array(
            'message' => 'The e-mail is not valid'
        )
    )
);

$messages = $validation->validate($_POST);
if (count($messages)) {
    foreach ($messages as $message) {
        echo $message, '<br>';
    }
}

由于此模型是松耦合设计的,故此我们也可以使用自己书写的验证工具:

初始化验证(Initializing Validation)

我们可以直接在PhalconValidation初始化时添加验证链。我们可以把验证器放在一个单独的文件中以提高代码的重用率及可组织性:

<?php

use PhalconValidation;
use PhalconValidationValidatorEmail;
use PhalconValidationValidatorPresenceOf;

class MyValidation extends Validation
{
    public function initialize()
    {
        $this->add(
            'name',
            new PresenceOf(
                array(
                    'message' => 'The name is required'
                )
            )
        );

        $this->add(
            'email',
            new PresenceOf(
                array(
                    'message' => 'The e-mail is required'
                )
            )
        );

        $this->add(
            'email',
            new Email(
                array(
                    'message' => 'The e-mail is not valid'
                )
            )
        );
    }
}

Then initialize and use your own validator:

<?php

$validation = new MyValidation();

$messages = $validation->validate($_POST);
if (count($messages)) {
    foreach ($messages as $message) {
        echo $message, '<br>';
    }
}

验证器(Validators)

Phalcon的验证组件中内置了一些验证器:

下面的例子中展示了如何创建自定义的验证器:

<?php

use PhalconValidationMessage;
use PhalconValidationValidator;
use PhalconValidationValidatorInterface;

class IpValidator extends Validator implements ValidatorInterface
{
    /**
     * 执行验证
     *
     * @param PhalconValidation $validator
     * @param string $attribute
     * @return boolean
     */
    public function validate($validator, $attribute)
    {
        $value = $validator->getValue($attribute);

        if (!filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6)) {

            $message = $this->getOption('message');
            if (!$message) {
                $message = 'The IP is not valid';
            }

            $validator->appendMessage(new Message($message, $attribute, 'Ip'));

            return false;
        }

        return true;
    }
}

最重要的一点即是难证器要返回一个布尔值以标识验证是否成功:

验证信息(Validation Messages)

PhalconValidation 内置了一个消息子系统,这提供了一个非常好的验证消息回传机制,以便在验证结束后取得验证信息,比如失败原因等。

每个消息由一个 PhalconValidationMessage 类的实例构成。 验证过程产生的消息可以使用getMessages()方法取得。 每条消息都有一些扩展的信息组成比如产生错误的属性或消息的类型等:

<?php

$messages = $validation->validate();
if (count($messages)) {
    foreach ($validation->getMessages() as $message) {
        echo "Message: ", $message->getMessage(), "n";
        echo "Field: ", $message->getField(), "n";
        echo "Type: ", $message->getType(), "n";
    }
}

当然这里我们也可以对getMessages()方法进行重写, 以取得我们想要的信息:

<?php

use PhalconValidation;

class MyValidation extends Validation
{
    public function initialize()
    {
        // ...
    }

    public function getMessages()
    {
        $messages = array();
        foreach (parent::getMessages() as $message) {
            switch ($message->getType()) {
                case 'PresenceOf':
                    $messages[] = 'The field ' . $message->getField() . ' is mandatory';
                    break;
            }
        }

        return $messages;
    }
}

或我们也可以传送一个message参数以覆盖验证器中默认的信息:

<?php

use PhalconValidationValidatorEmail;

$validation->add(
    'email',
    new Email(
        array(
            'message' => 'The e-mail is not valid'
        )
    )
);

默认,getMessages()方法会返回在验证过程中所产生的信息。 我们可以使用filter()方法来过滤我们感兴趣的消息:

<?php

$messages = $validation->validate();
if (count($messages)) {
    // Filter only the messages generated for the field 'name'
    foreach ($validation->getMessages()->filter('name') as $message) {
        echo $message;
    }
}

过滤数据(Filtering of Data)

我们可以在数据被验证之前对其先进行过滤,以确保那些恶意的或不正确的数据不被验证。

<?php

use PhalconValidation;

$validation = new Validation();

$validation
    ->add('name', new PresenceOf(array(
        'message' => 'The name is required'
    )))
    ->add('email', new PresenceOf(array(
        'message' => 'The email is required'
    )));

// Filter any extra space
$validation->setFilters('name', 'trim');
$validation->setFilters('email', 'trim');

这里我们使用 filter: 组件进行过滤。 我们还可以使用自定义的或内置的过滤器。

验证事件(Validation Events)

当在类中执行验证时, 我们可以在beforeValidation或afterValidation方法(事件)中执行额外的检查,过滤,清理等工作。 如果beforeValidation方法返回了false 则验证会被中止:

<?php

use PhalconValidation;

class LoginValidation extends Validation
{
    public function initialize()
    {
        // ...
    }

    /**
     * 验证执行之前执行
     *
     * @param array $data
     * @param object $entity
     * @param PhalconValidationMessageGroup $messages
     * @return bool
     */
    public function beforeValidation($data, $entity, $messages)
    {
        if ($this->request->getHttpHost() != 'admin.mydomain.com') {
            $messages->appendMessage(new Message('Only users can log on in the administration domain'));

            return false;
        }

        return true;
    }

    /**
     * 验证之后执行
     *
     * @param array $data
     * @param object $entity
     * @param PhalconValidationMessageGroup $messages
     */
    public function afterValidation($data, $entity, $messages)
    {
        // ... Add additional messages or perform more validations
    }
}

取消验证(Cancelling Validations)

默认所有的验证器都会被执行,不管验证成功与否。 我们可以通过设置 cancelOnFail 参数为 true 来指定某个验证器验证失败时中止以后的所有验证:

<?php

use PhalconValidation;
use PhalconValidationValidatorRegex;
use PhalconValidationValidatorPresenceOf;

$validation = new Validation();

$validation
    ->add('telephone', new PresenceOf(array(
        'message' => 'The telephone is required',
        'cancelOnFail' => true
    )))
    ->add('telephone', new Regex(array(
        'message' => 'The telephone is required',
        'pattern' => '/+44 [0-9]+/'
    )))
    ->add('telephone', new StringLength(array(
        'messageMinimum' => 'The telephone is too short',
        'min'            => 2
    )));

第一个验证器中 cancelOnFail 参数设置为 true 则表示如果此验证器验证失败则验证链中接下的验证不会被执行。

我们可以在自定义的验证器中设置 cancelOnFail 为 true 来停止验证链:

<?php

use PhalconValidation;
use PhalconValidationMessage;
use PhalconValidationValidator;
use PhalconValidationValidatorInterface;

class MyValidator extends Validator implements ValidatorInterface
{
    /**
     * 执行验证
     *
     * @param PhalconValidation $validator
     * @param string $attribute
     * @return boolean
     */
    public function validate(Validation $validator, $attribute)
    {
        // If the attribute value is name we must stop the chain
        if ($attribute == 'name') {
            $validator->setOption('cancelOnFail', true);
        }

        // ...
    }
}

Avoid validate empty values

You can pass the option ‘allowEmpty’ to all the built-in validators to avoid the validation to be performed if an empty value is passed:

<?php

use PhalconValidation;
use PhalconValidationValidatorRegex;

$validation = new Validation();

$validation
    ->add('telephone', new Regex(array(
        'message' => 'The telephone is required',
        'pattern' => '/+44 [0-9]+/',
        'allowEmpty' => true
    )));
最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务