欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

phalcon 利用注解实现验证

程序员文章站 2022-04-01 17:35:31
...
phalcon 利用注解实现验证

为了精简验证参数的代码,做如下处理。(对Laravel 5 来说,这个功能是现成的,phalcon的话,需手工处理一下)

在注册服务时:

// 验证器事件。$di是FactoryDefault 对象。
$my_eventsManager = new EventsManager();
$my_eventsManager->attach( 'dispatch',new Annotation() );

$di->get("dispatcher")->setEventsManager($my_eventsManager);

主要代码:
<?php

namespace Apps\Validations;

use Apps\Exceptions\InvalidRequestException;
use Phalcon\Events\Event;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\User\Plugin;

/**
* 利用 注解 实现控制器请求参数验证。
*
*/
class Annotation extends Plugin
{
    /**
     * This event is executed before every route is executed in the dispatcher
     */
    public function beforeExecuteRoute(Event $event, Dispatcher $dispatcher)
    {
        // Parse the annotations in the method currently executed
        $annotations = $this->annotations->getMethod(
            $dispatcher->getControllerClass(),
            $dispatcher->getActiveMethod()
        );

        // Check if the method has an annotation 'Validation'
        if ($annotations->has('Validation')) {
            $annotation = $annotations->get('Validation');
            $class =trim($annotation->getNamedParameter('class'));
            $validation = new $class;
            $messages = $validation->validate($this->request->get());

            if (count($messages)) {
                foreach ($messages as $message) {
                    throw new InvalidRequestException($message);
                }
            }
        }
    }
}

异常代码
<?php

namespace Apps\Exceptions;

use Exception;


class InvalidRequestException extends Exception
{
    public function __construct(string $message = "", int $code = 400)
    {
        parent::__construct($message, $code);
    }
}

修改 public/index.php
try{
    /**
     * 定义项目目录
     */
    define('ROOT_PATH', dirname(__DIR__).'/');
    define('APPS_PATH', ROOT_PATH . 'apps/');

    $di = new \Phalcon\DI\FactoryDefault();
    require CONFIG_PATH . 'services.php';
    $application = new Application();
    $application->setDI($di);
    require CONFIG_PATH . 'modules.php';
    require  CONFIG_PATH . 'router.php';
    echo $application->handle()->getContent();
}catch(\Phalcon\Exception $e){
    echo "phalcon err";
}catch(\Apps\Exceptions\InvalidRequestException $e){
    echo "请求参数错误啦:".$e->getMessage();die;
}catch(PDOException $e){
    echo "err";
}


使用示例,带注解的方法:
<?php

namespace Apps\Api\Controllers;

use Apps\Common\Controllers\ControllerBase;

class TestValidateController extends ControllerBase
{
    /**
     * 这是一个测试用方法
     *
     * @Validation( class = "\Apps\Validations\TestValidation" )
     */
    public function indexAction()
    {
        echo "all ok4";
    }
}

使用示例:控制器验证,验证请求中一定有aa这个参数。
<?php
namespace Apps\Validations;

use Phalcon\Validation;
use Phalcon\Validation\Validator\Email;
use Phalcon\Validation\Validator\PresenceOf;

class TestValidation extends Validation
{
    public function initialize()
    {
         $this->add(
            'aa',
            new PresenceOf(
                [
                    'message' => 'aa必须有。',
                ]
            )
        );

    }
}